我有一个带有几个窗口的应用程序。 每个窗口都是没有父级的QWidget。
我希望这些QWidget在应用程序的顶部,但不能在其他应用程序之上。 它就像Visual Studio中的窗口,例如,它们是免费的。它们不能被主窗口隐藏,但可以由其他应用程序隐藏。
我尝试使用 “setWindowFlags(Qt :: WindowStaysOnTopHint);” ,但它使QWidget保持在所有应用程序之上。
答案 0 :(得分:7)
使用SetWindowModality代替WindowStayOnTopHint,modal modes(Qt :: WindowModal和Qt :: ApplicationModal)允许其他应用程序位于模态窗口之上。
LE:您可以在QDialog的文档页面here
中详细了解 ApplicationModal 和 WindowModal 之间的区别LE 2:问题是你没有设置父级,所以为了解决这个问题,为每个子窗口(除主窗口之外的所有东西)设置了父级,一切都会按预期工作(子窗口将打开)父级的顶部,但不会在任何其他应用程序窗口之上):
int main(int argc, char** argv)
{
QApplication a(argc, argv);
QWidget w;
QVBoxLayout* layout = new QVBoxLayout(&w);
QPushButton* btn = new QPushButton("Show a non-modal window");
layout->addWidget(btn);
QWidget* mainWindow = &w;
QObject::connect(btn, &QPushButton::clicked, [mainWindow]()
{
QWidget* dlg = new QWidget(mainWindow);
QVBoxLayout* dlgLayout = new QVBoxLayout(dlg);
dlg->setWindowFlags(Qt::Window);
QLabel* lbl = new QLabel("Non-modal window...", dlg);
dlgLayout->addWidget(lbl);
dlg->show();
});
w.show();
return a.exec();
}
答案 1 :(得分:0)
我已经在Qt 5.3.0中使用和工作
setWindowFlags(Qt::FramelessWindowHint|Qt::NoDropShadowWindowHint| Qt::Window);
Qt :: Tool也可以用来代替QWindow
在调用之前也设置Parent。它会很好地工作
答案 2 :(得分:0)
这对我有用:
我有一个非模态QDialog,我想留在我的应用程序前面,但只有我的应用程序。 在显示对话框之前,我将应用程序的QMainWindow设置为其父级:
foreach( QWidget* p_widget, qApp->topLevelWidgets() )
{
if ( QMainWindow* p_main_window = qobject_cast<QMainWindow*>( p_widget ) )
{
m_p_settings_dialog->setParent( p_main_window );
}
}
然后我设置了标志:
m_p_settings_dialog->setWindowFlags( Qt::Window
| Qt::CustomizeWindowHint
| Qt::WindowTitleHint
| Qt::WindowCloseButtonHint );
然后我会显示对话框。
现在它对我来说完美无瑕。根本不需要设置Qt :: WindowStaysOnTopFlag。 祝你好运!