广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >Qt4和Qt5的信号和槽的使用区别
  • 789
分享到

Qt4和Qt5的信号和槽的使用区别

2024-04-02 19:04:59 789人浏览 泡泡鱼
摘要

目录信号和槽的 connect信号和槽的 disconnect简 述: Qt4 和 Qt5 的信号和槽的连接 connect 与断开 disconnect 区别 所谓 GUI 界面

简 述: Qt4 和 Qt5 的信号和槽的连接 connect 与断开 disconnect 区别

所谓 GUI 界面,归根结底,就是一堆组件的叠加。我们创建一个窗口,把按钮放上面,把图标放上面,这样就成了一个界面。在放置时,组件的位置尤其重要。我们必须要指定组件放在哪里,以便窗口能够按照我们需要的方式进行渲染。这就涉及到组件定位的机制。Qt 提供了两种组件定位机制:绝对定位和布局定位。

顾名思义,绝对定位就是一种最原始的定位方法:给出这个组件的坐标和长宽值。这样,Qt 就知道该把组件放在哪里以及如何设置组件的大小。但是这样做带来的一个问题是,如果用户改变了窗口大小,比如点击最大化按钮或者使用鼠标拖动窗口边缘,采用绝对定位的组件是不会有任何响应的。这也很自然,因为你并没有告诉 Qt,在窗口变化时,组件是否要更新自己以及如何更新。如果你需要让组件自动更新——这是很常见的需求,比如在最大化时,Word 总会把稿纸区放大,把工具栏拉长——就要自己编写相应的函数来响应这些变化。或者,还有更简单的方法:禁止用户改变窗口大小。但这总不是长远之计。

针对这种变化的需求,Qt 提供了另外的一种机制——布局——来解决这个问题。你只要把组件放入某一种布局,布局由专门的布局管理器进行管理。当需要调整大小或者位置的时候,Qt 使用对应的布局管理器进行调整。

信号和槽的 connect

Qt4 方式: 宏


//Qt4: 宏
  static QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection)
         QMetaObject::Connection connect(const QObject *sender, const char *signal, const char *method, Qt::ConnectionType type = Qt::AutoConnection) const

Qt5 方式: 函数指针


// Qt5: 函数指针
  static QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, const QObject *receiver, PointerToMemberFunction method, Qt::ConnectionType type = Qt::AutoConnection)
  static QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)   
  static QMetaObject :: Connection QObject :: connect(const QObject * sender, const QMetaMethod&signal,const QObject * receiver, const QMetaMethod& method,Qt :: ConnectionType type = Qt :: AutoConnection)

connect 第五个参数

type:用于指明信号和槽的关联方式,它决定了信号是立即传送到一个槽还是在稍后时间排队等待传送。关联方式使用枚举 Qt::ConnectionType 进行描述,下表为其取值及意义

枚举 说明
Qt::AutoConnection 0 **(自动关联,默认值)。**若接收者驻留在发射信号的线程中(即信号和槽在同一线程中),则使用 Qt::DirectConnection,否则,使用 Qt::QueuedConnection。当信号发射时确定使用哪种关联类型。
Qt::DirectConnection 1 直接关联。当信号发射后,立即调用槽。在槽执行完之后,才会执行发射信号之后的代码(即 emit 关键字之后的代码)。该槽在信号线程中执行。
Qt::QueuedConnection 2 队列关联。当控制权返回到接收者线程的事件循环后,槽才会被调用 ,也就是说 emit 关键字后面的代码将立即执行,槽将在稍后执行,该槽在接收者的线程中执行。
Qt::BlockingQueuedConnection 3 阻塞队列关联。和 Qt::QueuedConnection 一样,只是信号线程会一直阻塞,直到槽返回。如果接收者驻留在信号线程中,则不能使用此连接,否则应用程序将会死
Qt::UniqueConnection 0x80 唯一关联。这是一个标志,可使用按位或与上述任何连接类型组合。当设置 Qt::UniqueConnection 时,则只有在不重复的情况下才会进行连接,如果已经存在重复连接(即,相同的信号指同一对象上的完全相同的槽),则连接将失败,此时将返回无效的 QMetaObject::Connection

例子


// 式1
A ma; B mb; 
QObject::connect (&ma, SIGNAL( s(int) ), &mb, SLOT(x(int) );

// 式2
A ma; B mb; 
mb.connect(&ma, SIGNAL(s(int)), SLOT(x(int));

// 式3
A ma; B mb; 
QObject::connect(&ma, &A::s, &mb, &B::x );

// 式4
A ma; 
QObject::connect(&ma, &A::s, &B::x);  // void x(int i)是类 B 中定义的静态槽

// 式5
A ma; B mb;
int indexSig = ma.metaObject()->indexOfSignal("clicked(bool)");
int indexSlot = mb.metaObject()->indexOfSlot("close()");
connect(&ma, ma.metaObject()->method(indexSig), &mb, mb.metaObject()->method(indexSlot));

补充:

  • 形式 3 的槽函数可以不使用 slots 关键字声明,任意的成员函数都可以是槽函数。形式 1 的槽函数必须使用 slots 修饰
  • 形式 1 的槽函数不受 private 的限制,也就是说即使槽是 private 的,仍可通过信号调用该槽函数,而形式 3 则在使用 connect 时就会发生错误。

信号和槽的 disconnect


  static bool QObject::disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *method)
  static bool QObject::disconnect(const QMetaObject::Connection &connection)
  static bool QObject::disconnect(const QObject *sender, PointerToMemberFunction signal, const QObject*receiver, PointerToMemberFunction method)
  static bool QObject::disconnect(const QObject *sender, const QMetaMethod &signal, const QObject*receiver, const QMetaMethod &method)
         bool QObject::disconnect(const char *signal = Q_NULLPTR, const QObject *receiver = Q_NULLPTR, const char *method = Q_NULLPTR) const
         bool QObject::disconnect(const QObject *receiver, const char *method = Q_NULLPTR) const  

补充:

  • 形式 3 的槽函数可以不使用 slots 关键字声明,任意的成员函数都可以是槽函数。形式 1 的槽函数必须使用 slots 修饰
  • 形式 1 的槽函数不受 private 的限制,也就是说即使槽是 private 的,仍可通过信号调用该槽函数,而形式 3 则在使用 connect 时就会发生错误。

到此这篇关于Qt4和Qt5的信号和槽的使用区别的文章就介绍到这了,更多相关Qt4和Qt5的信号和槽内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Qt4和Qt5的信号和槽的使用区别

本文链接: https://www.lsjlt.com/news/129484.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Qt4和Qt5的信号和槽的使用区别
    目录信号和槽的 connect信号和槽的 disconnect简 述: Qt4 和 Qt5 的信号和槽的连接 connect 与断开 disconnect 区别 所谓 GUI 界面...
    99+
    2022-11-12
  • Qt4和Qt5的信号和槽的使用区别有哪些
    这篇文章将为大家详细讲解有关Qt4和Qt5的信号和槽的使用区别有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。目录信号和槽的 connect信号和槽的 disconnect简 述: Qt4 和 Qt5...
    99+
    2023-06-20
  • qt中信号和槽的作用是什么
    在Qt中,信号和槽是一种用于对象之间通信的机制。信号和槽允许对象在特定事件发生时发送信号,其他对象可以连接到这些信号并在接收到信号时...
    99+
    2023-09-27
    qt
  • Shell脚本中单引号(‘)和双引号(“)的使用区别
    在Linux操作系统上编写Shell脚本时候,我们是在变量的前面使用$符号来获取该变量的值,通常在脚本中使用”$param”这种带双引号的格式,但也有出现使用'$param'这种带引号的使用的场景,首先大家...
    99+
    2022-06-04
    脚本 区别 单引号
  • 微信小程序和公众号的区别是什么
    本文小编为大家详细介绍“微信小程序和公众号的区别是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“微信小程序和公众号的区别是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。不同的使用方式我们首先联系了官方帐...
    99+
    2023-06-27
  • windows中信号量和互斥量的区别是什么
    本篇内容介绍了“windows中信号量和互斥量的区别是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!区别:1、互斥量用于线程的互斥,信号...
    99+
    2023-06-25
  • linux下信号量和互斥锁的区别有哪些
    这篇文章主要讲解了“linux下信号量和互斥锁的区别有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“linux下信号量和互斥锁的区别有哪些”吧!linux下信号量和互斥锁的区别是:1、信...
    99+
    2023-06-29
  • PHP中的单引号和双引号的区别
    PHP中单引号和双引号简介PHP中字符串和变量插值时单引号和双引号的区别PHP中转义撇号时单引号和双引号的区别 本文将介绍PHP中单引号和双引号的区别。 PHP中单引号和双引号简介 在 PHP 中,我们使用引号来指定值是字符串文字。有两种不...
    99+
    2023-09-29
    php servlet 开发语言
  • PHP的逗号和点号的区别是什么
    这篇文章主要介绍“PHP的逗号和点号的区别是什么”,在日常操作中,相信很多人在PHP的逗号和点号的区别是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”PHP的逗号和点号的...
    99+
    2022-10-19
  • Mysql中反引号和单引号的区别
    这篇文章给大家分享的是Mysql中反引号和单引号的区别。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。反引号,一般在ESC键的下方。它是为了区分MYSQL的保留字与普通字符而引入的符号。...
    99+
    2022-10-18
  • package.json版本号符号^和~前缀的区别
    开发中经常会使用npm install 安装依赖包,经常会看到^符号和~符号,现将二者的区别总结如下: 版本号 x.y.z : z :表示一些小的bugfix, 更改z的...
    99+
    2022-11-13
  • 在 PHP 中单引号(‘ ‘)和双引号(“ “)用法的区别
    在 PHP 中,使用单引号(' ')和双引号(" ")可以创建字符串。这两种引号的用法有一些区别。 单引号: 单引号用于创建简单的字符串,其中的变量和转义字符将不会被解析。单引号中的任何内容都被视为普通文本,不会进行任何特殊处理。使用单...
    99+
    2023-09-02
    php
  • qt信号和槽连接不成功的原因有哪些
    Qt信号和槽连接不成功的原因可能有以下几种:1. 忘记使用connect函数进行连接:在使用Qt信号和槽进行连接时,需要调用conn...
    99+
    2023-09-27
    qt
  • 亚马逊子账号和主账号的区别
    1. 什么是亚马逊子账号和主账号? 亚马逊子账号是由主账号创建的附属账号,可以与主账号共享某些资源和权限。主账号是亚马逊账户的核心账户,可以访问所有的亚马逊服务和功能。 2. 子账号和主账号的区别是什么? 2.1 权限和资源 主账号可以访...
    99+
    2023-10-27
    账号 亚马逊 区别
  • javascript中分号和逗号的区别有哪些
    这篇“javascript中分号和逗号的区别有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看...
    99+
    2022-10-19
  • C++使用标准库实现事件和委托以及信号和槽机制
    目录1 .Net的委托和事件2.Qt的信号和槽3.Duilib中委托和事件4.使用C++标准库简单实现事件触发机制5.总结在日常的程序开发中我们经常会遇到以下的实际问题: 比如在一个...
    99+
    2022-11-13
    C++标准库实现事件委托 C++标准库实现信号 槽机制 C++ 标准库
  • MySQL中的引号和反引号的区别与用法详解
    前言 因此我写下了这个博客,本博客也引荐了一些大佬文章的知识,如有侵权联系我哦!如果有缘人能看到这个博客希望能对你有帮助,如果一些地方有错误也可以直接指出来哦!! 1.单引号: 我...
    99+
    2022-11-12
  • Java泛型中T和问号的区别
    本篇内容主要讲解“Java泛型中T和问号的区别”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java泛型中T和问号的区别”吧!类型本来有:简单类型和复杂类型,引入泛型后把复杂类型分的更细了.概述...
    99+
    2023-05-30
    java
  • PHP中单引号和双引号的区别详解
    目录PHP中单引号和双引号简介PHP中字符串和变量插值时单引号和双引号的区别PHP中转义撇号时单引号和双引号的区别补充知识:字符串内部如果出现PHP引号怎么办--关于转义.总结本文将...
    99+
    2023-01-15
    php单引号和双引号区别在哪 php单双引号的区别 php中双引号和单引号
  • socket通信和tcp通信的区别有哪些
    本篇内容介绍了“socket通信和tcp通信的区别有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!socket通信和tcp通信的区别:1...
    99+
    2023-06-29
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作