QT庫結構
Qt圖形庫是一個組織嚴謹的C++類庫,其結構如圖所示
細說Qt庫
Qt類庫中包含了上百個類,結構十分復雜,上圖展示了Qt_3.2類庫的基本結構。
Qt類庫中的類可以分成兩種類型:
-
一種是直接或者繼承自Qt類
-
另一種是獨立的,不從任何類集成
獨立的類在Qt庫中一般用來完成獨立的功能,例如操作XML文件的QXmlReader類。
直接從從Qt類繼承的類主要可以分成QObject類和QEvent類。QObject類是所有應用組件的基類,QEvent類是所有QT事件響應類的基類。其他的還有QCursor、QPen、QTab等類描述的窗口組件可以在窗體的任意地方出現,因此直接從Qt基類繼承。
QWidget類是組件容器,所有可以結合在一起的組件都從該類繼承。QWidget類繼承自QObject類,因為所有的窗體組件都是應用組件的一部分。
Qt類庫組織合理,在使用的時候按照類的集成關系操作。如QButton、QSlider等組件可以被加入到QWidget對象中,而QProcess、QTimer組件是不能加入到QWidget對象中的。
示例效果
工程源碼
/* *功能:滑動Slider控件的滑塊時,Spin控件的數值相應改變。同樣的,在修改Spin控件值的時候,Slider控件的數值也相應變化 */ #include <qapplication.h> #include <qpushbutton.h> #include <qlayout.h> #include <qslider.h> #include <qspinbox.h> #include <qwidget.h> class MyWidget : public QWidget { public: MyWidget(QWidget *parent=0); //聲明MyWidget類的構造函數 }; //注意分號 MyWidget::MyWidget(QWidget *parent):QWidget(parent) { QSpinBox *agenum_sb=new QSpinBox(); agenum_sb->setRange(0,100); agenum_sb->setValue(0); QSlider *agenum_sl=new QSlider(Qt::Horizontal); agenum_sl->setRange(0,100); agenum_sl->setValue(0); connect(agenum_sb,SIGNAL(valueChanged(int)),agenum_sl,SLOT(setValue(int))); //設置Spin控件修改數值響應函數,將Spin控件改變數值的事件與Slider控件關聯 connect(agenum_sl,SIGNAL(valueChanged(int)),agenum_sb,SLOT(setValue(int))); //設置SLider控件修改數值響應函數,將Slider控件改變數值的事件與Spin控件關聯 QHBoxLayout *layout=new QHBoxLayout; //創建列布局的對象 layout->addWidget(agenum_sb); layout->addWidget(agenum_sl); setLayout(layout); //設置MyWidget使用列布局 setWindowTitle("Enter a number By-Mystery"); //設置窗體標題 } int main(int argc, char *argv[]) { QApplication app(argc, argv); MyWidget widget; widget.show(); return app.exec(); }
Qt中信號與槽系統
源碼中的connect()函數原型為:connect(boject1, signal, object2, slot);
其中,Object1和Object2分別代表兩個不同的Qt對象(繼承自QObject基類),signal代表Object的信號,slot代表Object2的槽。
信號和槽是Qt引進的一種處理機制,信號可以被理解為一個對象發出的事件請求,槽是處理信號的函數。
設計信號和槽的機制是為了避免回調函數的缺點。回調函數是一個函數指針,如果希望一個處理函數發出一些通知事件,可以把另一個函數的指針傳遞給處理函數,處理函數在適當的時候使用函數指針回調通知函數。從回調函數的調用過程可以看出,回調函數存在類型不安全和參數不安全的缺點。因為對於調用函數來說,通過函數指針無法判斷出函數的返回類型以及參數類型。
信號和槽能完成回調函數的所有功能,並且信號和槽機制是類型安全的,而且還能完成其他許多復雜的功能。
信號和槽不僅是單一的對應關系,還可以是多對多的關系。一個信號可以被連接到多個槽,一個槽也可以響應多個信號,此外,信號之間也可以被連接。
本文出自 “成鵬致遠” 博客,請務必保留此出處http://infohacker.blog.51cto.com/6751239/1199405