Qt元对象
为了在运行期获得对象的类型、类名成员变量列表、函数列表等等功能,Qt推出了元对象系统(和iOS开发中元对象类似),由MOC(元对象编译器)工具在编译期间自动生成,它是属性和信号与槽机制实现的前提
要使用元对象首先必须继承于QObject;其次声明类时使用Q_OBJECT关键字
Qt属性
通过关键字Q_PROPERTY就可以声明一个属性,可以简化成员变量设置及获取相关代码,对外隐藏成员变量
class QTProperty : public QObject {
Q_OBJECT
Q_PROPERTY(bool focus MEMBER m_focus)
Q_PROPERTY(bool focus2 MEMBER m_focus2)
Q_PROPERTY(bool focus3)
public:
explicit QTProperty(QObject *parent = nullptr);
~QTProperty() override;
private:
bool m_focus;
bool m_focus2;
};
Qt信号和槽
Qt对象间的通信机制
信号和槽本质上是成员函数,信号函数函数体编译期间自动生成,槽函数用于接受回调,信号和槽函数具有相同的参数,当发送信号时可以传递该参数给槽函数
class QTProperty : public QObject {
Q_OBJECT
public:
explicit QTProperty(QObject *parent = nullptr);
~QTProperty() override;
void testSignal() {
sendFunc(5);
}
signals:
// 不需要自己实现,由Qt工具自动生成相关代码
void sendFunc(int val);
};
class QTProperty2 : public QObject {
Q_OBJECT
public:
explicit QTProperty2(QObject *parent = nullptr);
~QTProperty2() override;
// slots前必须有public关键字
public slots:
// 槽函数和信号函数参数应该是对应的
static void receiveFunc(int val){
qDebug("receiveFunc() %d",val);
};
};
// 测试用例
QTProperty objA;
QTProperty2 objB;
connect(&objA, &QTProperty::sendFunc, &objB, &QTProperty2::receiveFunc);
objA.testSignal();
事件处理
在 Qt 中,事件作为一个对象,继承自 QEvent 类,常见的有键盘事件 QKeyEvent、鼠标事件 QMouseEvent 和定时器事件 QTimerEvent 等。
事件在QWidget类视图的处理流程
默认情况下QWidget的event()函数会根据事件类型调用对应的时间处理函数,然后再把事件向上传给父视图。