QT5:第八章 信号与槽机制
一.简介
QT使用元对象编译器(Meta Object Compiler,moc),实现了元对象(Meta Object System,mos)机制,为标准C++增加了一些特性:
- 信号槽机制,用于解决对象之间的通讯
- 可查询可设计的对象属性
- 强大的事件机制以及事件过滤器
- 基于上下文的字符串翻译机制(国际化),用 tr() 函数实现
- 复杂的定时器实现,用于在事件驱动的GUI中嵌入能够精确控制的任务集成
- 层次化的可查询的对象树,提供一种自然的方式管理对象关系
- 智能指针(QPoint),在对象析构之后自动设为0,防止野指针
- 能够跨越库边界的动态转换机制
元对象系统是基于以下3个条件:
(1)基类QObject:任何需要使用元对象系统功能的类必须继承自QObject类
(2)Q_OBJECT宏:必须在类的私有声明区声明Q_OBJECT宏(默认为private)
(3)元对象编译器(Meta-Object Compiler,moc):为QObject子类实现元对象特性提供必要的代码
二.信号槽
QT编程中信号与槽用于处理界面各个组件的交互,类似与MFC的消息循环和绑定
注意:在使用信号与槽的类中,必须在类的定义中加入宏定义Q_OBJECT
信号(Signal)就是在特定情况下被发射的时间,类似于鼠标单击时发生clicked()信号
槽(Slot)是对信号响应的函数
1.ui文件设计信号与槽函数
在需要设计槽的控件(触发控件)上右键->转到槽
或者直接按下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");
}
2.内置的信号与槽函数
如果不在.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");
}
3.自定义信号和槽函数
除了使用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 可以发送信号
三.属性
QT5:第八章 信号与槽机制的更多相关文章
- qt中信号与槽机制
一. 简介 就我个人来理解,信号槽机制与Windows下消息机制类似,消息机制是基于回调函数,Qt中用信号与槽来代替函数指针,使程序更安全简洁. 信号和槽机制是 Qt 的核心机制,可以让编程人员将互不 ...
- Qt入门之信号与槽机制
一. 简介 就我个人来理解,信号槽机制与Windows下消息机制类似,消息机制是基于回调函数,Qt中用信号与槽来代替函数指针,使程序更安全简洁. 信号和槽机制是 Qt 的核心机制,可以让编程人员将互不 ...
- QT的信号与槽机制介绍
信号与槽作为QT的核心机制在QT编程中有着广泛的应用,本文介绍了信号与槽的一些基本概念.元对象工具以及在实际使用过程中应注意的一些问题. QT是一个跨平台的C++ GUI应用构架,它提供了丰富的窗 ...
- Qt源码分析之信号和槽机制
Qt的信号和槽机制是Qt的一大特点,实际上这是和MFC中的消息映射机制相似的东西,要完成的事情也差不多,就是发送一个消息然后让其它窗口响应,当然,这里的消息是广义的说法,简单点说就是如何在一个类的一个 ...
- Qt 的信号与槽机制介绍(10个要注意的问题)
QT 是一个跨平台的 C++ GUI 应用构架,它提供了丰富的窗口部件集,具有面向对象.易于扩展.真正的组件编程等特点,更为引人注目的是目前 Linux 上最为流行的 KDE 桌面环境就是建立在 QT ...
- 关于Qt信号与槽机制的传递方向性研究(结论其实是错误的,但是可以看看分析过程)
最近由于项目的需求,一直在研究Qt.信号与槽机制是Qt的一大特色,该机制允许两者间传递参数,依次来实现对象间的通信.这个参数会分别存在于信号的参数列表和槽函数的参数列表中.需要注意的是,若将槽函数绑定 ...
- Qt信号和槽机制
概述 信号和槽机制是QT的核心机制,要精通QT编程就必须对信号和槽有所了解.信号和槽是一种高级接口,应用于对象之间的通信,他是QT的核心特性,也是QT差别于其他工具包的重要地方.信号和槽是QT自行定义 ...
- 【qt】QT 的信号与槽机制
QT 是一个跨平台的 C++ GUI 应用构架,它提供了丰富的窗口部件集,具有面向对象.易于扩展.真正的组件编程等特点,更为引人注目的是目前 Linux 上最为流行的 KDE 桌面环境就是建立在 QT ...
- 【QT学习】信号和槽机制
QT中发射信号使用 emit 来完成. 类要使用信号和槽机制,必须从QObject或者QObject子类继承.必须在类的定义中加上 Q_OBJECT 宏. 信号和槽连接时,参数类型必须相同. 关键字大 ...
随机推荐
- 51nod1179【思维】
题意: 给你n个数,求两两之间的最大GCD: 思路: n太大,然后感觉是分解质因子,但是感觉分解质因子还是搞不出谁和谁的GCD: 但是可以发现,GCD给了一个范围1e6,所以能不能枚举GCD,然后看看 ...
- 洛谷P2824 [HEOI2016/TJOI2016]排序(线段树)
传送门 这题的思路好清奇 因为只有一次查询,我们考虑二分这个值为多少 将原序列转化为一个$01$序列,如果原序列上的值大于$mid$则为$1$否则为$0$ 那么排序就可以用线段树优化,设该区间内$1$ ...
- [Xcode 实际操作]八、网络与多线程-(19)使用RunLoop使PerformSelector方法延迟动作的执行
目录:[Swift]Xcode实际操作 本文将演示使用RunLoop使PerformSelector方法延迟动作的执行. 在项目导航区,打开视图控制器的代码文件[ViewController.swif ...
- cmd - 命令行窗口中文乱码
问题 在cmd窗口中输入curl www.baidu.com可以看到有中文乱码的现象,这是因为默认使用的是GBK编码.另外,curl是利用URL语法在命令行方式下工作的开源文件传输工具.它被广泛应用在 ...
- js截取文件名不带后缀
利用正则表达式是匹配后缀名 一般文件后缀都为.xxx,也就是说从尾部匹配的话首先是字母,接着应该有一个. 那么我们就开始写正则表达式 利用在线工具 方便我们编写边测试 一般都是小写字母,所以我们用[a ...
- Jquery | 基础 | .hover()
https://api.jquery.com/hover/#hover-handlerIn-handlerOut http://jquery.cuishifeng.cn/hover.html
- JMeter BeanShell示例
翻译:https://blog.trigent.com/jmeter-blog-series-jmeter-beanshell-example 在这个例子中,我们将演示在Apache JMeter中使 ...
- 如何在Linux上升级java
首先使用rpm -qa|grep gcj命令查找安装信息 卸载老版java: rpm -e <检索到软件名> 下载最新java JDK: 自行到oracle官网下载相应的版本,放到linu ...
- Expert Python programming - Reading Notes
1. MRO: method resolution order lookup order: L(MyClass) = [MyClass, merged(L(Base1), L(Base2), Base ...
- Oracle 云计算
OCM(oracle 应用整合服务器,人工智能) XCM(exdata) BCM (大数据机器) 云运维人员 ,不需要本地人员