我正在创建一个带有这些标志的对话框窗口:
this->setWindowFlags(this->windowFlags() ^ Qt::WindowContextHelpButtonHint);
this->setWindowFlags(this->windowFlags() | Qt::WindowStaysOnTopHint);
ui.setupUi(this);
考虑到创建的对话框窗口按要求保持在顶部,这样可以正常工作。但是,对话框窗口还有一个复选框,其目的是让用户禁用其alwaysontop属性,为此,这些代码行存在于类构造函数中:
QObject::connect(ui.cbAlwaysOnTop, &QCheckBox::clicked, this, &SearchWindow::IsSetOnTop);
,功能是:
void IsSetOnTop() {
if (ui.cbAlwaysOnTop->checkState())
this->setWindowFlags(this->windowFlags() | Qt::WindowStaysOnTopHint);
else
this->setWindowFlags(this->windowFlags() ^ Qt::WindowStaysOnTopHint);//^ Qt::WindowStaysOnTopHint
}
问题是,只要取消选中复选框alwaysontop,窗口就会消失(看不再存在)。知道我做错了吗?
答案 0 :(得分:1)
在documented窗口上调用setWindowFlags()
,使窗口显示为hide:
此函数在更改窗口标志时调用
setParent()
,导致窗口小部件被隐藏。您必须致电show()
以再次显示小部件。
您只需在使用setWindowFlags()
后致电show()
,这是一个最小的例子:
#include <QtWidgets>
int main(int argc, char* argv[]){
QApplication a(argc, argv);
QWidget w;
QVBoxLayout layout(&w);
QCheckBox cb("always on top check box.");
layout.addWidget(&cb);
QObject::connect(&cb, &QCheckBox::toggled, &w, [&](){
if(cb.isChecked())
w.setWindowFlags(w.windowFlags() | Qt::WindowStaysOnTopHint);
else
w.setWindowFlags(w.windowFlags() & ~Qt::WindowStaysOnTopHint);
//call show() after changing window flags
w.show();
//^^^^^^^
});
w.show();
return a.exec();
}
请查看Window Flags Example,并注意show()
此处的lambda
电话。