一 信号和槽
1 概念
信号和槽中Qt自行定义的一种通信机制,实现对象之间数据交互.
2 定义
class XX:public QObject{
Q_OBJECT //moc编译器
public slots:
void slot_func(…);//槽
signals:
void signal_func(…);//信号
};
注:槽函数可以连接到某个对象的信号上,通过信号触发槽的执行;槽函数也可以当做普通成员直接调用.
注:信号函数只需声明,不能定义.
3 信号和槽连接
QObject::connect(
const QObject* sender,
const char * signal,
const QObject* receiver,
const char * method);
功能:建立信号和槽的连接
参数:
sender:信号的发送对象
signal:信号函数
receiver:信号的接收对象
method:槽函数
注:
SIGNAL(clicked(void));//将信号转换为const char*
SLOT(close(void));//将槽转换为const char*
案例:创建Qt应用程序,包含一个label和button,实现点击按钮关闭标签的功能
4 信号和槽连接时语法要求
1)信号和槽参数要一致
QObject::connect(A,SIGNAL(sigfunc(int)),
B,SLOT(slotfunc(int)));//ok
QObject::connect(A,SIGNAL(sigfunc(int)),
B,SLOT(slotfunc(int,int)));//error
2)可以带有缺省参数
QObject::connect(A,SIGNAL(sigfunc(int)),
B,SLOT(slotfunc(int,int=0)));//ok
3)信号函数的参数可以多于槽函数,多于参数将被忽略
QObject::connect(A,SIGNAL(sigfunc(int)),
B,SLOT(slotfunc(void)));//ok
4)一个信号可以同时连接到多个槽函数(一对多)
QObject::connect(A,SIGNAL(sigfunc(int)),
B1,SLOT(slotfunc1(int)));//ok
QObject::connect(A,SIGNAL(sigfunc(int)),
B2,SLOT(slotfunc2(int)));//ok
注:当A发送信号后,B1和B2的槽函数都将被执行,但是执行顺序不确定.
5)多个信号可以连接到一个槽函数(多对一)
QObject::connect(A1,SIGNAL(sigfunc1(int)),
B,SLOT(slotfunc(int)));//ok
QObject::connect(A2,SIGNAL(sigfunc2(int)),
B,SLOT(slotfunc(int)));//ok
注:无论A1还是A2发送信号,B的槽函数都将被执行
6)两个信号可以直接连接(信号级联)//了解
QObject::connect(A1,SIGNAL(sigfunc1(int)),
A2,SIGNAL(sigfunc2(int)));//ok
注:当A1对象发送信号时,A2对象的信号也将随之发送
案例:事件同步,滑块和选值框保持同步运行
1)QSlider滑块
//构造函数
QSlider(水平/垂直,父窗口);
//设置滑块滑动范围的函数
void setRange(int min,int max);
//滑动滑动时发送的信号
void valueChanged(int value)[singals]
//设置滑块位置
void setValue(int)[slots]
2)QSpinBox选值框(微调框)
//构造函数
QSpinBox(父窗口);
//设置选值框数值变化范围的函数
void setRange(int min,int max);
//选值框数值改变时发送的信号
void valueChanged(int value)[singals]
//设置选值框当前数值
void setValue(int)[slots]
二 面向对象的Qt编程
1 基于对象Qt编程//Qt功能受到限制,不推荐
2 面向对象的Qt编程
案例:加法计算器
思路:
class CalculatorDialog:public QDialog{
Q_OBJECT //moc
public:
CalculatorDialog(void){
//界面初始化
//信号和槽连接
}
public slots:
void 使能等号按钮槽函数(){}
void 计算和显示结果槽函数(){}
private:
QLineEdit,QLabel,QPushButton
};
int main(int argc,char** argv){
QApplication app(argc,argv);
CalculatorDialog calc;
calc.show();
return app.exec();
}