2017-10-05 3 views
0

Ich versuche show() ein verstecktes MainWindow von meinem main.cpp (in der Tat sind alle Fenster an dieser Stelle versteckt). Ich habe versucht, etwas wie folgt:Qt: Wie versteckte Fenster auflisten?

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

Aber es funktioniert nicht.

In Qt-Dokumentation in QApplication::allWidgets() gibt es eine Anmerkung:

Hinweis: Einige der Widgets versteckt werden können.

Als ob diese Funktion Listing wurde nicht versteckt Widgets und ich nehme an, das ist der gleiche Fall mit allWindows(), weil ich dieses Stück Code getestet, wenn die Fenster nicht verdeckt sind und es funktionierte.

Grundsätzlich in der void MainWindow::closeEvent Funktion, die ich tun:

event->ignore(); 
    hide(); 

Und dann will ich in der Lage sein, die Hauptfenster wieder zu öffnen, wenn ich auf das Symbol der Anwendung klicken.

Hat jemand eine bessere Idee, wie man ein verstecktes Fenster von main.cpp zeigt oder kann zeigen, wenn ich etwas falsch mache?

edit: das funktioniert wohl, meine Ausgabe lag irgendwo total anders.

+1

Haben Sie versucht, Beispielcode hier: http://doc.qt.io/qt-5/qapplication.html#topLevelWidgets?Es sollte funktionieren, laut docs. – vahancho

+0

Interessant genug, es funktioniert auch nicht. – madasionka

+0

Aber das würde bedeuten, dass die Funktionen, die ich erwähnte, versteckte Dateien nur aus irgendeinem Grund auflisten, weil sie nicht so funktionieren, wie ich es in meinem Fall erwarten würde. – madasionka

Antwort

1

Das Verfahren zur kürzbar alle einer bestimmten Art Fenster in der Qt-Objektbaum zu finden:

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

Oder wenn Sie wissen, den Namen des QObject :

QMainWindow * w = qApp->findChild<QMainWindow *>("My Named MainWindow"); 
if(w) 
{ 
    qDebug() << "Found" << w->objectName() << "isVisible?" << w->isVisible(); 
} 

findChild und findChildren können für jedes QObject oder eine Unterklasse von QObject verwendet werden und können verwendet werden, um einen Zeiger auf einen ihrer untergeordneten Elemente auszugeben.

MyMainWindow * w = qApp->findChild<MyMainWindow *>(); 

Auch wenn Sie irgendeine QWidget wollen die Anwendung nicht sterben oder schließen, wenn es das letzte Fenster geschlossen werden soll, verwenden Sie dann:

w->setAttribute(Qt::WA_DeleteOnClose, false); 

http://doc.qt.io/qt-5/qguiapplication.html#quitOnLastWindowClosed-prop

qApp->setQuitOnLastWindowClosed(false); 

aber dann Sie müssen qApp->close() irgendwo in Ihrem Code explizit setzen.

Ein weiteres zugehöriges Werkzeug zu all dem ist qobject_cast; Ich verwende es gerne mit 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); 
    } 
} 

Hoffe, dass hilft.

+0

Danke @phyatt! Ihre Hilfe wird sehr geschätzt, aber irgendwie funktioniert es nicht für mich und ich weiß wirklich nicht warum. Grundsätzlich besteht das Problem darin, dass die Liste leer ist, obwohl ich nur das Hauptfenster ausgeblendet habe und die Anwendung noch läuft und wenn ich über die ausgeblendete Symbolleiste in der Taskleiste darauf zugreife, gehe ich zurück zum vorherigen Zustand, nicht neues Hauptfenster oder so etwas. – madasionka

+0

Es hört sich an, als würde 'deleteLater' irgendwie auf Ihrem Hauptfenster aufgerufen. Es kann sein, dass, weil kein anderes Objekt einen Zeiger darauf hat und Sie es nicht sichtbar haben, dass 'QEventLoop' es bereinigt hat. Können Sie den Zeiger auf andere Weise im Hauptfenster speichern, so dass das 'QMenuItem' oder' QAction' in der Taskleiste den Zeiger finden kann? Setzen Sie eine print-Anweisung in Ihr Destructor für Ihr Hauptfenster und fügen Sie eine print-Anweisung in Ihr 'closeEvent' ein. – phyatt

+0

Ich habe herausgefunden, was los war. Es war dumm von mir, vorher nicht darüber nachzudenken. Jedes Mal, wenn ich die App erneut öffnen wollte, erstellte ich gerade eine andere Instanz derselben App. Die App verwendet Mutex und wenn dort in einer App bereits läuft, wird nur eine Meldung angezeigt, dass die App bereits geöffnet ist, aber keine Fenster erstellt, so dass offensichtlich keine Fenster aufgelistet wurden. Anyways thanks a lot @phyatt Ich markiere deine Antwort so richtig, wie sie tatsächlich meine erste Frage beantwortet. – madasionka