在漫談qwidget及其派生類(三)中,我們已經知道:qmenubar和qstatusbar都是qwidget的派生類,所以我們可以像新增乙個qpushbutton一樣將它們任意放置到另乙個qwidget中。
繼續看個別的例子:
#includeint main(int argc, char *argv)
我們知道,qwidget本來就有乙個成員函式:
void qwidget::addaction ( qaction * action )
而此處只不過是qmenubar提供的過載版本:
qaction *qmenubar::addaction(const qstring &text)
可是同樣的東西,到了qmenubar中,就顯示出一種選單欄的效果了呢?
不同的widget,為什麼不一樣?我們都會自定義控制項,所以都熟悉:
void qmenubar::paintevent(qpaintevent *e)
看,無非是建立乙個qmenu,然後將該選單對應的qaction新增進來了。而這個qmenu,稍候可以通過對應的qaction的成員函式
qmenu * qaction::menu () const
來獲得
先看看qmenu,稍候再回來
qmenu 也是乙個qwidget的派生類
但是,為什麼qmenu長成這個樣子呢,一條一條的?
其實看了前面的qmenubar,我們對qmenu為什麼長這個樣子,應該不會感到任何驚奇了。
先新增一些qaction,然後在paintevent中遍歷action列表,並畫出乙個乙個矩形條。
void qmenu::paintevent(qpaintevent *e)
它做的工作:
而我們剛提到的exec()就是在popup的基礎上加了個事件迴圈
qaction *qmenu::exec(const qpoint &p, qaction *action){ qeventloop eventloop;
d->eventloop = &eventloop;
popup(p, action);
...
了解了上下文選單,我們可以回頭看看選單欄是如何控制選單顯示的。
一開始說了,
void qmenubarprivate::popupaction(qaction *action, bool activatefirst){ if(!action || !action->menu() || losepopupmode)
return;
activemenu = action->menu();
....
activemenu->popup(pos);
原始碼中,最長的一段就是在計算和調整選單的位置(以確保選單不會跑到螢幕外),即那個pos
漫談QWidget及其派生類 二
本文接下來試圖看看 qlayout 與視窗的幾何尺寸控制。注意 本文只是試 釋,qlayout其實沒有任何神秘的東西,它所有的功能離開它你也都可以做。但這並不是鼓勵大家不使用qlayout。始終記住一點 要改變乙個widget的大小,只有move resize setgeometry 這3個東西可用...
漫談QWidget及其派生類 二
本文接下來試圖看看 qlayout 與視窗的幾何尺寸控制。注意 本文只是試 釋,qlayout其實沒有任何神秘的東西,它所有的功能離開它你也都可以做。但這並不是鼓勵大家不使用qlayout。始終記住一點 要改變乙個widget的大小,只有move resize setgeometry 這3個東西可用...
漫談QWidget及其派生類 一
對於qwidget,總覺得該寫點什麼。可又不知道具體該寫些什麼,思路又亂又雜。簡單理理,簡單寫寫,就叫漫談吧 注意 本系列涉及到的東西都是qt使用者需要理解的,但是,我們不應該在實際專案中這麼用。qwidget 是qt中所有widget部件 比如qdialog qpushbutton qlabel ...