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

时间:2016-01-28 17:33:25

标签: c++ qt minimize qmainwindow

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

我该怎么做?

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

方案:

  1. 在Mac上,单击停靠栏图标。值得庆幸的是,OS X本机API可以在单击停靠图标时向我发出通知,因此基于此,我可以取消隐藏窗口小部件并使其处于活动状态。

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

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

  4. 在Windows上,在“程序文件”中双击应用程序图标,或者可以是桌面快捷方式图标。如何取消通知以取消隐藏?

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

    平台 - Qt 5.3.1,32位。

1 个答案:

答案 0 :(得分:3)

这不是一个答案,但它可能有助于整理出哪些事件被触发(第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

中找到适合您的内容