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

Qt - minimizing and maximizing app without standard titlebar buttons

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

我该怎么做?

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

场景:

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

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

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

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

如果此方法不正确,我该如何根据 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