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隐藏的窗口或可以表明如果我做错了什么?

编辑:这可能有效,我的问题说谎完全不同。

+1

您是否尝试过示例代码:http://doc.qt.io/qt-5/qapplication.html#topLevelWidgets?根据文档,它应该有效。 – vahancho

+0

有趣的是它也不起作用。 – madasionka

+0

但是这表明我提到的那些函数只会列出隐藏文件,只是出于某种原因,它们不能像我期望的那样工作。 – madasionka

寻找在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(); 
} 

findChildfindChildren可用于任何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); 
    } 
} 

希望有所帮助。

+0

谢谢@phyatt!您的帮助非常感谢,但不知何故,它不适用于我,我真的不知道为什么。基本上问题是列表是空的,即使我所做的只是隐藏了主窗口,应用程序仍在运行,当我通过任务栏中的隐藏图标托盘访问它时,我会回到之前的状态而不是新的主窗口或像这样的东西。 – madasionka

+0

听起来好像'deleteLater'在你的主窗口被调用。这可能是因为没有其他对象有指向它的指针,并且你没有看到它,'QEventLoop'清理它。你能否以其他方式将指针存储到主窗口中,以便系统托盘中的'QMenuItem'或'QAction'可以找到指针?在你的主窗口的析构函数中放置一个打印语句,并在你的'closeEvent'中输入一个打印语句。 – phyatt

+0

我想通了什么是错的,我以前不去想这件事是愚蠢的。每次我想重新打开应用程序时,我实际上只是创建了同一应用程序的另一个实例。该应用程序使用互斥锁,如果在已经运行的应用程序中显示一条消息,说明该应用程序已经打开,但不会创建任何窗口,因此显然没有任何窗口被列出。无论如何感谢很多@phyatt我正在标记你的答案是正确的,因为它确实回答了我最初的问题。 – madasionka