天天看点

【C/C++】qt库结构及示例

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对象中的。

示例效果

工程源码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

<code>/*</code>

<code>*功能:滑动Slider控件的滑块时,Spin控件的数值相应改变。同样的,在修改Spin控件值的时候,Slider控件的数值也相应变化</code>

<code>*/</code>

<code>#include &lt;qapplication.h&gt;</code>

<code>#include &lt;qpushbutton.h&gt;</code>

<code>#include &lt;qlayout.h&gt;</code>

<code>#include &lt;qslider.h&gt;</code>

<code>#include &lt;qspinbox.h&gt;</code>

<code>#include &lt;qwidget.h&gt;</code>

<code>class</code> <code>MyWidget : </code><code>public</code> <code>QWidget</code>

<code>{</code>

<code>public</code><code>:</code>

<code>    </code><code>MyWidget(QWidget *parent=0);    </code><code>//声明MyWidget类的构造函数</code>

<code>};  </code><code>//注意分号</code>

<code>MyWidget::MyWidget(QWidget *parent):QWidget(parent)</code>

<code>    </code><code>QSpinBox *agenum_sb=</code><code>new</code> <code>QSpinBox();</code>

<code>    </code><code>agenum_sb-&gt;setRange(0,100);</code>

<code>    </code><code>agenum_sb-&gt;setValue(0);</code>

<code>    </code><code>QSlider *agenum_sl=</code><code>new</code> <code>QSlider(Qt::Horizontal);</code>

<code>    </code><code>agenum_sl-&gt;setRange(0,100);</code>

<code>    </code><code>agenum_sl-&gt;setValue(0);</code>

<code>    </code><code>connect(agenum_sb,SIGNAL(valueChanged(</code><code>int</code><code>)),agenum_sl,SLOT(setValue(</code><code>int</code><code>)));</code>

<code>            </code><code>//设置Spin控件修改数值响应函数,将Spin控件改变数值的事件与Slider控件关联</code>

<code>    </code><code>connect(agenum_sl,SIGNAL(valueChanged(</code><code>int</code><code>)),agenum_sb,SLOT(setValue(</code><code>int</code><code>)));</code>

<code>            </code><code>//设置SLider控件修改数值响应函数,将Slider控件改变数值的事件与Spin控件关联</code>

<code>    </code><code>QHBoxLayout *layout=</code><code>new</code> <code>QHBoxLayout;    </code><code>//创建列布局的对象</code>

<code>    </code><code>layout-&gt;addWidget(agenum_sb);</code>

<code>    </code><code>layout-&gt;addWidget(agenum_sl);</code>

<code>    </code><code>setLayout(layout);  </code><code>//设置MyWidget使用列布局</code>

<code>    </code><code>setWindowTitle(</code><code>"Enter a number By-Mystery"</code><code>);   </code><code>//设置窗体标题</code>

<code>}</code>

<code>int</code> <code>main(</code><code>int</code> <code>argc, </code><code>char</code> <code>*argv[])</code>

<code>    </code><code>QApplication app(argc, argv);</code>

<code>    </code><code>MyWidget widget;</code>

<code>    </code><code>widget.show();</code>

<code>    </code><code>return</code> <code>app.exec();</code>

Qt中信号与槽系统

  源码中的connect()函数原型为:connect(boject1, signal, object2, slot);

  其中,Object1和Object2分别代表两个不同的Qt对象(继承自QObject基类),signal代表Object的信号,slot代表Object2的槽。

信号和槽是Qt引进的一种处理机制,信号可以被理解为一个对象发出的事件请求,槽是处理信号的函数。

设计信号和槽的机制是为了避免回调函数的缺点。回调函数是一个函数指针,如果希望一个处理函数发出一些通知事件,可以把另一个函数的指针传递给处理函数,处理函数在适当的时候使用函数指针回调通知函数。从回调函数的调用过程可以看出,回调函数存在类型不安全和参数不安全的缺点。因为对于调用函数来说,通过函数指针无法判断出函数的返回类型以及参数类型。

  信号和槽能完成回调函数的所有功能,并且信号和槽机制是类型安全的,而且还能完成其他许多复杂的功能。

  信号和槽不仅是单一的对应关系,还可以是多对多的关系。一个信号可以被连接到多个槽,一个槽也可以响应多个信号,此外,信号之间也可以被连接。

本文转自infohacker 51CTO博客,原文链接:http://blog.51cto.com/liucw/1199405

继续阅读