QDialog 不会保留在父 QMainWindow 之上



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

这样的答案表明,我会这样做Qdialog成为父母。它还提到设置Qt::Tool标志,但无法解决我的问题(上面的工作示例不使用它(。

其他答案建议使用QDockWidget,但它不符合我想要的视觉风格或预期的行为。

说到哪个,这是我对选项对话的期望:

  • 选项窗口应始终位于主窗口的顶部,而不是其他应用程序;
  • 只有主窗口显示在任务栏中;
  • 最小化主窗口还将选项窗口最小化,并还原它也还原选项窗口(在主窗口的顶部(;
  • 当选项窗口打开时,仍应启用主窗口。

我正在使用QMAKE 3.1,QT 5.8.0,G 5.4.0和XFCE 4.12在Linux Lite 3.4。

几个点...

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

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

我理解的问题,但是...其次,似乎您需要在 对show拨打QDialog之前确保在parent 上致电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。也许其他人可以进来,我会更新。

相关内容

  • 没有找到相关文章

最新更新