信号,槽
Qt中的对标准C++语法进行了扩展-信号,槽。
用于对象之间的交互。可以说是Qt事件模式的基础。
可以将一个对象的信号函数和另一个对象的槽绑定。
当一个对象收到一个事件之后,通过信号函数将必要的信息传递给与其绑定的对象的槽函数。
面向对象的Qt编程
Qt含有大量的类,这些类在很大程度上提高了开发的效率。只有使用面向对象的编程方法,才能物尽其用。
总的来说,Qt的开发,就是看文档,了解的越多,思路也就越多。
———————————-
今天:
一、信号和槽
1、概念
信号和槽是QT自定义一种通信机制,实现对象之间的数据交换。
2、定义
1) 信号函数:
class XX:public Qobbjent{
Q_OBJECT=T//元对象编译器moc
signals:
void sigfunc(…)//信号函数
};
注:信号函数,只需要beject生命,不能定义
2) 槽
class XX:puiblic QObject{
Q_OBJECT
public slots:
void slotfunc();
};
注:槽函数可以连接到其他对象的信号上,当信号被发送时,槽函数将被自动执行。
注:槽函数也可以当作不同成员函数来使用
3、信号和槽的连接
QMetaObject::Connection connect(
const QObject * sender,
const char * signal,
const QObject * receiver,
const char * method,
Qt::ConnectionType type = Qt::AutoConnection)
sender:信号发送的对象(任何QObject子类都可以)
signal:要发送的信号函数
//把信号函数转换成const char*
SIGNAL(信号函数名(参数表));
receiver:信号的接受对象
method:接受对象要执行的槽函数
//把一个槽函数返回值转换为const char*
SLOT(槽函数函数名(参数表));
创建一个Qt的应用程序,包含一个标签和一个按钮,实现点击按钮关闭标签的功能。
4、信号和槽连接的语法要求
1) 信号和槽参数要一致
QObject::connect(A,SIGNAL(sigfun(int)),B,SLOT(slotfun(int)));//ok
QObject::connect(A,SIGNAL(sigfun(void)),B,SLOT(slotfun(int)));//error
2) 可以带有缺省参数
QObject::connect(A,SIGNAL(sigfun(void)),B,SLOT(slotfun(int=0)));//ok
3) 信号函数参数可以比槽函数多,多余将被忽略
QObject::connect(A,SIGNAL(sigfun(int,int)),B,SLOT(slotfun(int)));//ok
4) 一个信号可以被连接到多个槽函数(一对多)
QObject::connect(A,SIGNAL(sigfun(int,int)),B1,SLOT(slotfun1(int)));//ok
QObject::connect(A,SIGNAL(sigfun(int,int)),B2,SLOT(slotfun2(int)));//ok
注:当A发送信号时,B1,B2的槽函数都会被执行,但是执行的顺序是不确定的。
5) 多个信号可以连接到一个槽函数(多对一)
QObject::connect(A1,SIGNAL(sigfun1(int,int)),B,SLOT(slotfun(int)));//ok
QObject::connect(A2,SIGNAL(sigfun2(int,int)),B,SLOT(slotfun(int)));//ok
注:无论A1还是A2发送信号后,B的槽函数都会被执行。
6) 信号级联,两个信号函数可以直接连接
QObject::connect(A,SIGNAL(sigfun1(int,int)),B,SLOT(sigfun2(int)));//ok
1) 滑块(Qslider)
QSlider(垂直/水平,父窗口);
void setRange(int min,int max);
signal:
void valueChanged(int value)
void setValue(int calue)
2) 选值框(QSpinBox)
QSpinBox(父窗口)
void SetRange(int min,int max);
signal
void valueChanged(int value);
二、面向对象的Qt编程
1) 基于对象的Qt编程//不推荐
2) 面向对象的Qt编程
<计算器>