Qt:如何列出隐藏的windows?
Qt: How to list hidden windows?
我正在尝试从我的 main.cpp
中 show()
一个隐藏的 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();
}
findChild
和 findChildren
可用于任何 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);
}
}
希望对您有所帮助。
我正在尝试从我的 main.cpp
中 show()
一个隐藏的 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();
}
findChild
和 findChildren
可用于任何 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);
}
}
希望对您有所帮助。