gpt4 book ai didi

c++ - QDialog 不会停留在父 QMainWindow 之上

转载 作者:行者123 更新时间:2023-11-30 03:31:55 26 4
gpt4 key购买 nike

我正在尝试使用 Qt 创建一个位于程序主窗口顶部的选项对话框(这是一个 QMainWindow)。 QDialog 似乎是一个完美的选择,但单击主窗口会将其带回最前面。但是,我已经设法制作了两个小示例:一个有效,另一个无效(源 self 的实际应用)。我不知道是什么让这两个示例的行为有所不同。


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

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,但它不符合我想要的视觉风格或预期的行为。

说到这里,这是我对选项对话框的期望:

  • 选项窗口应始终位于主窗口之上,而不是其他应用程序之上;
  • 只有主窗口显示在任务栏中;
  • 最小化主窗口也会最小化选项窗口,恢复主窗口也会恢复选项窗口(在主窗口之上);
  • The main window should still be enabled when the options window is open.

我在 Linux Lite 3.4 上使用 QMake 3.1、Qt 5.8.0、g++ 5.4.0 和 Xfce 4.12。

最佳答案

几点...

首先,您没有使用传递给 OptionWindow 构造函数的 parent 参数:您需要...

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 上)。也许其他人可以参与进来,我会更新。

关于c++ - QDialog 不会停留在父 QMainWindow 之上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43823628/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com