Qt 6: 1-9 信号和槽

2023-11-06

概念

  • 作用:改变一个部件时,其他部件也能了解到
  • 槽:一个函数,在信号发射后被调用
  • 关系:信号和槽是一对多、多对一或者多对多关系,多个槽关联一个信号时,多个槽按关联顺序执行
  • 拥有槽的累必须拥有Q_OBJECT宏,继承QOBJECT
  • 声明信号在signals关键字(同public)后
  • 声明槽用slot关键字后(必须)
  • 信号没有返回值,只能是void类型
  • 信号只用声明,无法定义实现
  • 发射信号用emit关键字:emit 信号();
  • 优点:
    • 类型安全
    • 松耦合,发送者和接收者互不清楚
    • 信号和槽的参数数量任意

声明

//声明信号:
signals://不可被public等修饰
	void firstSignal(int);
//声明槽:
slots://可被public等修饰
	void showValue(int);

手动关联

  1. 声明信号
  2. 编写发射信号的函数
  3. 声明槽
  4. 编程槽
  5. 关联信号和槽

声明信号和槽如上文声明,信号和槽可不在同一类(此时进行类间的信息传递)

发射信号的函数多数为按钮事件,如点击按钮函数on_pushButton_clicked

void MyDialog::on_pushButton_clicked()
{
    int value = ui->spinBox->value();
    emit firstSignal(value);//发射信号的emit关键字,带着value发射出去
    qDebug() << "emitted";
    close();
}

编写槽和编写普通的函数一样:

void Widget::showValue(int value)//接收信号发送的数据
{
    ui->label->setText(tr("值为%1").arg(value));
}

信号和槽的关联用connect函数,函数原型:
[static] QMetaObject::Connection QObject::connect(const QObject *sender,
const char *signal,
const QObject *receiver,
const char *method,
Qt::ConnectionType type =
Qt::AutoConnection)
简单看是这样(要发射信号的类,发射的信号, 接收信号的类,槽)

信号需用SIGNAL()转为char *类型,槽需用SLOT()转为char *类型,且只要参数类型,无需参数名

返回值为QMetaObject::Connection类型,可用于QObject::disconnect(QMetaObject::Connection &)断开连接

信号的参数要大于等于槽的参数(多余参数被忽略)

Qt::ConnectionType type是枚举类型指定,可指定信号和槽的执行方式
例:

connect(dlg, SIGNAL(firstSignal(int)), this, SLOT(showValue(int)));

connect也可用一种重载方法:
connect(const QObject *sender,
PointerToMemberFunction signal,
const QObject *receiver,
PointerToMemberFunction method,
Qt::ConnectionType type = Qt::AutoConnection)

好处:更简洁,无需SIGNAL和SLOT,,只要函数名。其次,槽支持Lambda表达式,一些编译错误可直接发现,如:

connect(dlg, &MyDialog::firstSignal, this, &Widget::showValue);

自动关联

步骤比较简单。声明槽,槽名格式:on_部件名_信号名称
例:

private slots:
    void on_myButton_clicked();//声明的一个槽,myButton是部件名
MyDialog::MyDialog(QWidget *parent) :
{
    QDialog(parent),
    ui(new Ui::MyDialog)
    QPushButton *btn = new QPushButton(this);
    btn->setObjectName("myButton");//设置部件名
    btn->setText(tr("关闭"));
    ui->setupUi(this);
}

此时点击按钮,就会执行编写的槽的行为,qt帮你自动关联了。

断开关联

利用disconnect函数:
[static] bool QObject::disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *method)

常用用法:

断开对象的所有信号关联:
disconnect(对象, nullptr, nullptr, nullptr);

对象指针->disconnect();

断开对象与指定信号的所有关联:
disconnect(对象,SIGNAL(信号()), nullptr, nullptr);

对象指针->disconnect(SIGNAL(信号()));

断开指定接受信号的对象的关联:
disconnect(发送类, nullptr, 接受类, nullptr);

对象指针->disconnect(接收类);

断开指定信号和指定槽的关联:
disconnect(发送类, SIGNAL(信号()), 接受类, SLOT(槽()));

对象指针->disconnect(SIGNAL(信号()), SLOT(槽())));

disconnect(connect函数的返回值);

总结:有指定的指定,表示所有的用nullptr

对应connect重载形式的disconnect重载形式:
bool QObject::disconnect(const QObject *sender, PointerToMemberFunction signal, const QObject *receiver, PointerToMemberFunction method)
写法类似重载的connect

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt 6: 1-9 信号和槽 的相关文章

  • 删除 QComboBox“下拉”动画

    我正在使用 Qt 4 8 并且想在单击 QComboBox 时摆脱 下拉 动画 我也想稍微移动一下 到目前为止 我一直在考虑重新实现 showPopup 和 hidePopup 但不知道如何使其工作 此外 每次我尝试使用 CSS 进行移动或
  • cx_freeze:QODBC 驱动程序未加载

    我的 python 应用程序如下所示 test py from PyQt4 import QtCore from PyQt4 import QtGui from PyQt4 import QtSql import sys import at
  • 调整 QML 图像显示尺寸

    我有一个带有嵌套的 QML 窗口RowLayout 在内排我有两个图像 来源 png这些图像的文件 故意 相当大 当我尝试设置height这些图像上的属性使它们变小 但它们仍然被画得很大 Desired Appearance Actual
  • 如何获取 QIcon 的文件/资源​​路径

    假设我做了这样的事情 QIcon myIcon resources icon ico 我稍后如何确定该图标的路径 例如 QString path myIcon getPath 问题是 没有getPath 会员 我找不到类似的东西 但肯定有办
  • qt项目如何设置安装路径

    我正在寻找与 qmake configure prefix 等效的内容 基本上 我想覆盖默认的安装 部署目录 这是如何用命令行 qmake 指定的 我还使用 QtCreator 构建了很多 gui 项目 并且我想知道如何在 QtCreato
  • QT 中只获取文件而不获取目录?

    当我这样做时 QDir myDir home some location QStringList filesList myDir entryList 它返回该位置内的文件和目录 但我只想要文件 并且这些文件可以具有任意扩展名 有任何想法吗
  • MAC 上的 QT/C++ - 未设置应用程序图标

    我正在努力解决的奇怪问题 在与我的 pro QT 项目文件相同的文件夹中 我有一个 Resources myIcon png 我试图将其设置为我构建的应用程序的图标 在 OSX 上运行 我阅读了文档 它建议在 pro 文件中添加 ICON
  • 从 QML 实例化 C++ 对象会产生巨大的内存使用开销

    实例化一个QObjectC 堆中的派生类为每个对象提供了大约 160 个字节 通过注册相同的对象qmlRegisterType 用于从 QML 创建并通过以下方式动态创建对象createObject 每个对象给我 2000 多个字节 这是完
  • 仅将非模态 QDialog 窗口放置在我的应用程序顶部,而不是所有应用程序顶部

    我有一个 QDialog 窗口 它应该始终位于我的应用程序顶部 它不是模态的 用户可以随时与对话框和主应用程序进行交互 使用窗口保持在顶部提示在某种程度上实现了这一点 但是 该对话框仍然位于所有其他正在运行的应用程序 例如记事本 chrom
  • Qt程序部署到多平台,如何?

    我是 Qt 编程新手 我想开发一个程序 我想在 Windows Linux ubuntu 和 Mac 上运行 听说Qt支持多平台应用程序开发 但我的问题是 在我部署或编译后 任何 Qt 库都需要在 Ubuntu 中运行这个应用程序吗 如果您
  • 如何在 C++ 和 QML 应用程序中使用 qrc?

    我在 Windows7 上用 c qnd Qt Creator QML 编写了 Qt Quick Desktop 应用程序 现在 我必须部署它 并且我需要隐藏 qml 文件和图像 意味着 将它们放入资源等中 我读到有一个很好的方法可以使用
  • 程序意外完成 - QT Creator

    我正在尝试使用 QT Creator 使用 QT 框架开发 GUI 控制台应用程序 我使用的是Windows XP 我安装了QT 4 8 3和mingw 两者均已安装 没有任何错误 然后我安装了QT Creator QT 版本 路径中的 Q
  • QDesktopServices::openUrl 在资源管理器中选择指定文件

    在大多数编码程序中 您可以右键单击该项目 然后单击 在资源管理器中显示 它会在资源管理器中显示选定项目的文件 在 Qt 中使用 QDesktopServices 如何做到这一点 或在 QT 中执行此操作的任何方式 您可以使用此方法在 Win
  • Qt mouseReleaseEvent() 未触发?

    我有一个显示图片的库 我们称之为 PictureGLWidget 其中 class PictureGLWidget public QGLWidget 所以 PictureGLWidget 扩展了 QGLWidget 在PictureGlWi
  • Qt:将拖放委托给子级的最佳方式

    我在 QWidget 上使用拖放 我重新实现了 DragEnterEvent dragLeaveEvent dragMoveEvent 和 dropEvent 效果很好 在我的 QWidget 中 我有其他 QWidget 子级 我希望它们
  • QTcpSocket 有时不发送数据

    我有两个 QT 应用程序 一个应用程序可以被认为保存了大数据 它每秒向第二个应用程序发送大约 10 KB 的数据块 之前我尝试使用QUdpSocket来传输数据 但由于MTU限制在2 5K左右 并且需要自己分割和重新组合数据 所以我改用QT
  • Qt - 如何粘合两个窗口并将它们移动在一起?

    就像qmmp Qt 音乐播放器ui设计一样 这两个或三个窗口实际上在同一个窗口中 因为只有一个dock图标 并且这些窗口可以一起移动并相互附着 我看了源码 好像有用QDockWidget 但我真的不知道如何获得它的细节 当您手动移动辅助窗口
  • 如何在模型更改时停止ListView“跳跃”

    我需要做什么 我需要创建一个聊天窗口用一个ListView在 QML 中存储聊天消息 我设置listView positionViewAtEnd 以便跟踪最后的消息 我禁用positionViewAtEnd当我向上滚动时 我可以阅读过去的消
  • 为 Windows 98 编译 Qt

    我需要支持 Windows 98 Qt 文档声称这是可能的 但没有说明 Qt 4 6 的分布式二进制文件不能在 Win98 上运行 而且我采样的大多数 Qt 应用程序也不能在 Win98 上运行 对于几个确实在 98 上运行的应用程序 我询
  • 与 Qt 项目的静态链接

    我有一个在 Visual Studio 2010 Professional 中构建的 Qt 项目 但是 当我运行它 在调试或发布模式下 时 它会要求一些 Qt dll 如果我提供 dll 并将它们放入 System32 中 它就可以工作 但

随机推荐

  • Thread Pool 线程池

    Thread Pool 本文基于经典的99行代码 稍加修改使其支持C 20 并增加了wait与join功能 pragma once include
  • vue中使用drag事件左右拖动div,改变宽高大小

    实现思路 1 使用上左 top left 上 top 上右 top right 等6个小点实现拖动效果 2 拖动时记录起始点 结束点 startPoint x 0 y 0 开始坐标 拖动改变定位 endPoint x 0 y 0 结束坐标
  • 面试题 08.10. 颜色填充

    面试题 08 10 颜色填充 https leetcode cn com problems color fill lcci 难度简单12收藏分享切换为英文关注反馈 编写函数 实现许多图片编辑软件都支持的 颜色填充 功能 待填充的图像用二维数
  • Java多线程之间的通信

    重点 等待 gt 执行业务 gt 通知其他线程 package com liu pc 线程之间通讯问题 等待唤醒 通知唤醒 线程交替执行 A B操作同一个变量 A 1 B 1 public class A public static voi
  • virtual channels 虚拟通道——mipi协议

    1 虚拟通道ID字段 最多可以支持4个外设 2 需要 DSI Hub 无法将多个显示器连接到同一总线 3 或者某个显示设备支持使用虚拟通道 设备本身由多个物理驱动器控制显示面板的不同区域 这个显示器就可以使用虚拟通道将数据发送到各个驱动器
  • 【数据库原理及应用教程(第4版

    文章目录 一 选择题 二 填空题 三 设计题 四 简答题 Reference 一 选择题 1 2 3 4 5 6 7 8 9 10 B C C A C B C B D C 11 12 13 14 15 16 17 18 19 20 D B
  • bzoj1110 [POI2007]砝码Odw 贪心+进制拆分

    题意就不说了 一开始居然在想直接dp 看到是整数倍我的内心居然毫无波动 真是傻的不行了 因为是整数倍 那我们可以把一个容器用砝码的重量做为进制拆分 然后从小到大一个个填就可以了 贪心策略肯定是最优的 具体如何拆分看hzwer www htt
  • LSP和Hooks拦截

    分层服务提供者 英语 Layered Service Provider 缩写LSP 是一项已被弃用的Microsoft Windows中Winsock 2服务提供者接口 SPI 的特性 它也被称为分层服务提供商或分层服务提供程序 分层服务提
  • Mybatis-plus中操作JSON字段

    1 实体类上要加上自动映射 TableName value school autoResultMap true 2 json字段上加上json处理器 TableField value cover url typeHandler Jackso
  • 使用nmcli命令配置虚拟机网络

    简述 什么是nmcli Description nmcli is a command line tool for controlling NetworkManager and reporting network status It can
  • Mybatis 获取当前序列和下一个序列值 以及在一个方法中写多条SQL 语句

    目录 1 Mybatis 获取当前序列和下一个序列值 2 Mybatis 在一个方法中写多条SQL 语句 1 Mybatis 获取当前序列和下一个序列值 获取当前序列值 select XXX sequence currval from du
  • 电子信息工程毕设题目选题大全

    文章目录 1前言 2 如何选题 3 选题方向 3 1 嵌入式开发方向 3 2 物联网方向 3 3 移动通信方向 3 4 人工智能方向 3 5 算法研究方向 3 6 移动应用开发方向 3 7 网络通信方向 3 8 学长作品展示 4 最后 1前
  • Jetpack-Compose之一基础使用

    一 命令式UI和申明式UI 如果之前有了解或者使用果Flutter 应该会对命令式UI这种架构不陌生 目前申明式UI确实是很火包含Flutter SwiftUI JetpackCompose都使用了该种方式 2021年7月底 Google
  • mysql数据库容量规划_MySQL数据库服务器整体规划(方法论)

    我们在搭建MySQL数据库服务器的开始阶段就合理的规划 可以避免以后的很多问题的产生 大大节省我们的时间和精力 在一定幅度上降低成本 当然 这会涉及很多方面 比如机器的选型 业务评估和系统规划等 所有的设计都是跟具体的需求相关的 我们首先要
  • 什么是 DNS ANAME 解析?

    本人使用谷歌搜索了简中互联网 完全没有找到任何有关 ANAME 的文章 本文该不会是头一份吧 相信大家对于 DNS 的解析方式都不陌生 常见的有 A CNAME MX TXT 记录等等 其中 网站常用的是 A 记录和 CNAME 记录 A
  • [贪心入门]完美字符串

    约翰认为字符串的完美度等于它里面所有字母的完美度之和 每个字母的完美度可以由你来分配 不同字母的完美度不同 分别对应一个1 26之间的整数 约翰不在乎字母大小写 也就是说字母F和f 的完美度相同 给定一个字符串 输出它的最大可能的完美度 例
  • spyglass的waiver使用问题总结-工具(八)

    spyglass使用过程中waiver warning及error过程中总会出现生效不成功的问题 总结使用步骤供参考 实践出真知 解决问题就是好方法 1 在spyglass的prj中设置默认waiver文件 2 如何waiver 3 查看已
  • SpringBoot集成ZipKin实现链路跟踪

    SpringBoot集成ZipKin实现链路跟踪 1 我们要做什么 当我们的服务器成千上万 当我们的模块上万成千 当我们的调用链路复杂如蜘蛛网时 我们突然发现一个小小的性能问题却不能快速定位到点 千万不要以为自己是神 当年那个觉得ELK日志
  • stm32f10x中GPIOA理解(二)

    一 要理解固定库操作GPIOx的寄存器 首先固定库通过 void GPIO Init GPIO TypeDef GPIOx GPIO InitTypeDef GPIO InitStruct 函数来实现的 这函数 操作寄存器CRL和CRH 二
  • Qt 6: 1-9 信号和槽

    文章目录 概念 声明 手动关联 自动关联 断开关联 概念 作用 改变一个部件时 其他部件也能了解到 槽 一个函数 在信号发射后被调用 关系 信号和槽是一对多 多对一或者多对多关系 多个槽关联一个信号时 多个槽按关联顺序执行 拥有槽的累必须拥