Qt Quick快速入门之信号、槽

  信号和槽主要用于组件之间的通信,类似于.net和java中的委托。

  使用QObject::connect方法将信号与槽关联起来,然后信号的发起者发出信号,接受者中的槽函数就会执行。

  比如connect(this,SIGNAL(start()),worker,SLOT(Start())),将当前类中start信号关联到worker对象的Start函数,当我们调用emit this->start()时就发出信号,槽函数就会收到这个信号。

  connect函数还有第五个参数,这个参数决定信号何时传给槽,这里提一下,不过本人目前一直使用的默认值。

  Qt::AutoConnection,默认值自动连接,当信号发起者与槽函数执行者在同一线程时,就会使用Qt::DirectConnection,反之则使用Qt::QueuedConnection。

  Qt::DirectConnection,直接相连,信号一发起槽函数立马执行,信号发起者与执行者在同一线程。

  Qt::QueuedConnection,队列式,信号发起者与执行者不在同一个线程,信号发起时,槽函数会等待调度。

  Qt::BlockingQueuedConnection,跟Qt::QueuedConnection一样,不同的是信号发起时存在互斥锁,要等待槽函数返回,这样如果槽函数与信号函数在同一个线程中就会发生死锁(也就是一直堵在锁的位置,没法进入槽函数)。

  Qt::UniqueConnection,这个通过“或”跟上面的一起使用,表示同样的connection只能连接一次,好像没啥作用了,对象、信号、槽相同的connection多次连接会失败。

  信号与槽要想断开连接,使用QObject::disconnect方法。

  关于信号和槽的使用也就这么多,但是经常用,特别是在多线程里面,遇上槽函数没执行可能是连接写错了或是槽函数所在线程哪里堵住了(比如死循环之类的)。

时间: 2024-10-02 05:31:02

Qt Quick快速入门之信号、槽的相关文章

Qt Quick快速入门

年前花了一个多月的时间看Qt的文档并根据自己的需要演练了一部分,之后写了一套UI,然后陆陆续续也弄了一些小工具(主要是上位机程序),由于后面工作估计会越来越忙,就能写一点是一点了,希望能对读者有帮助. 1.Qt Quick快速入门之qml布局 2.Qt Quick快速入门之qml与C++交互 3.Qt Quick快速入门之信号.槽 4.Qt Quick快速入门之线程基础 5.Qt Quick自定义样式一套 顺便打个广告,公司最近要补充一大批人(貌似要招差不多100人左右吧,研发方面主要是硬件.嵌

Qt Quick快速入门之线程基础

首先必须明确的是,Qt中的线程使用是相对复杂的,并不像C#中那么随意,特别是结合串口.网络编程等,使用时稍有不慎就会出问题,然后Qt里面经常出了问题就直接崩溃(这个真是谁用谁知道),所以如果在功能上用异步方式能做到其实就没必要自己去开线程,当然如果自己写的函数比较耗时(比如不断地循环做操作之类的)就无法避免使用线程了. Qt中一般将耗时操作单独放在一个类中实现,在主线程中创建类对象,然后将这个对象移到子线程中,主线程与子线程间的通信主要通过信号和槽实现.另外对象是在主线程中创建的,对象中的成员都

Qt Quick快速入门之qml与C++交互

C++中使用qml对象,直接使用findChild获取qml对象,然后调用setProperty方法设置属性,当然必须在加载qml之后才能使用,不然findChild找不到对象,用法如下. engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); QObject * text_Msg = engine.rootObjects()[0]->findChild<QObject*>("text_Msg");

Qt Quick快速入门之qml布局

Qml里面布局主要有两种,锚点布局.Grid布局. 锚点布局使用anchors附件属性将一个元素的边定位到另一个元素的边,从而确定元素的位置和大小.下面是示例 1 import QtQuick 2.3 2 import QtQuick.Window 2.0 3 4 Window { 5 id:anchorLayoutWindow; 6 width: 480; 7 height: 320; 8 title: "AnchorLayout"; 9 10 Rectangle{ 11 id:re

Qt计算器开发(二):信号槽实现数学表达式合法性检查

表达式的合法性 因为我们的计算器不是单步计算的,所以我们可以一次性输入一个长表达式.然而如果用户输入的长表达式不合法的话,那么就会引发灾难.所以有必要对于用户的输入做一个限制. 一些限制举例: 比如,在输入了左括号以后那么接下来,不能输入运算符.此时运算符要是不可用的状态.在输入了右括号以后不能直接输入数字,此时数字键应该是不可用状态.等等此类的. 在这里我使用了信号与槽的方式来实现.点击不同的按钮,会发展出不同的信号.在这之后的事,点击按钮本身无需考虑,这也是信号槽的良好的设计理念造成的效果,

Flask快速入门(18) — 信号

Flask快速入门(18) - 信号 作用:Flask框架中的信号基于blinker,其主要就是让开发者可以在flask请求过程中定制一些用户行为 安装:pip install blinker 内置信号: request_started = _signals.signal('request-started') # 请求到来前执行 request_finished = _signals.signal('request-finished') # 请求结束后执行 before_render_templ

Qt 学习之路 :信号槽

信号槽是 Qt 框架引以为豪的机制之一.熟练使用和理解信号槽,能够设计出解耦的非常漂亮的程序,有利于增强我们的技术设计能力. 所谓信号槽,实际就是观察者模式.当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal).这种发出是没有目的的,类似广播.如果有对象对这个信号感兴趣,它就会使用连接(connect)函数,意思是,用自己的一个函数(成为槽(slot))来处理这个信号.也就是说,当信号发出时,被连接的槽函数会自动被回调.这就类似观察者模式:当发生了感兴趣的事件

Qt源码学习之信号槽

Qt源码版本 Qt 5.12.0 moc文件 Qt在编译之前会分析源文件,当发现包含了Q_OBJECT宏,则会生成另外一个标准的C++源文件(包含Q_OBJECT宏实现的代码,文件名为moc_+原文件名),该文件同样进入编译系统,最终被链接到二进制代码中去.此时,Qt将自己增加的扩展转换成了标准的C++文件,moc全称是Meta-Object Compiler,也就是“原对象编译器”. Q_OBJECT的宏定义 位置:qobjectdefs.h 1 /* qmake ignore Q_OBJEC

Qt 动画快速入门(一)

Qt-4.6动画Animation快速入门三字决 Qt-4.6新增了Animation Framework(动画框架),让我们能够方便的写一些生动的程序.不必像以前的版本一样,所有的控件都枯燥的呆在伟大光荣的QLayout里,也许它们可以唱个歌,跳个舞.    所谓动画就是在一个时间段内的不同时间点有不同的状态,只要定义好这样状态,实现动画就是水到渠成的事情.当然做这件事情,最好用的就是状态机,没错Qt-4.6.0提供了QStateMachine类,不过今天我要讲的三字决要简单一些. 第一决:Q