我试图使用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 3.4上使用QMake 3.1、Qt5.8.0、g++ 5.4.0和Xfce 4.12。
发布于 2017-05-06 18:35:50
几点..。
首先,您没有使用传递给parent
ctor的OptionWindow
参数:您需要.
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上)。也许其他人可以参与进来,我会更新的。
https://stackoverflow.com/questions/43823628
复制相似问题