QT:信号和槽机制
来源:互联网 发布:求100以内的素数算法 编辑:程序博客网 时间:2024/05/17 22:10
信号和槽机制
1. 概念
信号和槽是Qt自行定义的一种通信机制,实现不同对象之间的数据交互。
其本质就是函数的调用,一个对象发出信号,连接到该信号的对象,则会执行指定的动作(槽Slots )。
2. 定义
"信号 Signal "
class QPushButton {
Q_OBJECT // 元对象编译器 。
signals :
void clicked (); // 信号函数声明,注意信号函数不能自己写定义
};
"槽 Slot "
class QLabel {
Q_OBJECT // 元对象编译器
public slots :
void close (); // 槽函数,可以连接到某一个对象的信号上,也可以当做普通的成员函数用
};
《案例》创建一个按钮和一个标签两个组件,点击按钮时关闭标签。
"槽函数" connect
+--------+ +-----------+
| Button | | Lablel |
+--------+ "connect" +-----------+
| clicked| -----------> | close() |
| 信号 | | |
+--------+ +-----------+
3. 建立信号和槽的连接 "connect 成员函数"
QMetaObject::Connection QObject ::connect (
const QObject * sender,
const char * signal,
const QObject * receiver,
const char * method);
功能:建立信号和槽的连接
参数:
@sender :信号的发送对象指针(QObject的子类对象指针)
@signal :信号函数(eg:clicked () )
SIGNAL (clicked ()); // 将信号函数转换成 const char* 数据类型
@receiver :信号接收对象
@method :槽函数(eg:close () )
SLOT (close ()); // 将槽函数转换成 const char* 数据类型
【注】connect是QObject类中的静态成员函数,QObject类是Qt中绝大多数类的基类。
eg:
button对象和label对象连接
QObject::connect (&button, SIGNAL (clicked ()), &label, SLOT (close ()));
/** 代码演示 - button对象和label对象连接 **/#include <QApplication>#include <QPushButton>#include <QLabel>int main (int argc, char** argv) { QApplication app (argc, argv); QPushButton button ("关闭标签"); QLabel label ("Qt day02!"); button.show (); label.show (); // 信号和槽的连接 QObject::connect (&button, SIGNAL (clicked ()), &label, SLOT (close ())); return app.exec (); }
练习:点击按钮,关闭整个应用程序(QApplication 的 Public Slots)
$ assistant
void closeAllWindows (); // 自己的共有槽函数
void quit (); // 继承QCoreApplication来的
4. 信号和槽连接语法规则
1 )大多数情况下,信号函数参数个数、顺序、类型和槽函数相同
QObject::connect (&A, SIGNAL (sig_func (int)),
&B, SLOT (slot_func (int))); // ok
QObject::connect (&A, SIGNAL (int, QString),
&B, SLOT (QString, int)); // error! ! !
2 )可以带有缺省参数
QObject::connect (&A, SIGNAL (sig_func (int)),
&B, SLOT (slot_func (int, int = 10))); // ok
3 )信号函数的函数参数可以多于槽函数,多余的将被忽略,反之不行
QObject::connect (&A, SIGNAL (sig_func (int, QString)),
&B, SLOT (slot_func (int))); // ok
4 ) 一个信号可以连接到多个槽函数
QObject::connect (&A, SIGNAL (sig_func (int)),
&B1, SLOT (slot_func1 (int))); // ok
QObject::connect (&A, SIGNAL (sig_func (int)),
&B2, SLOT (slot_func2 (int))); // ok
【注】当A对象发送信号sig_func,B1和B2的槽函数都会被执行,执行顺序不确定。
5 )多个信号可以连接到同一个槽函数
QObject::connect (&A1, SIGNAL (sig_func1 (int)),
&B, SLOT (slot_func (int))); // ok
QObject::connect (&A2, SIGNAL (sig_func2 (int)),
&B, SLOT (slot_func (int))); // ok
【注】无论是A1还是A2发送信号,B的槽函数都将会被执行
- Qt信号和槽机制
- QT信号和槽机制
- QT信号和槽机制
- QT信号和槽机制
- Qt信号和槽机制
- QT 信号和槽机制
- QT:信号和槽机制
- Qt信号和槽机制
- qt中的信号和槽机制
- QT中的信号和槽通讯机制
- QT槽和信号机制介绍
- Qt--深入信号和槽机制
- qt信号signal和槽slot机制
- QT信号和槽机制学习
- QT信号和槽机制概述
- QT信号和槽机制注意事项
- Qt编程之信号和槽机制
- Qt的信号和槽机制
- 蓝桥杯-9-3摩尔斯电码(java)
- QT:QString 字符串和中文字符编码
- 深入浅出递归思想
- ABAP字符对齐
- Vim插件之indentLine
- QT:信号和槽机制
- android网络编程关于Socket和http协议
- java四类八种基本数据类型
- 蓝桥杯-11-1实现strcmp函数(java)
- QT:容器窗口(父窗口)
- 10161
- cnpm淘宝镜像
- 1-搭建maven工程
- Android之动态更换桌面图标