关于Qt的信号槽原理很多大佬都有介绍,这里不再班门弄斧,在这里侧重介绍信号槽的一些实际应用。

信号连接槽

在初始化的时候将信号槽的连接建立好,当发送方的信号被触发(属性或事件发生了变化)时,在槽函数中作出相应的处理即可,这是最常见的应用。 举个小例子:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//连接信号槽,处理按钮点击事件connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(onButtonClicked()));
}MainWindow::~MainWindow()
{delete ui;
}//槽函数 - 响应按钮点击事件
void MainWindow::onButtonClicked()
{//弹窗QMessageBox::information(this, "signal and slot", "button clicked!");
}

我们来看一下运行效果:

Qt对象有哪些信号,可以打开Qt助手自行查阅。QPushButton的帮助文档中没有看到相关信号,就从QAbstractButton基类中去查, QPushButton的能够发出的信号如下:

Signals

void

clicked(bool checked = false)

void

pressed()

void

released()

void

toggled(bool checked)

  • 3 signals inherited from QWidget
  • 2 signals inherited from QObject

信号连接多个槽

当发送方的信号被触发时,需要多方进行处理的时候就用到了“信号连接多个槽”。举个例子:

mainwindow.cpp:

#include "mainwindow.h"
#include "ui_mainwindow.h"#include <QTextEdit>
#include "savetextthread.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//保存文本线程SaveTextThread *save_thread = new SaveTextThread(this);//信号:文本发生改变 -> 槽:显示编辑信息connect(ui->textEdit, SIGNAL(textChanged()), this, SLOT(onTextChanged()));//信号:文本发生改变 -> 槽:在线程中保存文件connect(ui->textEdit, SIGNAL(textChanged()), save_thread, SLOT(saveText()));
}MainWindow::~MainWindow()
{delete ui;
}//槽函数 - 显示编辑信息
void MainWindow::onTextChanged()
{int len = ui->textEdit->toPlainText().length();int row = ui->textEdit->textCursor().blockNumber() + 1;int col = ui->textEdit->textCursor().columnNumber() + 1;ui->statusbar->showMessage(QString().sprintf("文本长度:%d 当前位置 行:%d 列:%d", len, row, col));
}

savetextthread.cpp :

#include "savetextthread.h"
#include <QTextEdit>
#include <QTimer>SaveTextThread::SaveTextThread(QObject* parent): QThread(parent)
{stop_flag = true;
}SaveTextThread::~SaveTextThread()
{stop();quit();wait();
}void SaveTextThread::stop()
{stop_flag = true;
}//槽:在线程中保存文件
void SaveTextThread::saveText()
{QTextEdit* edit = (QTextEdit*)sender();if (!edit){return;}//获取文本m_str = edit->toPlainText();stop_flag = false;//运行线程runThreadGracefully();
}void SaveTextThread::runThreadGracefully()
{if (stop_flag) {return;}if (isRunning()){//当线程在运行时,进入查询状态,每1000ms执行一次QTimer::singleShot(1000, this, [=]{ runThreadGracefully(); });} else {//运行线程start();}
}void SaveTextThread::run()
{//保存字符串到文件QFile file("./test.txt");if (file.open(QIODevice::WriteOnly | QIODevice::Truncate)){file.write( qPrintable(m_str) );file.close();}
}

我们来看一下运行效果:

在文件中:

其中,QTextEdit对象发出的textChanged信号连接了2个槽函数,为了干了2件事情, 一个是更新显示信息,另一个是保存文本信息。

在SaveTextThread类中,由于没有UI对象, 在槽函数中可以通过sender方法拿到信号发送方的指针。

Qt 信号槽的应用(一)相关推荐

  1. Qt信号槽如何传递参数

    Qt信号槽如何传递参数 利用Qt进行程序开发时,有时需要信号-槽来完成参数传递.带参数的信号-槽在使用时,有几点需要注意的地方,下面结合实例进行介绍. 1. 当信号与槽函数的参数数量相同时,它们参数类 ...

  2. Qt信号槽机制-传递自定义数据类型(qRegisterMetaType)

    Qt信号槽机制-传递自定义数据类型qRegisterMetaType 前言 前言 通过Qt内置的数据类型进行信号与槽参数传递很方便:如果是自己定义的类型如果想使用signal/slot来传递的话,则没 ...

  3. Hello Qt——Qt信号槽机制源码解析

    基于Qt4.8.6版本 一.信号槽机制的原理 1.信号槽简介 信号槽是观察者模式的一种实现,特性如下: A.一个信号就是一个能够被观察的事件,或者至少是事件已经发生的一种通知: B.一个槽就是一个观察 ...

  4. 13.QT信号槽的连接方式

    QT的信号槽机制和线程的启动方式已经在前面的文章中写过了,本文主要是对信号槽的连接方式进行解读,信号槽的连接方式一共有5种: 1.Qt::DirectConnection 发出信号后立即调用槽函数. ...

  5. 6.QT信号槽的时序分析

    前面已经分析了元对象系统.MOC文件和信号槽的连接,本文分析下信号槽的时序 信号的触发通过emit关键字触发,以sigf1为例,通常是这样的 emit sigf1(t1) emit就是个空宏,在qob ...

  6. 【Qt开发经验】Qt信号槽连接不成功问题原因汇总

    以下几种情况会导致信号槽连接不成功,下面分别描述. 1. 拥有信号槽的类,必须继承QObject,声明Q_OBJECT宏. Qt帮助手册里搜索 "Signals & Slots&qu ...

  7. Qt 信号槽 signals slots 特点 限定符的区别

    1. 信号槽应用于对象间通信. 2. 信号槽的处理借助于moc(Meta Object Compiler)工具,Q_OBJECT宏通知compiler使用moc工具进行moc扩展. 3. 对象中的信号 ...

  8. Qt 信号-槽的同步与异步处理

    通常使用的connect,实际上最后一个參数使用的是Qt::AutoConnection类型:Qt支持6种连接方式.当中3中最主要: 1.Qt::DirectConnection(直连方式)(信号与槽 ...

  9. Qt信号槽之槽函数中获取发送信号对象——sender()

    QObject::sender() 我们如何在槽函数中获取到信号的发送对象呢,使用sender()方法即可获取.但是使用此方法我们需要注意几点: QObject *QObject::sender() ...

  10. Qt 信号槽的应用(三)

    传递自定义结构体 在项目开发过程中,不可能只用基本类型或一些Qt对象来作为信号槽的参数,结构体是必不可少的.由于结构体无法被信号槽识别,需要用Q_DECLARE_METATYPE来注册结构体. 以下继 ...

最新文章

  1. 现代计算机基本工作原理,现代计算机的基本工作原理是
  2. MapReduce设计模式
  3. Python 实战多元线性回归模型,附带原理+代码
  4. 【百度地图API】小学生找哥哥——小学生没钱打车,所以此为公交查询功能
  5. CF702F-T-Shirts【FhqTreap】
  6. 设计师社区|你和设计大咖一起沟通的平台--集设
  7. PWDX查找程序执行路径
  8. paip.java UrlRewrite 的原理and实现 htaccess正则表达式转换
  9. 音频加速 foobar_如何使用Foobar2000将音频CD翻录到FLAC
  10. [动画特效] 炫彩界面库-动画特效来了,可实现各种网页特效v3.3.0
  11. 厉害了,学霸利用贪心算法找偷车贼
  12. win10 切换用户、注销、睡眠等
  13. 刚出的!2019中囯城市实力大排名!看完惊到了!
  14. 个人电脑重装WINDOWN XP 论坛
  15. 无胁科技-TVD每日漏洞情报-2022-11-10
  16. Delphi快速开发本机跨平台Google Maps谷歌地理信息系统GIS解决方案
  17. thinkphp6+ajax 分页
  18. 10大经典数据分析模型,你知道几个?(二)
  19. -moz-max-content使用
  20. 绕过杀软!SQL Server Transact-SQL 的无文件攻击姿势

热门文章

  1. 轴承_常用硬件的种类以及选用_day16
  2. 视频教程-2020软考--网络规划设计师【论文】视频精讲-软考
  3. 计算机毕设Python+Vue幼儿园管理系统(程序+LW+部署)
  4. 计算机毕业设计springboot+vue+elementUI幼儿园管理系统
  5. 渲染和不渲染的区别是什么?
  6. 计算机核心基础知识2
  7. 数字图像处理之matlab常见函数
  8. Windows 中的环境变量 Path 的作用
  9. elasticsearch 导入测试数据
  10. 当物联网遇上区块链解决了哪些问题?