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 的解决方案。两者都不起作用。我当然可以隐藏应用程序,点击最小化按钮。问题是,如何通过标准机制恢复?
场景:
在 Mac 上,单击停靠栏图标。值得庆幸的是,OS X 本机 API 可以在单击停靠栏图标时给我一个通知,因此基于此,我可以取消隐藏小部件并将其激活。
在Mac,应用图标在/Applications
双击,或在Launchpad
点击。我如何收到这方面的通知?代码甚至没有到达 main.cpp
,如果它被隐藏,我可以从那里取消隐藏它。
在 Windows 上,单击任务栏中的应用程序图标(该应用程序没有托盘图标)。我如何收到通知并取消隐藏它?
在 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
我有一个 Qt 应用程序,其中只有一个小部件不是 MainWindow
,只是 QLabel
。它没有标题栏(通过 setWindowFlags(Qt::FramelessWindowHint)
获得),因此标准的最小化和最大化按钮不可用。但是在小部件的一侧有一个侧边栏,我们在其中提供了一个最小化按钮,该按钮的行为应与标准最小化按钮相同。
我该怎么做?
我尝试了 Minimizing a Qt application and Qt C++ minimize and maximize window 的解决方案。两者都不起作用。我当然可以隐藏应用程序,点击最小化按钮。问题是,如何通过标准机制恢复?
场景:
在 Mac 上,单击停靠栏图标。值得庆幸的是,OS X 本机 API 可以在单击停靠栏图标时给我一个通知,因此基于此,我可以取消隐藏小部件并将其激活。
在Mac,应用图标在
/Applications
双击,或在Launchpad
点击。我如何收到这方面的通知?代码甚至没有到达main.cpp
,如果它被隐藏,我可以从那里取消隐藏它。在 Windows 上,单击任务栏中的应用程序图标(该应用程序没有托盘图标)。我如何收到通知并取消隐藏它?
在 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