Qt:如何列出隐藏的windows?

Qt: How to list hidden windows?

我正在尝试从我的 main.cppshow() 一个隐藏的 MainWindow(实际上此时所有 windows 都被隐藏了)。我试过这样做:

QList<QWindow*> windows = QApplication::allWindows();
for (int i = 0; i < windows.size(); ++i) {
    if (windows.at(i)->objectName() == "MainWindow")
        windows.at(i)->show();
}

但是没用。

QApplication::allWidgets() 的 Qt 文档中有一个注释:

Note: Some of the widgets may be hidden.

就好像这个函数没有列出隐藏的小部件一样,我想这与 allWindows() 的情况相同,因为我在 windows 没有隐藏的情况下测试了这段代码并且它有效。

基本上在 void MainWindow::closeEvent 函数中我做的是:

    event->ignore();
    hide();

然后我希望能够在单击应用程序图标时重新打开主窗口。

有谁知道如何从 main.cpp 中显示隐藏的 window 或者可以指出我是否做错了什么?

编辑:这可能有效,我的问题出在完全不同的地方。

在Qt对象树中查找所有特定类型window的方法可以缩短:

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 在最后一个 window 关闭时不死机或关闭应用程序,请使用:

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);
    }
}

希望对您有所帮助。