4

「show」機能がいつ終了するかを知らせる信号はありますか?

コードに問題があります:

QMainWinObj.show();
QMainWinObj.someGuiFunc();

コードが機能しません。しかし、私が書くと:

QMainWinObj.show();
sleep(3000);
QMainWinObj.someGuiFunc();

します。

したがって、問題は、「someGuiFunc」を呼び出す前に「show」がジャブを終了しないことだと思います。だからこそ、「ショー」が終わったというサインのようなものを持ちたい..

4

4 に答える 4

5

これは少し古いかもしれませんが、他の誰も答えていないので、「表示」信号がないため、次のように表示イベントをオーバーライドすることをお勧めします。

mainwindow.cpp ファイルで:

void MainWindow::show()
{
   QMainWindow::show();
   QApplication::processEvents();
   emit windowShown();
}

mainwindow.h ファイルで、MainWindow の宣言のどこかに:

...
class MainWindow: public QMainWindow
{
   ...
   signals:
       void windowShown();

   ...
}
...

次に、デザイナーに移動したら、メイン ウィンドウ (オブジェクト ツリーの一番上) を右クリックし、[シグナル/スロットの変更] を選択します。「Signals」フレームで、「+」ボタンをクリックします。「windowShown()」を追加し、Enter キーを押してから [OK] ボタンをクリックします (省略記号「...」は、他のコードを表すことに注意してください)。すでにヘッダーに含まれています)。

これで、シグナル/スロット エディターを使用して、いつでもスロットを「windowShown」シグナルにリンクできるようになりました。.NETで使用されていると思われるMicrosoftの「Loaded」イベントのようなものが必要な場合は、インスタンス変数を作成してフラグを立て、ウィンドウが表示されるたびに出力されないようにする必要があります。次に例を示します。

void MainWindow::show()
{
   QMainWindow::show();
   QApplication::processEvents();
   emit windowShown();
   if (firstTimeShown == true)
   {
      emit windowLoaded();
      firstTimeShown = false;
   }
}

また、コンストラクターで変数を「true」に初期化することを忘れないでください。

MainWindow::MainWindow(QObject* parent)
 ...
{
   firstTimeShown = true; // put this somewhere before ui->setupUi()
}

ただし、初期化子リストに入れることにした場合は、適切な順序であることを確認してください。クラスのヘッダーで宣言されているように、変数が上から下への方法でインスタンス化されていない場合、コンパイラは文句を言います。

ここで、ヘッダーで firstTimeShown を定義するときに、それを非公開にすることを確認してください。追加されたシグナルを忘れないでください。

class MainWindow : public QMainWindow
{
    ...
    signals:
      void windowLoaded();
      void windowShown();

    private:
      bool firstTimeShown;
    ...

それはそれについてです。シグナルとスロットの柔軟性により、Windows フォームまたは MFC から検出されるイベントを簡単に模倣できます。プログラマーの側で少し努力するだけです。コツをつかめば、それは第二の性質のようになります。

注: おそらく最適、または「Loaded」および「Shown」シグナルを実行するためのより適切で正確な方法がありますが、簡単にするために、このようなことは省略しました。手元の問題に戻ると、QApplication::processEvents() を呼び出すことは、ユーザーが他に 100 個のことを実行している場合にどれくらいの時間がかかるかを知っているため、一定の時間を待つ代わりにやりたいことである可能性が最も高いです。それの一番上などなど。お役に立てば幸いです。何かが完了するのを待つのではなく、やりたいことを行うためのより良い方法が得られることを期待して、追加の説明が含まれていました。はるかに優れた代替手段です。

于 2013-12-22T08:01:39.233 に答える
3

そのようなシグナルはありませんが、QMainWindow をサブクラス化すると、showEvent イベントをオーバーライドできます。

void MainWindow::showEvent(QShowEvent *){
    //your code
}

詳細はこちら: http://qt-project.org/doc/qt-4.8/qwidget.html#showEvent

ウィンドウが表示されるたびに呼び出されることに注意してください。

于 2013-04-08T16:35:02.363 に答える