【问题标题】:Qt Dialog Window disabling alwaysontop leads to window closingQt Dialog Window禁用alwaysontop导致窗口关闭
【发布时间】:2016-11-26 15:33:27
【问题描述】:

我正在使用这些标志创建一个对话窗口:

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 未选中,窗口就会消失(似乎它不再存在)。知道我做错了什么吗?

【问题讨论】:

  • 还是卡在这里,我问的问题不好吗?如果是这样,我应该添加哪些信息?

标签: c++ qt dialog


【解决方案1】:

在窗口上调用setWindowFlags()documented 使窗口变为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() 调用。

【讨论】:

  • 谢谢,确实是这个问题。
猜你喜欢
  • 2021-04-09
  • 1970-01-01
  • 1970-01-01
  • 2012-05-09
  • 2015-10-12
  • 1970-01-01
  • 2013-04-20
  • 2021-05-18
相关资源
最近更新 更多