信号和槽
1.信号与槽机制的连接方式
(1):一个信号可以与另一个信号相连,代码如下:
connect(Object1,SIGNAL(signal1),Object2,SIGNAL(signal1));
(2):同一个信号可以与多个槽连接
connect(Object1,SIGNAL(signal2),Object2,SIGNAL(slot2));
connect(Object1,SIGNAL(signal2),Object3,SIGNAL(slot1));
(3):同一个槽可以响应多个信号
connect(Object1,SIGNAL(singla2),Object2,SIGNAL(slot2));
connect(object3,SINGAL(signal2),Object2,SIGNAL(slot2));
但常用连接方式为:
connect(Object1,SIGNAL(signal),Object2,SLOT(slot));
SIGNAL()和SLOT()是Qt定义的两个宏,他们返回其参数的C语言风格的字符串(const char*),如下等效:
connect(button,SIGNAL(clicked()),this,SLOT(showArea()));
connect(button,"clicked()",this,"showArea()");
2:信号和槽机制的优点
(1):类型安全
(2):松散耦合
一个类若要支持信号和槽,就必须从QObject或QObject的子类继承。注意,Qt信号和槽机制不支持对模板的使用。
3:信号与槽机制的效率
信号和槽机制增强了对象间通信的灵活性,然而这也损失了一些性能。通过传递一个信号来调用槽函数将会比直接调用非虚函数运行速度慢10倍。原因:
1:需要定位接受信号的对象
2:安全地遍历所有的关联
3:编组(marshal)/解组(unmarshal)传递的参数
4:多线程饿时候,信号可能需要排队处理
L2 Qt5元对象系统
Qt的元对象系统基于以下三个事实
1:基类QObject:任何需要使用元对象系统功能的类必须继承自QObject
2:Q_OBJECT宏:Q_OBJECT宏必须出现在类的的私有声明区,用于启动元对象的特性
3:元对象编译器(Meta-Object Compiler.moc):为QObject子类实现元对象特性提供必要的代码实现
L3 布局管理器
QGridLayout *mainLayout = new QGridLayout(this);
mainLayout->addWidget(...);
QWidget::setLayout(...);