閱讀567 返回首頁    go 技術社區[雲棲]


Qt局部界麵切換(qt 2.x)

前言


很多時候,我們都希望自己的界麵通過點擊不同的按鈕QPushbutton,來得到得到不同的界麵,從而實現局部界麵切換。

 

我這裏主要講的是嵌入式linux qt,目前,嵌入式當中,完美而且穩定的qt當屬qt 2.3(一般簡稱qt 2.x),而且,高版本的qt都很難移植到linux當中,一方麵是不穩定,另一方麵是移植起來相當的麻煩。Qt 4到現在為止,還沒有看到有人移植成功。

 

那麼,嵌入式linux qt中(以下簡稱Qt),有兩種方法可以達到點擊按鈕切換局部界麵的目的。

 

第一種,使用QTabDialog,使用QTabDialog的效果如下圖:

                                               

 

這種使用已經封裝好了的類來實現,比較直觀,也比較簡單,我在這裏就不贅述了。

可能QTabDialog還不能滿足我們的需要,我這裏重點講述第二種方法。

 

第二種方法:使用QWidgetStack類來實現。

我的演示程序界麵圖如下:

                                                

 

以這個界麵為例子。我們希望自己的界麵程序,通過點擊 左邊的按鈕:啟動,設置,網絡,停止,推出,右邊的空白區域從而切換到相應的界麵去。關於本實例的布局簡單的說下:最底層是一個QWidget,然後使用了QGridLayout。右邊的空白區域使用了gridLayout->addMultiCellWidget(),來實現合並Grid的目的。

 

主要實現的思想是:各個按鈕都對應了各自的一個QWidget,然後在最底層實現connect()來連接信號與插槽。

 

首先,看下頭文件:

 

#include <qapplication.h> #include <stdlib.h> #include <qtopia/qprocess.h> #include <qframe.h> #include <qpushbutton.h> #include <qthread.h> #include <qlabel.h> #include <qlayout.h> #include <qwidgetstack.h> #include "setWidget.h" #include "netWget.h" class SystemMain : public QWidget { Q_OBJECT public: SystemMain(QWidget *parent = 0, char *name = 0); public slots: void startAct(); void setAct(); void netAct(); void stopAct(); signals: //... private: QGridLayout *griLayout; //底層布局 QWidget *startWget; //啟動按鈕對應的切換界麵 QWidget *netWget;//網絡按鈕對應的切換界麵 QWidget *stopWget;//停止按鈕對應的切換界麵 SetWgetPan *setWget;//設置按鈕對應的切換界麵 QWidgetStack *dispArea; /*這個地方是整個局部界麵切換的核心,定義一個QWidget的棧,棧顧名思義,就是就是堆疊起來,多個QWidget堆疊起來*/ //即將使用的button按鈕 QPushButton *startButton, *setButton, *netButton, *stopButton, *exitButton; };

 

這裏的核心部分就是定義了也給 QWidgetStack  的對象,這裏,之所以會在底層QWidget頭文件中定義這些按鈕和相應的QWidget,就是為了實現按鈕和QWidget信號插槽的連接。

 

更具qt 2.3的 manpage中對QWidgetStack介紹如下:

 

The QWidgetStack class provides a stack of widgets, where the user can see only the top widget.
The application programmer can move any widget to the top of the stack at any time using the slot raiseWidget(), and add or remove widgets using addWidget() and removeWidget().

visibleWidget() is the get equivalent of raiseWidget(); it returns a pointer to the widget that is currently on the top of the stack.

QWidgetStack also provides the ability to manipulate widgets through application-specfied integer IDs, and to translate from widget pointers to IDs using id() and from IDs to widget pointers using widget(). These numeric IDs have and unique (per QWidgetStack, not globally) and cannot be -1, but apart from that QWidgetStack does not attach any meaning to them.

The default widget stack is frame-less and propagates its font and palette to all its children, but you can use the usual QFrame functions (like setFrameStyle()) to add a frame, and use setFontPropagation() and setPalettePropagation() to change the propagation style.

 

大致中文意思如下:

QWidgetStack類提供了一個隻有最上麵的窗口部件是用戶可視的窗口部件的棧。


應用程序程序員可以在任何時候使用raiseWidget()把任何一個窗口部件移到棧頂,並且使用addWidget()和removeWidget()來添加或者移除窗口部件。

visibleWidget()是raiseWidget()的獲取對應函數,它返回當前在棧頂的窗口部件的指針。

QWidgetStack也提供了通過應用程序指定的整數標識來維護這些窗口部件。你也可以使用id()來從窗口部件指針轉換到標識並且使用widget()來從標識轉換到窗口部件指針。這些數字標識是唯一的(每一個QWidgetStack,而不是全局的),但是QWidgetStack不會給它們添加額外的東西。

默認窗口部件棧是沒有框架的,但是你可以使用通常的QFrame函數(比如setFrameStyle())來添加一個框架。

QWidgetStack提供一個信號aboutToShow(),在一個被管理的窗口部件被顯示之前,這個信號被發射。

 

QWidgetStack 在任何情況下,這個QWidget棧中,隻能有最上麵的那個是可以顯示出來的,其餘的QWidget是影藏起來的。

我們要通過raiseWidget()來實現將某一個QWidget調出來顯示。

 

void QWidgetStack::raiseWidget ( QWidget * w ) [slot]

Raises w to the top of the widget stack.

void QWidgetStack::raiseWidget ( int id ) [slot]

Raises id to the top of the widget stack

這個是這一階段的關鍵。

 

 

startButton = new QPushButton(CHINESE_DISP(啟動), this); startButton->setBackgroundMode(QWidget::PaletteBase); griLayout->addWidget(startButton,0,0); setButton = new QPushButton(CHINESE_DISP(設置), this); griLayout->addWidget(setButton, 1,0); netButton = new QPushButton(CHINESE_DISP(網絡), this); griLayout->addWidget(netButton, 2,0); stopButton = new QPushButton(CHINESE_DISP(停止), this); griLayout->addWidget(stopButton, 3,0); exitButton = new QPushButton(CHINESE_DISP(退出), this); griLayout->addWidget(exitButton, 4,0); connect(exitButton, SIGNAL(clicked()),qApp, SLOT(quit())); connect(setButton, SIGNAL(clicked()), SLOT(setAct())); //按鈕與對應插槽的連接 connect(netButton, SIGNAL(clicked()), SLOT(netAct())); connect(stopButton, SIGNAL(clicked()), SLOT(stopAct())); } void SystemMain::stopAct()//停止按鈕對應的插槽 { dispArea->raiseWidget(stopWget); } void SystemMain::setAct()//設置按鈕對應的插槽 { dispArea->raiseWidget(setWget); } void SystemMain::netAct()//網絡按鈕對應的插槽 { dispArea->raiseWidget(netWget); }

 

上述代碼中CHINESE_DISP宏定義不用管,隻是為了能在linux顯示中文。

 

這一階段的核心處理就是通過connect()連接信號,以setButton為例子:

 

 

connect(setButton, SIGNAL(clicked()), SLOT(setAct()));

 

將setButton點擊之後的信號與setAct()函數連接。setAct()函數的就是使用了raiseWidget(),從而把相應的QWidget調出來顯示。

 

這裏各個按鈕對應的QWidget需要自己實現。比如setWget。

 


 

 

總結:

 

QWidgetStack

 

raiseWidget

 

connect()

 

這是實現局部界麵切換的核心函數。

 

 

 

 

 


版權申明:
轉載文章請注明原文出處https://blog.csdn.net/feiyinzilgd/archive/2010/03/15/5380093.aspx

並請聯係譚海燕本人或者前往譚海燕個人主頁留言

最後更新:2017-04-02 04:26:01

  上一篇:go magento -- 添加新產品時狀態默認為激活,庫存狀態默認為有庫存
  下一篇:go Aix related