【问题标题】:Qt - minimizing and maximizing app without standard titlebar buttonsQt - 在没有标准标题栏按钮的情况下最小化和最大化应用程序
【发布时间】:2016-01-28 17:33:25
【问题描述】:

我有一个 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 上,应用程序图标在 Program Files 中被双击,或者可能是桌面快捷方式图标。如何获得取消隐藏的通知?

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

平台 - Qt 5.3.1,32 位。

【问题讨论】:

  • 你可以在接受最小化之前尝试saveGeometrysaveState,然后是restoreGeometryrestoreStatedoc.qt.io/qt-5/restoring-geometry.html
  • 你能给出一个示例代码,或者一个最小的工作示例吗?
  • 原则上它发生了一些事情,它应该被event(QEvent *ev)捕获,所以通过在你的QLabel这个方法中重新实现,你应该能够通过检查来查看附加内容和事件ev->type() 值。
  • 是的,问题是如何最小化它(而不是关闭它),以及如何在我所说的多个场景下恢复它。我仍然没有得到你。一个小的示例代码会很好..

标签: c++ qt minimize qmainwindow


【解决方案1】:

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

【讨论】:

  • 谢谢比比。一些指示会有所帮助,这对 1,2 和 3 有何帮助?这3种情况下代码连main.cpp都没有,怎么会在Launchpad点击图标时出现event方法?
  • 这是因为newappQApplication,它从桌面接收事件(这里是列表:doc.qt.io/qt-5/qevent.html#Type-enum)。然后由newapp 处理它(即隐藏或显示QLabel
  • 在我的情况下我应该寻找什么事件类型,即在应用程序中双击应用程序图标或在启动板中单击时?
  • 嗯,事实上有很多(如您在上面的链接中所见)。我发布的代码是找出哪个是哪个。一旦确定了这一点,就可以实现应用程序对此类信号的反应。请发布您的一些代码,以便我们快速找到答案。 (stackoverflow.com/help/how-to-ask)
  • 好的。我正在尝试QEvent::ApplicationActivate。到目前为止,它在 Mac 中工作,检测停靠图标点击以及启动板/应用程序点击。我会在 Windows 上试试。
猜你喜欢
  • 2020-10-24
  • 1970-01-01
  • 2011-03-13
  • 2014-10-04
  • 1970-01-01
  • 2016-01-07
  • 1970-01-01
  • 2021-11-20
  • 1970-01-01
相关资源
最近更新 更多