如果需要讓一個窗口支持模態和非模態窗口,一般是需要將改窗口設置爲QDailog,
實現該功能的一個關鍵點是設置了setStyleSheet(Qt::Window),源碼如下:
Widget = 0x00000000,
Window = 0x00000001,
Dialog = 0x00000002 | Window,
如果需要讓一個窗口支持模態和非模態窗口,一般是需要將改窗口設置爲QDailog, 實現該功能的一個關鍵點是設置了setStyleSheet(Qt::Window),源碼如下: Widget = 0x00000000, Window = 0x00000001, Dialog = 0x00000002 | Window,
確實可以使用QDialog實現模態和非模態對話框的功能,還有其他方法實現類似的功能嗎,可以使用QWidget實現類似的效果嗎,可以使用QWidget實現窗口置頂且爲非模態對話框的功能,如果需求不要求是模態對話框,只需要窗口置頂和非模態窗口,可以使用QDialog實現類似的功能,也可以使用QWidget實現,QWidget本身默認是沒有這樣的功能的需要多做一些設置就可以實現了,可以設置QWidget::setWindowsFlags(this->windowsFlags() | Qt::Window),就可以有這樣的功能。 設置了Qt::Window標誌之後,窗口就具有一直置頂的功能,且爲非模態對話框的功能。所以如果需求是這樣的話,既可以使用QDialog實現,也可以使用QWindow實現,設置Qt::Window就可以了,不需要再設置窗口一直置頂等類似的windowFlags也可以實現非模態對話框且窗口置頂的功能。當然如果需求要求是模態對話框,建議還是用現成封裝好的QDialog就可以了。 如果需要實現模態對話框功能,但是窗口效果確實非模態的,可以使用QWidget,QWidget::setWindowsFlags(this->windowsFlags() | Qt::Window),就可以實現模態對話框的窗口效果,再加上使用 show(); 然後再彈出的非模態窗口的自定義確定取消按鈕做如下操作就可以了 void ColorDialog::okBtnClickedSlot() { m_buttonRole = Yes; if (m_pEvtLoop != NULL) { m_pEvtLoop->exit(); } this->hide(); }
void ColorDialog::cancelBtnClickedSlot() { m_buttonRole = No; if (m_pEvtLoop != NULL) { m_pEvtLoop->exit(); } this->hide(); }
|
確實可以使用QDialog實現模態和非模態對話框的功能,還有其他方法實現類似的功能嗎,可以使用QWidget實現類似的效果嗎,可以使用QWidget實現窗口置頂且爲非模態對話框的功能,如果需求不要求是模態對話框,只需要窗口置頂和非模態窗口,可以使用QDialog實現類似的功能,也可以使用QWidget實現,QWidget本身默認是沒有這樣的功能的需要多做一些設置就可以實現了,可以設置QWidget::setWindowsFlags(this->windowsFlags() | Qt::Window),就可以有這樣的功能。
設置了Qt::Window標誌之後,窗口就具有一直置頂的功能,且爲非模態對話框的功能。所以如果需求是這樣的話,既可以使用QDialog實現,也可以使用QWindow實現,設置Qt::Window就可以了,不需要再設置窗口一直置頂等類似的windowFlags也可以實現非模態對話框且窗口置頂的功能。當然如果需求要求是模態對話框,建議還是用現成封裝好的QDialog就可以了。
如果需要實現模態對話框功能,但是窗口效果確實非模態的,可以使用QWidget,QWidget::setWindowsFlags(this->windowsFlags() | Qt::Window),就可以實現模態對話框的窗口效果,再加上使用
show();
QEventLoop evtLoop;
m_pEvtLoop = &evtLoop;
evtLoop.exec();
然後再彈出的非模態窗口的自定義確定取消按鈕做如下操作就可以了
void ColorDialog::okBtnClickedSlot()
{
m_buttonRole = Yes;
if (m_pEvtLoop != NULL)
{
m_pEvtLoop->exit();
}
this->hide();
}
void ColorDialog::cancelBtnClickedSlot()
{
m_buttonRole = No;
if (m_pEvtLoop != NULL)
{
m_pEvtLoop->exit();
}
this->hide();
}