2017-10-05 231 views
0

我正在嘗試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

回答

1

尋找在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