QDialog 不会停留在父 QMainWindow 之上
QDialog won't stay on top of parent QMainWindow
我正在尝试使用 Qt 创建一个 选项对话框,该对话框位于程序主 window(即 QMainWindow)之上。 QDialog 似乎是一个完美的选择,但单击主 window 会将其带回最前面。但是,我已经设法制作了两个小示例:一个有效,另一个无效(源自我的实际应用)。我不知道是什么让这两个示例的行为有所不同。
以下示例中的选项 window 位于主要 window 之上:
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
以下示例中的选项 window 不 位于主要 window:
之上
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,但它不符合我想要的视觉风格或预期的行为。
说到这里,这是我对选项对话框的期望:
- 选项 window 应始终位于主要 window 之上,而不是其他应用程序之上;
- 只有主要 window 显示在任务栏中;
- 最小化主 window 也会最小化选项 window,还原它也会还原选项 window(在主 window 之上);
- 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
ctor 的 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;
};
那个我真的无法解释 -- 抱歉(虽然它可能是我的 window 经理的功能:fvwm -- 我在 Suse linux 使用 Qt5.8) .也许其他人可以参与进来,我会更新。
我正在尝试使用 Qt 创建一个 选项对话框,该对话框位于程序主 window(即 QMainWindow)之上。 QDialog 似乎是一个完美的选择,但单击主 window 会将其带回最前面。但是,我已经设法制作了两个小示例:一个有效,另一个无效(源自我的实际应用)。我不知道是什么让这两个示例的行为有所不同。
以下示例中的选项 window 位于主要 window 之上:
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
以下示例中的选项 window 不 位于主要 window:
之上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,但它不符合我想要的视觉风格或预期的行为。
说到这里,这是我对选项对话框的期望:
- 选项 window 应始终位于主要 window 之上,而不是其他应用程序之上;
- 只有主要 window 显示在任务栏中;
- 最小化主 window 也会最小化选项 window,还原它也会还原选项 window(在主 window 之上);
- 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
ctor 的 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;
};
那个我真的无法解释 -- 抱歉(虽然它可能是我的 window 经理的功能:fvwm -- 我在 Suse linux 使用 Qt5.8) .也许其他人可以参与进来,我会更新。