我想要一个对话框,它停留在我的主窗口而不是其他窗口之上。我派生了一个类并添加了一些标志。如果我现在调用对话框,show()对话框出现并保持在顶部,只要我不按下按钮或其他任何东西。然后对话框再次进入后台。
Dial::Dial(QWidget *parent) : QWidget(parent)
{
this->setWindowFlags(Qt::Tool | Qt::Dialog);
// ...
Run Code Online (Sandbox Code Playgroud)
因此,我查看了文档并发现了这一点:
表示小部件是一个工具窗口。工具窗口通常是一个小窗口,带有比通常更小的标题栏和装饰,通常用于工具按钮的集合。如果有父级,工具窗口将始终保持在其顶部。
令人高兴的是,我将此行添加到创建对话框的单例中。
d->mainWindow = new Foo();
d->dial->setParent(d->mainWindow);
Run Code Online (Sandbox Code Playgroud)
现在对话框只是嵌入到我的中央小部件 ( QOpenGlWidget) 中,不再是对话框。不知何故,我似乎缺乏了解文档告诉我的内容?我怎样才能让对话框停留在我的应用程序之上,文档是什么意思?
我无法重现你的问题。以下代码将生成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 ();
}
Run Code Online (Sandbox Code Playgroud)
使用 Qt 5.9 进行测试。
您需要设置小部件的模式(文档),如下所示:
QWidget *dialog = new QWidget(window, Qt::Dialog);
dialog->setWindowModality(Qt::ApplicationModal);
dialog->show();
Run Code Online (Sandbox Code Playgroud)
但是,我建议使用预先配置的QDialog类,它可以为您处理所有这些事情:
QDialog *dialog = new QDialog(window);
dialog->exec();
Run Code Online (Sandbox Code Playgroud)