2019年6月7日金曜日

【QT】ウィンドウを最前面に出す方法

ここ数年QTを仕事で使用しているんで、
ちょっとした詰まり処で分かったことも書いていっていいんじゃないかな…。


「もう、こんなんくだらないことだから出さなくていいよ」
みたいなことでも出していったらいいんじゃないかな。
たくさん出したらその中で一個か二個位は
役に立つもの出てくるもんじゃろ


で、QTのウィンドウを最前面に出すヤツ
C++とかMFCとかだとTopMostとかの設定で出来るヤツですね。
最近だとこの設定逆に邪魔だからなのか
あんまり見つかんなかったもんで、書いておこうと思います。


________________________________

どうすれば最前面に表示できる?


最前面に出すには該当のウィンドウに「setFlag」で
「Qt::WindowStaysOnTopHint」を有効にします。


分かれば簡単そうですね!


________________________________

フラグの種類



このフラグには他にウィンドウのスタイルを変更するとかの
設定を行うことが出来るみたいですね。


Qt::MsWindowsFixedSizeDialogHint

ウィンドウ境界線を表示する


Qt::FramelessWindowHint

フレームのないウィンドウにする


Qt::CustomizeWindowHint

タイトル部分の設定を無効にする


Qt::WindowTitleHint

ウィンドウのタイトル部分を追加(表示)する


Qt::WindowMinimizeButtonHint

ウィンドウの最小化ボタンを追加(表示)する
CustomizeWindowHintと使うと非活性になる


Qt::WindowMaximizeButtonHint

ウィンドウの最大化ボタンを追加(表示)する
CustomizeWindowHintと使うと非活性になる


Qt::WindowCloseButtonHint

ウィンドウの閉じるボタンを追加(表示)する


Qt::WindowSaysOnTopHint

ウィンドウが常に最前面で表示される


Qt::WindowSaysOnBottomHint

ウィンドウが常に最背面で表示される



________________________________

セットするWindowの取得方法


問題はどっから呼ぶのか、ですよね。
ここの情報がなかなか引っかからないもんで、詰まってしまいました。

QtのStaticメソッドから取得できるので、それを使用しましょう。


QApplication::AllWindowsからQtアプリケーションのウィンドウを取得できます。
MDIとかの場合だとここで幾つかウィンドウが取れるのだと思います(適当)
自分のはSDIなので0番目で取得してます。


QApplication::allWindows[ 0 ]->setFlag( Qt::WindowSaysOnTopHint, true );
QApplication::allWindows[ 0 ]->setWindowState( Qt::WindowActive );


「最前面表示」設定と「アクティブにする」設定を行うようにしました。



________________________________

セット時の詰まり処



始めはこれを違うところに入れて行っていまして、
なかなか思ったような動作になっていませんでした。


最前面に表示されねーじゃねーかとか思ってたんですが、
どうもこれ、アプリケーションのshow()とexec()の間で行う必要があるようです。


始めexec()しか使っておらず、実行時に表示されるようにしていたので、
設定が有効になっていなかったんですね。
というか、こんなのフォーラムにも書いてなかったけどな~
(setFlagsの方でなんかバグがあって正しく動かないみたいってのはあった)



app.show();
...(中略)
QApplication::allWindows[ 0 ]->setFlag( Qt::WindowSaysOnTopHint, true );
QApplication::allWindows[ 0 ]->setWindowState( Qt::WindowActive );
app.exec();


こんな感じでやるとexec()の後に
最前面で表示してくれます。



0 件のコメント:

コメントを投稿