質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
Qt

QtはGUIプログラムの開発で広く使われているクロスプラットフォーム開発のフレームワークです。

ウィンドウ

コンピューター用語において、ウィンドウとはユーザとプログラムのやり取りを可能にするGUIの枠組みのことをいいます。

ダイアログ

ユーザーにウィンドウやボックス等の形で個別で表示されるフォームであり、ユーザーに判断を促す目的で表示される。ユーザーが見逃す事のないよう、操作中のフォーム上にポップアップして表示される。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Qt Creator

Qt Creatorは、Qtアプリケーションを開発するための開発統合環境(IDE)です。

Q&A

解決済

2回答

5431閲覧

qtを使用したC++でGUIのモードレスダイアログがメインウィンドウの後ろに表示される

nanananana

総合スコア13

Qt

QtはGUIプログラムの開発で広く使われているクロスプラットフォーム開発のフレームワークです。

ウィンドウ

コンピューター用語において、ウィンドウとはユーザとプログラムのやり取りを可能にするGUIの枠組みのことをいいます。

ダイアログ

ユーザーにウィンドウやボックス等の形で個別で表示されるフォームであり、ユーザーに判断を促す目的で表示される。ユーザーが見逃す事のないよう、操作中のフォーム上にポップアップして表示される。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Qt Creator

Qt Creatorは、Qtアプリケーションを開発するための開発統合環境(IDE)です。

0グッド

1クリップ

投稿2021/11/24 15:53

編集2021/11/25 01:44

前提・実現したいこと

qtを使用してC++でGUIの作成を行っています。
QMainWindowを継承してメインウィンドウを作成し、その中のボタン等で
QDalogを継承したダイアログ用の複数のサブウインドウを表示しています。
処理の途中で「処理を実行中です」と表示するメッセージウィンドウA(モードレスウインドウ)
を最前面に表示している最中に、メインウィンドウの「履歴」ボタンを押下すると、
処理履歴を表示する別のウィンドウB(モードレスウィンドウ)をウィンドウAの下、
メインウィンドウの上に表示したいです。

発生している問題・エラーメッセージ

上記の通り、メインウィンドウの処理でウィンドウAを最前面に表示した状態で、
ウィンドウBを表示させるとメインウィンドウの後ろに表示されてしまいます。
タスクバーから選択して押下すると、ウィンドウAの下、メインウィンドウの上に表示されるのですが、
最初から(ボタンを押下してウィンドウBを表示した際に)ウィンドウAの下、メインウィンドウの上に
表示させる方法はありますでしょうか?

試したこと

ウィンドウBをモードレスからモーダルにすると上記のようにウィンドウAの下、メインウィンドウの上に
表示されえるのですが、ウィンドウBを表示している最中にもほかのウィンドウを表示させたり、
メインウィンドウのタブの切り替え等をできるようにしたいため、理想の動作ではありません。
また、ウィンドウBを最前面に表示する設定にするのも、他のウィンドウを表示させる際に邪魔になるので
避けたいと思っています。

また、最前面に表示したウィンドウAがない場合は、正常にメインウィンドウの上に表示されます。
他のウィンドウで試しに最前面に表示しても同様の現象が起きたため、
あるウィンドウを最前面に表示した状態で、他のウィンドウを表示すると
後から表示したウィンドウがメインウィンドウの後ろに表示されるのだと思います。

補足情報(FW/ツールのバージョンなど)

G++ (GCC) 4.4.7
Linux(Red Hat 6.10)
qt 5.3.2

qtに関するこの情報が見当たらなかったため、解説等のあるリンクだけでも教えていただけますと幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

もう解決しているようですが、面白そうな(私が理解していない)のでコードを想像して試しました。nananananaさんの話からはそれるかもしれませんが念の為報告しておきます。

QWidget派生のMainWindowとウィンドウA、QDialog派生のウィンドウBを作りました。最初にウィンドウAを表示した後、MainWindowのBボタンを押してウィンドウBを表示させたところ、ウィンドウBはディスプレイ中央に表示されました。move()する必要がありませんでした。

ウィンドウBの表示方法はシンプルなので、nananananaさんのウィンドウBがディスプレイ中央に表示されないのは理由がわかりませんね。

c++

1void MainWindow::onButtonBClicked() 2{ 3 _windowB = new SubWindowB; // QDialog派生 4 _windowB->show(); 5 _windowA->raise(); // activateWindow()でも同じ結果 6}

投稿2021/11/28 12:05

jiro.kaihatsu

総合スコア16

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nanananana

2021/11/28 15:13 編集

自己解決しているにも関わらず回答頂きありがとうございます。 ウィンドウBの表示部分のソースコードはほぼ同じです。(私はmove()で画面中央に移動させていますが) メインウィンドウ、ウィンドウA(最前面に表示)を表示させた状態でウィンドウBを開いてますでしょうか? raise()をしなかった場合はメインウィンドウの下に表示されますでしょうか? お手数とは思いますがご回答いただけますと幸いです。
guest

0

show()でウィンドウBを表示した後に、activateWindow()を使用することで
ウィンドウAの下、メインウィンドウの上に表示することができました。
ただ、ウィンドウBのジオメトリが0,0に設定されているようで画面の中央に表示されません。
move()で中央に移動することはできるので解決はできますが、
原因が不明で、うーーん、、、もやもやする。
QDialogの仕様についてあまり詳しくないのですが、ジオメトリや画面表示の優先度?等に関する
パラメータ関係がリセットされているのだろうか。

どなたか原因がわかる方がいらっしゃったら教えていただきたいです。

投稿2021/11/25 05:20

nanananana

総合スコア13

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問