Qt信号模型:
Qt封装了具体操作系统的消息机制
Qt遵循进店的GUI消息驱动事件模型
Qt中系统消息概念:
信号(Signal)——由操作系统产生的消息
槽(Slot)——程序中的消息处理函数
链接(Connect)——将系统消息绑定到信息处理函数
信号与槽 核心函数 QObject::connect 函数
bool connect(const QObject* sender, //发送对象
const char* signal, //消息名称
const QObject* receiver,//接受对象
const char* method, //接受对象的成员函数
Qt::ConnectionType type = Qt::AutoConnection );
在Qt中,消息用字符串进行描述
connect函数在消息名和处理函数之间建立映射
Qt中的新关键字
SIGNAL——用于指定消息名
SLOT——用于指定消息处理函数名
Q_OBJECT——所有自定义槽的类必须在类声明的开始处加上Q_OBJECT
slots——用于在类中声明消息处理函数
实验: 通过实现一个QPushButton 控件关闭应用
代码:
QApplication a(argc, argv); QPushButton b ;//定义一个QPushButton 对象b b.setText("click me to quit");//设置按钮显示字符 b.show();//显示按钮 /*将QPushButton 对象b 的点击事件与 QApplication a的退出操作进行绑定 功能: 按钮按下关闭应用 */ QObject::connect(&b,SIGNAL(clicked()),&a,SLOT(quit()));//将按钮点击事件与应用关闭事件进行连接 return a.exec();
自定义槽:
只有QObject的子类才能自定义槽
定义槽的类必须在声明的最开始处使用Q_OBJECT
类中声明槽时需要使用slots关键字
槽与所处理的信号在函数名上必须一致
SIGNAL和SLOT所指定的名称中:
——可以包含参数类型
——不能包含具体的参数名
自定义槽实验:定义按钮槽函数并连接
自定义槽需要满足上述条件。
代码:
修改类定义
class QCalculatorUI : public QWidget { Q_OBJECT private: QLineEdit* m_eidt; QPushButton* m_buttons[20]; QCalculatorUI();//使用二阶构造 构造函数为私有 bool conststruct();//二阶构造函数 private slots: void onButtonsClickde(); public: static QCalculatorUI* NewInstance();//入口函数 void show(); ~QCalculatorUI(); };
实现槽函数:
void QCalculatorUI::onButtonsClickde() { QPushButton* buttons = (QPushButton*)sender(); qDebug()<<"onButtonsClickde"; qDebug()<<buttons->text(); }
建立连接:
connect( m_buttons[i*5 + j],SIGNAL(clicked()),this,SLOT(onButtonsClickde()));//按钮与槽函数进行连接
运行结果: