漫談QWidget及其派生類 一

2021-08-26 04:12:00 字數 2353 閱讀 7712

對於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個東西可用...