我試圖使用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。
第一點:嗯,是的,這是我在嘗試使示例儘可能小時犯的一個錯誤,對此感到抱歉。 第二點:**它的工作原理!**我仍然非常有興趣閱讀對此的解釋,但在此期間,非常感謝。我很高興接受了這個答案。 – juef
看起來你的第二點與窗口管理器或Qt版本有關。 [此示例](https://pastebin.com/Jfs9352m)滿足在Qt5.6.1/MSVC2013/Windows7上運行時所有OP的條件。我會盡可能在更多平臺上嘗試。 – Mike
你一定是對的,因爲這個例子不滿足我的系統的條件。我編輯了我原來的帖子,添加了我在Linux Lite 3.4上使用Xfce 4.12。感謝您的評論。 – juef