漫談QWidget及其派生類 選單 選單欄

2021-08-26 07:47:54 字數 1528 閱讀 6429

在漫談qwidget及其派生類(三)中,我們已經知道:qmenubar和qstatusbar都是qwidget的派生類,所以我們可以像新增乙個qpushbutton一樣將它們任意放置到另乙個qwidget中。

繼續看個別的例子:

#include 

int 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 ...