Qt:如何列出隐藏窗口?
我正在尝试show()
从我的main.cpp
隐藏的MainWindow(实际上所有窗口都隐藏在这一点上)。我试着做这样的事情:Qt:如何列出隐藏窗口?
QList<QWindow*> windows = QApplication::allWindows();
for (int i = 0; i < windows.size(); ++i) {
if (windows.at(i)->objectName() == "MainWindow")
windows.at(i)->show();
}
但它不起作用。
在Qt文档中QApplication::allWidgets()
有一个注释:
注:一些小部件可能会被隐藏。
仿佛这个功能并没有列出隐藏的小工具,我想这是相同的情况下与allWindows()
,因为我测试了这段代码窗口不隐藏时,它的工作。
基本上在void MainWindow::closeEvent
功能我做的:
event->ignore();
hide();
然后,我希望能够重新打开主窗口当我点击应用程序的图标。
有没有人有更好的主意如何显示从main.cpp
隐藏的窗口或可以表明如果我做错了什么?
编辑:这可能有效,我的问题说谎完全不同。
寻找在Qt对象树中的所有特定类型的窗口的方法可以缩短:
http://doc.qt.io/qt-5/qobject.html#findChildren
QList <QMainWindow *> mainWindows = qApp->findChildren<QMainWindow *>();
foreach(QMainWindow * w, mainWindows)
{
qDebug() << "Found a main window" << w->objectName()
<< "isVisible?" << w->isVisible();
}
http://doc.qt.io/qt-5/qobject.html#findChild
或者,如果你知道的QObject的名字:
QMainWindow * w = qApp->findChild<QMainWindow *>("My Named MainWindow");
if(w)
{
qDebug() << "Found" << w->objectName() << "isVisible?" << w->isVisible();
}
findChild
和findChildren
可用于任何QObject或QObject的子类,并可用于反射指向其任何子项的指针。
MyMainWindow * w = qApp->findChild<MyMainWindow *>();
此外,如果你想要的任何QWidget的不会死或关闭应用程序,如果它是要关闭的最后一个窗口,然后使用:
w->setAttribute(Qt::WA_DeleteOnClose, false);
http://doc.qt.io/qt-5/qguiapplication.html#quitOnLastWindowClosed-prop
qApp->setQuitOnLastWindowClosed(false);
但随后你必须明确地把qApp->close()
放在你的代码中。
所有这一切的另一个相关工具是qobject_cast
;我喜欢用它与QObject :: sender();
// some slot connected to by multiple sources
void mySlot()
{
QPushButton * b = qobject_cast<QPushButton *>(QObject::sender());
if(b)
{
qDebug() << "Push Button triggered" << Q_FUNC_INFO;
b->setText("Ouch");
b->setDisabled(true);
}
}
希望有所帮助。
谢谢@phyatt!您的帮助非常感谢,但不知何故,它不适用于我,我真的不知道为什么。基本上问题是列表是空的,即使我所做的只是隐藏了主窗口,应用程序仍在运行,当我通过任务栏中的隐藏图标托盘访问它时,我会回到之前的状态而不是新的主窗口或像这样的东西。 – madasionka
听起来好像'deleteLater'在你的主窗口被调用。这可能是因为没有其他对象有指向它的指针,并且你没有看到它,'QEventLoop'清理它。你能否以其他方式将指针存储到主窗口中,以便系统托盘中的'QMenuItem'或'QAction'可以找到指针?在你的主窗口的析构函数中放置一个打印语句,并在你的'closeEvent'中输入一个打印语句。 – phyatt
我想通了什么是错的,我以前不去想这件事是愚蠢的。每次我想重新打开应用程序时,我实际上只是创建了同一应用程序的另一个实例。该应用程序使用互斥锁,如果在已经运行的应用程序中显示一条消息,说明该应用程序已经打开,但不会创建任何窗口,因此显然没有任何窗口被列出。无论如何感谢很多@phyatt我正在标记你的答案是正确的,因为它确实回答了我最初的问题。 – madasionka
您是否尝试过示例代码:http://doc.qt.io/qt-5/qapplication.html#topLevelWidgets?根据文档,它应该有效。 – vahancho
有趣的是它也不起作用。 – madasionka
但是这表明我提到的那些函数只会列出隐藏文件,只是出于某种原因,它们不能像我期望的那样工作。 – madasionka