Qt - QDialog,QWidget實現模態及非模態(模態Widget不能有父窗口,如果設置無邊框就不能阻塞父窗口,但是可以強行設置指定Qt::Dialog,還可以setAttribute(Qt::WA_ShowModal),很多講究)good
阿新 • • 發佈:2017-11-30
col set print png 運行時 操作 qwidget 對話 idg 阻塞父窗口,所有祖先窗口及其子窗口
Qt::ApplicationModal 阻塞整個應用程序
看來,setModal()也就是使用setWindowModality()設置Qt::ApplicationModal參數也實現的模態。
如此,要實現QWidget的模態和非模態,只要調用setWindowModality()設置阻塞類型就好了:
在Qt中QDialog為“窗口”,而QWidget為“部件”,首先還是了解下《Qt 窗口與部件的概念》。
對於 QDialog 的模態及非模態是直接可以實現的,很多課本中都會提到,此處總結下。 模態QDialog 方式一:QDialog dlg(this);
dlg.exec();
QDialog *pDlg=new QDialog(this);
pDlg->setModal(true);
pDlg->show();
QDialog *pDlg=new QDialog(this); pDlg->show();
QWidget *pWid = new QWidget(this);
pWid->setWindowModality(Qt::ApplicationModal);
//pWid->setAttribute(Qt::WA_ShowModal, true);
pWid->show();
但是運行發現並未實現模態效果。這裏需要註意,當希望使用setWindowModality()將QWidget設置為模態時應該保證QWidget父部件為0,這裏修改QWidget *pWid = new QWidget(this);為QWidget *pWid = new QWidget(NULL);在運行就好了。
此外,通過setWindowModality()設置模態窗口並不是唯一方式,直接設置部件(或窗口)屬性也可以:
pWid->setAttribute(Qt::WA_ShowModal, true)
--------------- 還有很多地方需要註意,當創建QDialog後使用setWindowFlags(Qt::FramelessWindowHint);去掉標題欄時此對話框不再阻塞父窗口,如果需要實現阻塞效果可再次指定Qt::Dialog,即使用: setWindowFlags(Qt::Dialog | Qt::FramelessWindowHint); //這樣就會阻塞父窗口了! 但是,這樣會影響對話框的半透明(或透明)顯示。使用Qt::Dialog之前半透明顯示正常: 使用之後卻死活不行了: -- 不知道如何是好! -------------- 總而言之 是否是模態和QDialog 和QWidget都可以模態和非模態.exec(), show() 等函數無直接關系,只和窗口屬性有關,使用以下兩種方式都行: setAttribute(Qt::WA_ShowModal, true);//屬性設置 setWindowModality(Qt::ApplicationModal);//設置阻塞類型 ----------------- QDialog中的成員函數setModal(true)及exec()之所以是模態是因為他先設置了窗口屬性:setAttribute()再show()的(具體看源碼)!http://blog.163.com/dingmz_frcmyblog/blog/static/217304023201403105723594/
Qt - QDialog,QWidget實現模態及非模態(模態Widget不能有父窗口,如果設置無邊框就不能阻塞父窗口,但是可以強行設置指定Qt::Dialog,還可以setAttribute(Qt::WA_ShowModal),很多講究)good