停留在窗口顶部的非模态QWidget对话框

时间:2017-09-22 11:27:45

标签: c++ qt qt5

我想要一个对话框,它停留在我的主窗口而不是其他窗口。我派生了一个类并添加了一些标志。如果我现在使用show()调用对话框,则会出现对话框并且只要我没有按下按钮或其他任何内容就会保持在最佳状态。然后对话框再次进入后台。

Dial::Dial(QWidget *parent) : QWidget(parent) 
{
  this->setWindowFlags(Qt::Tool | Qt::Dialog);
  // ...

因此,我查看了文件,发现了这个:

  

表示窗口小部件是工具窗口。工具窗口通常是一个   比平常标题栏和装饰小的小窗口,   通常用于工具按钮的集合。如果有父母,   工具窗口将始终保持在它之上。

令人高兴的是,我将这一行添加到我的单身人士中,创建了对话框。

d->mainWindow = new Foo();
d->dial->setParent(d->mainWindow);

现在,对话框只是嵌入到我的中央窗口小部件(QOpenGlWidget)中,不再是对话框了。不知何故,我似乎不理解文档告诉我的内容?如何让对话框保持在我的应用程序之上以及文档的含义是什么?

enter image description here

4 个答案:

答案 0 :(得分:2)

我无法重现您的问题。以下代码将生成QWidget,始终保持在QMainWindow之上:

#include "QApplication"
#include "QMainWindow"
#include "QLineEdit"
int main(int argc, char * argv[])
{
    QApplication a(argc, argv);

    QMainWindow w;
    w.show ();

    QWidget *pLineEdit = new QWidget(&w);
    pLineEdit->setWindowFlags(Qt::Tool | Qt::Dialog);
    pLineEdit->show ();

    a.exec ();
}

使用Qt 5.9测试。

答案 1 :(得分:1)

您需要设置窗口小部件的模态(documentation),如下所示:

QWidget *dialog = new QWidget(window, Qt::Dialog);
dialog->setWindowModality(Qt::ApplicationModal);
dialog->show();

但是,我建议您使用预配置的QDialog类,它会为您处理所有这些内容:

QDialog *dialog = new QDialog(window);
dialog->exec();

答案 2 :(得分:0)

不确定目前是否已经解决此问题,但是在构造对话框时可以尝试使用WindowStaysOnTopHint标志:

Qt::WindowFlags flags = this->windowFlags();
flags |= Qt::WindowStaysOnTopHint;
this->setWindowFlags(flags);

然后使用show()而不是exec()使其变为非模态:

dlg->show();

答案 3 :(得分:0)

使用QDialog代替QWidget,并在其构造函数中传递父控件

QDialog* pDlg = new QDialog(this);
pDlg->show();