QT使用元对象编译器(Meta Object Compiler,moc),实现了元对象(Meta Object System,mos)机制,为标准C++增长了一些特性:编程
- 信号槽机制,用于解决对象之间的通信
- 可查询可设计的对象属性
- 强大的事件机制以及事件过滤器
- 基于上下文的字符串翻译机制(国际化),用 tr() 函数实现
- 复杂的定时器实现,用于在事件驱动的GUI中嵌入可以精确控制的任务集成
- 层次化的可查询的对象树,提供一种天然的方式管理对象关系
- 智能指针(QPoint),在对象析构以后自动设为0,防止野指针
- 可以跨越库边界的动态转换机制
元对象系统是基于如下3个条件:函数
(1)基类QObject:任何须要使用元对象系统功能的类必须继承自QObject类ui
(2)Q_OBJECT宏:必须在类的私有声明区声明Q_OBJECT宏(默认为private)this
(3)元对象编译器(Meta-Object Compiler,moc):为QObject子类实现元对象特性提供必要的代码spa
QT编程中信号与槽用于处理界面各个组件的交互,相似与MFC的消息循环和绑定翻译
注意:在使用信号与槽的类中,必须在类的定义中加入宏定义Q_OBJECT设计
信号(Signal)就是在特定状况下被发射的时间,相似于鼠标单击时发生clicked()信号指针
槽(Slot)是对信号响应的函数code
在须要设计槽的控件(触发控件)上右键->转到槽 对象
或者直接按下F4进入快速选择信号和槽函数
选择相应的信号以后就会跳转到该信号函数
- lineEdit 文本编辑框
textChanged(QString)
testEdited(QString)
- pushButton 按钮
clicked()
clicked(bool)
pressed()
//helloDialog.h class HelloDialog : public QMainWindow { // 声明槽函数 private slots: void on_pushButton_clicked(); }
//helloDialog.cpp void HelloDialog::on_pushButton_clicked() { ui->lineEdit->setText("k5"); }
若是不在.ui文件里面直接绑定,就必须用connect()进行绑定
connect(
ui文件下的控件名称
控件自带的信号函数
自定义的对象
自定义的槽函数
)
//helloDialog.h class HelloDialog{ public: void initSignalSlots(); //初始化信号与槽链接
// 声明槽函数 private slots: void changeData(); }
//helloDialog.cpp void HelloDialog::initSignalSlots() { connect(ui->pushButton,SIGNAL(cliked()),this,SLOT(changeData)); } void HelloDialog::changeData(){ ui->lineEdit->setText("k5"); }
除了使用QT内置的信号函数和槽函数,也能够自定义信号和槽函数.
建立两个类继承QObject类,添加Q_Object宏,用signals和slots标记信号和槽函数
// test.h #ifndef TEST_H #define TEST_H #include <QObject> #include <QDebug> class test : public QObject { Q_OBJECT public: test(); void send(){ emit testcall(); } signals: void testcall(); public slots: void testreveive(); } #endif // TEST_H
// test.cpp
#include "test.h" test::test() { } void test::testreceive(){ qDebug() << "receive"; }
// mainwindow.cpp #include "ui_mainwindow.h" #include "test.h" MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent), ui(new Ui::MainWindow) { test t; connect(&t, &test::testcall, &t, &test::testreceive); t.send(); }
注意:使用 signals 标记信号函数,信号是一个函数声明,返回void,不须要实现函数代码
使用 emit 能够发送信号