2017-05-06 67 views
1

我试图使用Qt创建一个选项对话框,该对话框位于程序的主窗口(这是一个QMainWindow)的顶部。 QDialog看起来非常合适,但点击主窗口会将其重新置于前面。然而,我设法做了两个微小的例子:一个有效,另一个不是(它来自我的实际应用)。我不知道这两个例子之间的行为有什么不同。QDialog不会停留在父级之上QMainWindow


在下面的例子中选项窗口停留在主窗口的顶部:

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 

选项w^indow在下面的例子确实在主窗口的顶部住宿:

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。

回答

1

几点...

首先,你不使用parent参数传递给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)。也许别人可以插入,我会更新。

+0

第一点:嗯,是的,这是我在尝试使示例尽可能小时犯的一个错误,对此感到抱歉。 第二点:**它的工作原理!**我仍然非常有兴趣阅读对此的解释,但在此期间,非常感谢。我很高兴接受了这个答案。 – juef

+0

看起来你的第二点与窗口管理器或Qt版本有关。 [此示例](https://pastebin.com/Jfs9352m)满足在Qt5.6.1/MSVC2013/Windows7上运行时所有OP的条件。我会尽可能在更多平台上尝试。 – Mike

+0

你一定是对的,因为这个例子不满足我的系统的条件。我编辑了我原来的帖子,添加了我在Linux Lite 3.4上使用Xfce 4.12。感谢您的评论。 – juef

相关问题