2017-10-05 11 views
0

私はmain.cppから隠されたMainWindowをshow()にしようとしています(実際には、この時点ですべてのウィンドウが非表示になっています)。私はこのようなことをやってみた:Qt:隠されたウィンドウを一覧表示するには?

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のドキュメントで

注釈があります:

注:ウィジェットの一部が隠されてもよいです。

は、この関数は、非表示ウィジェットをリストアップしていなかったかのように、私は窓が隠されていないときに私は、コードのこの部分をテストし、それが働いていたので、それは、 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(); 
} 

findChildおよびfindChildrenは、任意のQObjectまたはQObjectのサブクラスで使用でき、子へのポインタを反映するために使用できます。あなたはそれをクローズする最後のウィンドウである場合は死ぬかのアプリケーションを閉じていないために、任意のQWidgetをしたい場合は

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

はまた、その後、使用:

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

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

qApp->setQuitOnLastWindowClosed(false); 

が、その後明示的にコードのどこかにqApp->close()を置く必要があります。

これに関連するもう1つのツールは、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'がポインタを見つけることができるように、メインウィンドウへのポインタを何らかの形で保存できますか?あなたのメインウィンドウのデストラクタにprintステートメントを置き、 'closeEvent'にprintステートメントを入れます。 – phyatt

+0

私は何が間違っているかを理解しました。これは前にこれについて考えることがない私の愚かでした。アプリをもう一度開こうとするたびに、実際には同じアプリの別のインスタンスを作成していました。アプリはミューテックスを使用していて、すでに実行しているアプリ内にそのアプリが既に開いているが、ウィンドウを作成していないというメッセージが表示されている場合は、リストされるウィンドウがないことは明らかです。とにかくおかげさまで@phyatt私はあなたの答えを正確に私の最初の質問に答えてそれをマークしています。 – madasionka

関連する問題