c++ - Qt - 在没有标准标题栏按钮的情况下最小化和最大化应用程序

标签 c++ qt minimize qmainwindow

我有一个 Qt 应用程序,其中只有一个不是 MainWindow 的小部件,只是一个 QLabel。它没有标题栏(通过 setWindowFlags(Qt::FramelessWindowHint) 获得),因此标准的最小化和最大化按钮不可用。但是在小部件的一侧有一个侧边栏,我们在其中提供了一个最小化按钮,该按钮的行为应与标准最小化按钮相同。

我该怎么做?

我在 Minimizing a Qt application 尝试了解决方案和 Qt C++ minimize and maximize window .两者都不起作用。我当然可以隐藏应用程序,点击最小化按钮。问题是,如何通过标准机制恢复?

场景:

  1. 在 Mac 上,单击 Dock 图标。值得庆幸的是,OS X native API 可以在单击停靠栏图标时给我一个通知,因此我可以基于此取消隐藏小部件并将其激活。

  2. 在 Mac 上,应用程序图标在 /Applications 中双击,或在 Launchpad 中单击。我如何收到这方面的通知?代码甚至没有到达 main.cpp,如果它被隐藏,我可以从那里取消隐藏。

  3. 在 Windows 上,单击任务栏中的应用程序图标(该应用程序没有托盘图标)。如何获得相关通知并取消隐藏?

  4. 在 Windows 上,可以在程序文件中双击应用程序图标,也可以是桌面快捷方式图标。我如何收到取消隐藏它的通知?

如果此方法不正确,我该如何在 Mac 和 Windows 上按照标准行为显示和隐藏应用程序?

平台 - Qt 5.3.1,32 位。

最佳答案

这不是答案,但它可能有助于找出触发了哪些事件(第 1、2 和 3 点)。

#include <QApplication>

class newapp : public QApplication {
    Q_OBJECT
public:
    newapp( int &argc, char **argv ) : QApplication(argc, argv) {}

protected:
    bool event(QEvent *ev) {
        std::cerr << "APPLICATION EVENT " << ev->type() << std::endl;
        return QApplication::event(ev);
    }
};

在你的 main.cc 中你将拥有

newapp myapp(argc,argv);

代替

QApplication myapp(argc,argv)

一旦你确定了触发的事件,你就快完成了:你需要告诉你 newapp 恢复 Qlabel 的大小(有很多方法可以做到这一点,所以提供你的实现,你可能会得到更有针对性的帮助)

对于第 4 点,这是由于操作系统之间的不同行为造成的,因为在 Windows 中,第二次双击一个应用程序,将启动该应用程序的另一个实例(在 OSx 上,它将引发第一个打开的应用程序)。你可能会在这个项目中找到适合你的东西HERE

关于c++ - Qt - 在没有标准标题栏按钮的情况下最小化和最大化应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35068155/

相关文章:

c++ - 贪吃蛇游戏——尾部运动

c++ - std::list,仅使用迭代器移动列表中的项目

linux - 用不同的语言运行 Qt 应用程序?

java - JPanel 仅在最小化框架和最大化框架之后加载。

java - 如何从 Java 最小化 JFrame 窗口?

c++ - 从 “LLONG_MAX seconds”构造一个std::chrono::毫秒变量时会发生什么?

c++ - 我如何在运行时确定是否有特定 C++ 异常类的 catch block ?

c++ - QMessageBox - url 编码/解码

c++ - 枚举没有命名类型

javascript - 点击时 highcharts div 调整为最小值和最大值