QT 之道


一、 QT介绍、安装、配置、编译

Qt 是跨平台的应用程序和 UI 框架。 它包括跨平台类库、集成开发工具和跨平台 IDE。使用 Qt 您只需一次性开发应用程序,无须重新编写源代码,便可跨不同桌面和嵌入式操作系统部署这些应用程序。

 

1、QT

2、安装

下载地址:http://qt.nokia.com/

 

3、编译

使用QT生成makefile.然后make即编译完成


 

qmake xxx.pro
make


 qmake 项目名.pro 即可使用qmake工具来自动生成makefile文件

 

 

二、QT基础知识

 熟练使用QT API文档

 

 

三、QT核心机制 —— 信号与槽

 

1、概述:信号和槽是一种高级接口,信号和槽是QT自行定义的一种通信机制,它独立于标准的C/C++语言,因此要正确的处理信号和槽,必须借助一个称为moc(Meta Object Compiler)的QT工具,该工具是一个C++预处理程序,它为高层次的事件处理自动生成所需要的附加代码。

所有从QObject或其子类(例如Qwidget)派生的类都能够包含信号和槽

在声明信号与插槽之前必须声明宏 Q_OBJECT,告诉编译器用moc工具进行拓展

Q_OBJECT
...
signals:
...
public slots:
...



 

2、实质:当对象改变其状态时,信号就由该对象发射(emit)出去,槽用来接收发射的信号。

 

 

3、信号

当某个信号对其客户或所有者发生的内部状态发生改变,信号被一个对象发射。

只有定义过这个信号的类及其派生类才能够发射这个信号。当一个信号被发射时,与其相关联的槽将被立刻执行(类似函数调用),只有当所有的槽返回以后发射函数(emit)才返回。如果存在多个槽与某个信号相关联,当这个信号被发射时,这些槽将会一个接一个地执行,但是它们执行的顺序将会是随机的、不确定的,无法控制执行顺序

信号的声明:使用signals关键字之后即可声明自己的信号

signals:
void mySignal();


signals是QT的关键字,而非C/C++的,信号的返回值都为void且没有函数体

由moc完成代码实现,cpp中直接使用即可

 

 

4、

槽是普通的C++成员函数,可以被正常调用,它们唯一的特殊性就是很多信号可以与其相关联。当与其关联的信号被发射时,这个槽就会被调用。槽可以有参数,但槽的参数不能有缺省值。

既然槽是普通的成员函数,因此与其它的函数一样,它们也有存取权限。槽的存取权限决定了谁能够与其相关联。同普通的C++成员函数一样,槽函数也分为三种类型,即public slots、private slots和protected slots。

public slots:在这个区内声明的槽意味着任何对象都可将信号与之相连接。这对于组件编程非常有用,你可以创建彼此互不了解的对象,将它们的信号与槽进行连接以便信息能够正确的传递。
protected slots:在这个区内声明的槽意味着当前类及其子类可以将信号与之相连接。这适用于那些槽,它们是类实现的一部分,但是其界面接口却面向外部。
private slots:在这个区内声明的槽意味着只有类自己可以将信号与之相连接。这适用于联系非常紧密的类。
槽也能够声明为虚函数,这也是非常有用的。

槽的声明:在声明槽类型之后即可声明自己定义的槽

public slots:
void mySlot();

 

 

5、信号与槽的连接

通过调用QObject对象的connect函数来将某个对象的信号与另外一个对象的槽函数相关联,这样当发射者发射信号时,接收者的槽函数将被调用。该函数的定义如下:

bool QObject::connect ( const QObject * sender, const char * signal,const QObject * receiver, const char * member ) [static]

这个函数的作用就是将发射者sender对象中的信号signal与接收者receiver中的member槽函数联系起来。当指定信号signal时必须使用QT的宏SIGNAL(),当指定槽函数时必须使用宏SLOT()。如果发射者与接收者属于同一个对象的话,那么在connect调用中接收者参数可以省略。

QLabel *label = new QLabel;
QScrollBar *scroll = new QScrollBar;
QObject::connect( scroll, SIGNAL(valueChanged(int)),
label, SLOT(setNum(int))

 

生成两个对象scroll, label 当scroll状态发生变化发送信号 valueChanged() 给label, label对象的槽则接收 

 

 

6、断开信号与槽的连接

当信号与槽没有必要继续保持关联时,我们可以使用disconnect函数来断开连接。其定义如下:

bool QObject::disconnect ( const QObject * sender, const char * signal,
const Object * receiver, const char * member ) [static]

这个函数断开发射者中的信号与接收者中的槽函数之间的关联。

disconnect( myObject, 0, myReceiver, 0 )


 

将信号与槽改为0即可断开连接(其实0为通配符,表示任何对象,任何槽,任何信号)


 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值