2017-05-06 101 views
1

我試圖使用Qt創建一個選項對話框,該對話框位於程序的主窗口(這是一個QMainWindow)的頂部。 QDialog看起來非常合適,但點擊主窗口會將其重新置於前面。然而,我設法做了兩個微小的例子:一個有效,另一個不是(它來自我的實際應用)。我不知道這兩個例子之間的行爲有什麼不同。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^indow在下面的例子確實在主窗口的頂部住宿:

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 

TestApp.pro

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

幾點...

首先,你不使用parent參數傳遞給OptionWindow構造函數:你需要......

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

這個問題我理解,但......其次,看來你需要確保你在之前的母公司上調用show,調用show而不是QDialog

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

那一個我真的不能解釋 - 對不起(儘管它可能是我的窗口管理器的功能:FVWM - 我在使用Qt5.8 SUSE LINUX)。也許別人可以插入,我會更新。

+0

第一點:嗯,是的,這是我在嘗試使示例儘可能小時犯的一個錯誤,對此感到抱歉。 第二點:**它的工作原理!**我仍然非常有興趣閱讀對此的解釋,但在此期間,非常感謝。我很高興接受了這個答案。 – juef

+0

看起來你的第二點與窗口管理器或Qt版本有關。 [此示例](https://pastebin.com/Jfs9352m)滿足在Qt5.6.1/MSVC2013/Windows7上運行時所有OP的條件。我會盡可能在更多平臺上嘗試。 – Mike

+0

你一定是對的,因爲這個例子不滿足我的系統的條件。我編輯了我原來的帖子,添加了我在Linux Lite 3.4上使用Xfce 4.12。感謝您的評論。 – juef

相關問題