2016-11-26 103 views
0

我創建一個對話框窗口與標誌:Qt的對話窗口禁用alwaysontop導致窗口關閉

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 
} 

問題是,只要checkbox alwaysontop沒有被選中,窗口就會消失(最終它不再存在)。任何想法我做錯了什麼?

+0

仍然卡在這裏,我不正確地問我的問題嗎?如果是的話,我應該添加哪些信息? –

回答

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()呼叫那裏。

+0

謝謝,這確實是問題所在。 –