QDialog不会留在父母QMainWindow

时间:2017-05-06 17:51:22

标签: c++ qt qmainwindow qdialog

我尝试使用Qt创建一个选项对话框,该对话框保留在程序的主窗口(这是一个QMainWindow)之上。 QDialog看起来非常合适,但是点击主窗口会将它带回到前面。但是,我设法制作了两个小例子:一个有用,另一个没有(从我的实际应用中派生出来)。我不知道是什么导致这两个例子之间的行为不同。

以下示例中的选项窗口位于主窗口的顶部:

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

以下示例中的选项窗口保持在主窗口的顶部:

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 个答案:

答案 0 :(得分:2)

有几点......

首先,您未使用传递给parent ctor的OptionWindow参数:您需要...

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

我明白这个问题,但是......其次,您需要确保在调用showshow之前调用父上的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上)。也许其他人可以填写并且我会更新。