2017-07-07 10 views
0

私は2つのトップレベルウィンドウ(親ウィジェットを持たない)を持つアプリケーションを持っています。これらは互いに独立しており、彼らの間で彼らはいつでも切り替えることができます。しかし、これらのウィンドウの1つがdlg.exec()を呼び出すことによってモーダルダイアログを開くと、他のウィンドウもブロックされます。ユーザーはまったく切り替えることはできません。私はdlg.setWindowModality(Qt::WindowModal)とその後のdlg.show()でモーダルダイアログを作成することができましたが、彼はダイアログを表示し、ダイアログからの戻り値を待たずに続行します。したがって、モーダルダイアログの結果を処理したい場合(通常、ファイルのダイアログを開く/保存するなど、いくつかの情報を照会するなど)、ダイアログの結果を処理する機能を他の機能(ダイアログを開いたもの以外)アドホック信号/スロット接続、コールバックを使用するか、またはダイアログ自体に結果を処理する方法を教えてください。これは私の見解では悪い設計です。ファイルダイアログなどのダイアログに組み込まれていると、特に難しいです。他の1つをブロックすることなく複数のトップレベルウィンドウとモーダルダイアログ

私の質問は、Qtには2つのトップレベルウィンドウがあり、ユーザーは自由に切り替えることができます。同時に、 dlg.exec()のようなモーダルダイアログを開くことができます。これは、1つのウィンドウしかブロックせず、ダイアログ結果を待っていますが、他のウィンドウをブロックしませんか?私はそれが可能ではないと思うが、多分私は何かを逃した。私は、例えば糸で魔法を、そして私には知られていない QEventLoopを意味していますか?私が知っている限り、ウィジェットはメインスレッドに存在しなければなりません。これはスレッドを使用したい場合、この場合の少し問題です。

PS:私が必要とするものをより良く理解できるように、Excelを想像してみてください一方のウィンドウではVBエディタ、他方のウィンドウではVBエディタを使用します。ユーザーはいつでもVBに切り替えることができます。

答えて

0

QDialog::exec()を使用して動作します。ここで

は実施例である:

main.cppに

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    MainWindow w; 
    w.show(); 

    MainWindow w2; 
    w2.show(); 

    return a.exec(); 
} 

mainwindow.cpp

// I skipped the rest of the code as it is just the template code from Qt Creator template project. 
void MainWindow::on_pushButton_clicked() // mainwindow.ui creates a QPushButton named "pushButton" 
{ 
    QMessageBox mb(this); 
    mb.setModal(true); 
    mb.setWindowModality(Qt::WindowModal); 
    mb.exec(); 
} 

それは2つのウィンドウを開き、私は独立にかかわらず、両方と対話することができますもう一方のQMessageBoxが開いているかどうかを調べます。

+0

あなたが正しいです、それは私の必要に応じて動作します!私は愚かです、私は 'exec()'と 'Qt :: WindowModal'との組み合わせを試しませんでした。 'exec()'が呼ばれるときのデフォルトのダイアログモダリティは 'Qt :: ApplicationModal'ですが、変更可能です。 –

関連する問題