【问题标题】:QDialog won't stay on top of parent QMainWindowQDialog 不会停留在父 QMainWindow 之上
【发布时间】:2017-05-06 17:51:22
【问题描述】:

我正在尝试使用 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。

【问题讨论】:

    标签: c++ qt qmainwindow qdialog


    【解决方案1】:

    几点...

    首先,您没有使用传递给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;
    };
    

    我无法真正解释那个——抱歉(虽然它可能是我的窗口管理器的一个功能:fvwm——我在使用 Qt5.8 的 Suse linux 上)。也许其他人可以加入,我会更新。

    【讨论】:

    • 第一点:啊,是的,这是我在尝试使示例尽可能小时犯的一个错误,对此感到抱歉。第二点:它有效!我仍然非常有兴趣阅读对此的解释,但与此同时,非常感谢你。我很乐意接受这个答案。
    • 看起来你的第二点与窗口管理器或Qt版本有关。 this example 在 Qt5.6.1/MSVC2013/Windows7 上运行时满足所有 OP 的条件。我会尽可能在更多平台上尝试。
    • 你一定是对的,因为这个例子不满足我系统上的条件。我编辑了我的原始帖子以添加我在 Linux Lite 3.4 上使用 Xfce 4.12。感谢您的评论。
    猜你喜欢
    • 1970-01-01
    • 2018-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-24
    • 1970-01-01
    • 2015-10-18
    相关资源
    最近更新 更多