2017-05-06 2 views
1

私はオプションダイアログをプログラムのメインウィンドウ(これはQMainWindowです)の上にとどめるためにQtを使用しようとしています。 QDialogは完璧なフィット感のようでしたが、メインウィンドウをクリックすると前面に戻ります。しかし、私は2つの小さな例を作ることができました:一つは動作し、もう一つは(私の実際のアプリケーションから派生しています)です。私はこれらの2つの例の間で何が違うのかを知りません。QDialogは親のQMainWindowの上にとどまりません


次の例のオプションウィンドウは、メインウィンドウの上部にとどまる:

test.cpp

#include <QApplication> 
#include <QMainWindow> 
#include <QDialog> 

int main(int argc, char *argv[]) 
{ 
    QApplication test(argc, argv); 
    QMainWindow *mainWindow = new QMainWindow; 
    mainWindow->show(); 

    QDialog * optionsWindow = new QDialog(mainWindow); 
    optionsWindow->show(); 

    return test.exec(); 
} 

test.pro

TEMPLATE = app 
TARGET = test 
INCLUDEPATH += . 
QT = core gui widgets 

SOURCES += test.cpp 

オプションのw

TestApp.cpp

#include <QApplication> 
#include "MainWindow.hpp" 

int main(int argc, char *argv[]) 
{ 
     QApplication testAppGUI(argc, argv); 

     MainWindow *mainWindow = new MainWindow(); 
     mainWindow->show(); 

     return testAppGUI.exec(); 
} 

MainWindow.hpp

#ifndef MAINWINDOW_HPP 
#define MAINWINDOW_HPP 

#include <QMainWindow> 
#include "OptionWindow.hpp" 

class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 
    public: 
     explicit MainWindow(QWidget *parent = 0) 
     { 
      optionWindow = new OptionWindow(this); 
      optionWindow->show(); 
     } 
     OptionWindow *optionWindow; 
}; 

#endif 

OptionsWindow.hpp

#ifndef OPTIONWINDOW_HPP 
#define OPTIONWINDOW_HPP 

#include <QDialog> 

class OptionWindow : public QDialog 
{ 
    Q_OBJECT 
    public: 
     explicit OptionWindow(QWidget *parent = 0){} 
}; 

#endif 

次の例ではindowは、メインウィンドウの上部にない滞在を行います

TEMPLATE = app 
TARGET = TestApp 
INCLUDEPATH += . 

QT = core gui widgets 

HEADERS += MainWindow.hpp \ 
      OptionWindow.hpp 

SOURCES += TestApp.cpp 

This SO answer QDialogに私は親を与える示唆しています。 Qt::Toolフラグの設定についても言及していますが、私の問題は解決できませんでした(上記の動作例では使用していません)。

This other answerは、QDockWidgetの使用を提案していますが、私の望むビジュアルスタイルや予想される動作を満たしていません。

言えば、ここで私は私のオプション]ダイアログボックスの期待するものです。

  • オプションウィンドウは常にメインウィンドウの上にではなく、他のアプリケーションである必要があります。
  • メインウィンドウのみがタスクバーに表示されます。
  • メインウィンドウを最小化するとオプションウィンドウも最小限に抑えられ、復元するとオプションウィンドウ(メインウィンドウの上部)も復元されます。
  • オプションウィンドウが開いている場合でも、メインウィンドウは有効なはずです。

Linux Lite 3.4では、QMake 3.1、Qt 5.8.0、g ++ 5.4.0、Xfce 4.12を使用しています。

答えて

1

2点...

まず、あなたがOptionWindow CTORに渡されたparentパラメータを使用していない:私は理解していることを問題は...あなたは必要

class OptionWindow: public QDialog { 
    Q_OBJECT; 
public: 
    explicit OptionWindow (QWidget *parent = nullptr) 
    : QDialog(parent) /* <-- Added */ 
    {} 
}; 

をしかし...第二に、あなたが確認する必要があります表示されます親showの前に呼び出し、QDialogに対してshowを呼び出します。申し訳ありません -

class MainWindow: public QMainWindow { 
    Q_OBJECT; 
public: 
    explicit MainWindow (QWidget *parent = nullptr) 
    { 
     optionWindow = new OptionWindow(this); 
     show(); /* <-- Added */ 
     optionWindow->show(); 
    } 
    OptionWindow *optionWindow; 
}; 

私は本当に説明できない1こと(それは私のウィンドウマネージャの機能することができるが:fvwmの - 私はQt5.8を使用してSUSE LINUX上でです)。他の誰かがチップをつけて、私が更新してくれるかもしれない。

+0

最初の点:ああ、はい、これは私が可能な限り小さな例を作ろうとしたときに間違いです。残念です。 2点目:**動作します!**私はまだこの説明を読むことに非常に関心がありますが、その間に、ありがとうございます。私はこの答えを喜んで受け入れました。 – juef

+0

2番目のポイントは、ウィンドウマネージャまたはQtバージョンに関連しているようです。 [この例](https://pastebin.com/Jfs9352m)は、Qt5.6.1/MSVC2013/Windows7上で実行された場合、すべてのOP条件を満たします。できるだけ多くのプラットフォームで試してみます。 – Mike

+0

この例は私のシステム上の条件を満たしていないので、あなたは正しくなければなりません。元の記事を編集して、Linux Lite 3.4でXfce 4.12を使用していることを追加しました。ご意見ありがとうございます。 – juef

関連する問題