對於qwidget,總覺得該寫點什麼。可又不知道具體該寫些什麼,思路又亂又雜。簡單理理,簡單寫寫,就叫漫談吧
注意:本系列涉及到的東西都是qt使用者需要理解的,但是,我們不應該在實際專案中這麼用。
qwidget 是qt中所有widget部件(比如qdialog、qpushbutton、qlabel)的基類。
比如:qdialog有模態非模態之說
qwidget 有沒有?當然有,不要懷疑
qdialog dlg(this)是乙個視窗
qwidget wgt(this)能不能是視窗?當然行
qmainwindow可以有選單欄、工具欄等
qwidget 可不可以加?當然可以,只要你需要
......
qt中的部件有window和普通widget之說:
window視窗
window是這樣的widget:它不是其他widget的一部分區域,通常有標題欄等視窗裝飾器!(和是否有parent無關)
widget
普通部件(非視窗)
除window外的部件
如何可以知道乙個widget是否是window?注意:qwidget::iswindow()
inline bool qwidget::iswindow() const
呵呵,不小心將原始碼給出了,那就繼續吧,
windowtype() 是什麼東西?為了避免混亂,我將它和windowflags()同等看待(其中的細微區別不會影響我們的分析)
看看下面的函式:
qwidget::qwidget(qwidget * parent = 0, qt::windowflags f = 0 )void qwidget::setwindowflags(qt::windowflags type )
qdialog::qdialog(qwidget * parent = 0, qt::windowflags f = 0 )
...
恩,你可以通過建構函式或者成員函式setwindowflags傳遞這個引數。而且,你從前面的iswindow()的原始碼可以得出結論:乙個widget是不是乙個window,只取決於它的的windowflags中是否包含qt::window
你會不會說:不對!!!
比如:乙個qpushbutton,如果沒有parent,它就是乙個視窗。而設定了parent,它卻不是乙個視窗了。分明就是和是否有parent相關嘛!(這種例子太常見了,對吧)
恩,再看乙個很多人迷惑的例子:在乙個函式內
void widget::on***x()
如果用 qdialog,則會出現乙個視窗,而如果用 qwidget,則不會出現視窗(而是乙個普通部件)。為什麼啊?都有parent啊?為什麼會這樣??
其實:例子一是特例,原因就是前面提到的,是否是視窗取決於flags,而不是有無parent
記住前面的黑體部分!
對於qwidget,如果其parent為空,構造時會有下面的動作:
uint type = (flags & qt::windowtype_mask);if ((type == qt::widget || type == qt::subwindow) && w && !w->parent())
注意看,如果乙個widget沒有parent,且沒有qt::window標記,會被強制設定該標記(如果有parent,就不會設定標記了)。這就是parent的影響,也是上面例子一的答案。
可是第二個例子怎麼回事?qdialog預設的flags也是0啊,也就parent,為啥還是視窗呢??
qdialog::qdialog(qwidget *parent, qt::windowflags f): qwidget(*new qdialogprivate, parent,
f | ((f & qt::windowtype_mask) == 0 ? qt::dialog : qt::windowtype(0)))
{...
答案很簡單,qdialog是派生類嘛,它建構函式中傳給基類的引數包含了qt::dailog(即0x00000002|qt::window)。既然包含了qt::widnow標記,當然就和是否有parent無關嘍!(例子一其實才是特例,只不過大家見的多了,反倒習以為常了)
感興趣的看看,會有什麼結果,嘿嘿,本節完
qpushbutton * btn = new qpushbutton(this);btn->setwindowflags(qt::window);
漫談QWidget及其派生類 一
對於qwidget,總覺得該寫點什麼。可又不知道具體該寫些什麼,思路又亂又雜。簡單理理,簡單寫寫,就叫漫談吧 注意 本系列涉及到的東西都是qt使用者需要理解的,但是,我們不應該在實際專案中這麼用。qwidget 是qt中所有widget部件 比如qdialog qpushbutton qlabel ...
漫談QWidget及其派生類 二
本文接下來試圖看看 qlayout 與視窗的幾何尺寸控制。注意 本文只是試 釋,qlayout其實沒有任何神秘的東西,它所有的功能離開它你也都可以做。但這並不是鼓勵大家不使用qlayout。始終記住一點 要改變乙個widget的大小,只有move resize setgeometry 這3個東西可用...
漫談QWidget及其派生類 二
本文接下來試圖看看 qlayout 與視窗的幾何尺寸控制。注意 本文只是試 釋,qlayout其實沒有任何神秘的東西,它所有的功能離開它你也都可以做。但這並不是鼓勵大家不使用qlayout。始終記住一點 要改變乙個widget的大小,只有move resize setgeometry 這3個東西可用...