七、Qt 信号和槽

这篇具有很好参考价值的文章主要介绍了七、Qt 信号和槽。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在QT4以上的版本,在窗体上用可以通过选中控件,然后点击鼠标右键单击按钮,选择“转到槽”。可以自动创建信号和槽。

七、Qt 信号和槽,QT C++,qt,c++

选择clicked(),并点击 ok

七、Qt 信号和槽,QT C++,qt,c++

Qt Creator会给头文件和代码文件自动添加 这个按钮的单击事件(信号和槽)。

七、Qt 信号和槽,QT C++,qt,c++

不同的控件,信号不全是一样的,根据控件的使用场景不同,包含的信号也不一样。比如下拉列表框的信号和按钮的不太一样,没有按钮的单击信号,只有选择信号

七、Qt 信号和槽,QT C++,qt,c++

以上是用QT新版本的特性来创建信号和槽。比较方便。

下边我们来介绍自定义信号和槽的绑定。首先介绍connect函数:

connect(信号发送者对象, 信号, 信号接收者对象, 槽, 信号和槽之间的连接模式)

connect​​函数有5个参数,其中第五个参数为信号和槽的连接模式,此参数有默认模式=AutoConnection。

enum ConnectionType {

AutoConnection,

DirectConnection,

QueuedConnection,

BlockingQueuedConnection,

UniqueConnection = 0x80

};

AutoConnection:自动连接,默认模式。连接类型会在信号发送时决定。如果接收者和发送者在同一个线程,则自动使用Qt::DirectConnection类型;如果接收者和发送者不在一个线程,则自动使用Qt::QueuedConnection类型。 DirectConnection:直接连接,槽函数会在信号发送的时候直接被调用,槽函数和信号发送者在同一线程。效果看上去就像是在发送信号的位置调用了槽函数。无论槽函数所属对象在哪个线程,槽函数都在发射信号的线程内执行。 emit语句后面的代码将在与信号关联的所有槽函数执行完毕后才被执行。 QueuedConnection:队列连接,信号发出后会暂时被放到一个消息队列中,需等到接收对象所属线程的事件循环取得控制权时才取得该信号,然后执行和信号关联的槽函数,这种方式既可以在同一线程内传递消息也可以跨线程操作。 emit语句后的代码将在发出信号后立即被执行,无需等待槽函数执行完毕,槽函数在接收者所依附线程内执行。 BlockingQueuedConnection:槽函数的调用时机与Qt::QueuedConnection一致,区别在于发送者emit完信号后所在线程会阻塞,直到槽函数运行完毕。并且接收者和发送者绝对不能在一个线程,否则程序会死锁。在多线程间需要同步的场合可能需要这个。 Qt::UniqueConnection:这个flag可以通过按位或(|)与以上四个结合在一起使用。当这个flag设置时,当某个信号和槽已经连接时,再进行重复的连接就会失败。也就是为了避免重复连接。

以下拉列表框控件QCombobox举例,当下拉选项改变时,会触发相关的槽:

// QT4 信号和槽最常用也是最常见的连接方式为使用:

connect(ui->comboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(currentIndexChanged(int))); connect(ui->comboBox, SIGNAL(currentIndexChanged(QString)), this, SLOT(currentIndexChanged(QString)));

以上代码需要写到窗体的构造函数里

七、Qt 信号和槽,QT C++,qt,c++

然后需要在头文件中声明

currentIndexChanged(int index)

currentIndexChanged(QString text)

七、Qt 信号和槽,QT C++,qt,c++

然后在代码文件中实现这两个函数

七、Qt 信号和槽,QT C++,qt,c++

以上的写法是在Qt4中,使用SIGNAL和SLOT这两个宏,将信号和槽转成了字符串形式,是利用的字符串进行的匹配。如果信号和槽不匹配,编译工程时是不会报错的!

在Qt5版本中对信号和槽采用了新的方法:基于函数地址的强制类型转换或重载,如果信号和槽的形参不匹配,在编译时就会报错:

connect(ui->comboBox, QOverload::of(&QComboBox::currentIndexChanged), this, [=](int index){

QMessageBox::information(this, "index", QString::number(index));

});

connect(ui->comboBox, &QComboBox::currentTextChanged, this, [=](const QString &text){

QMessageBox::information(this, "text", text);

});

七、Qt 信号和槽,QT C++,qt,c++

上边的定法中[]有以下三种用法,说明如下:

[] 空的捕获列表,不会捕获任何外部变更,也不能访问任何外部变量

connect(button,&QPushButton::clicked,[](){

qDebug()

});

[=] 拷贝,外部变量以值传递,不能修改外部变量的值

int nCount = 0;

[=] 所有 [nCount] [=nCount]

[&]引用,可以修改外部变量的值

int nCount = 0;

connect(button,&QPushButton::clicked,[&](){ //也可以写成[&nCount]

nCount ++;

qDebug()

});

​QOverload​​是QT5.7版本之后才加入的,

语法格式:​​QOverload::of(函数地址)​​

作用:返回指定参数的重载函数。

QT5中的信号和槽的连接使用模板:

connect(

发送者对象,

static_cast(&发送者类名::信号函数名),

this,

static_cast(&接收者类名::槽函数名)

);

connect(

发送者对象,

qOverload::of(&发送者类名::信号),

this,

qOverload::of(&接收者类名::槽)

);

QObject::connect(m_test, QOverload::of(&FunctionTest::valueChangedflag),m_data, &Dataprocess::SignalOutputFlag);

这行代码是用于在Qt中建立信号与槽的连接。信号valueChangedflag来自FunctionTest对象,它的参数类型是QString和bool。槽SignalOutputFlag来自Dataprocess对象。当valueChangedflag信号被触发时,会调用SignalOutputFlag槽函数。

该连接的作用是将FunctionTest的信号与Dataprocess的槽函数进行关联,以便在valueChangedflag信号触发时,通过调用SignalOutputFlag槽函数来处理相关逻辑。

请注意,根据代码上下文和实际需求,m_test和m_data应该是对象的指针或引用。此外,确保在连接信号与槽之前,FunctionTest和Dataprocess类都已正确定义和声明。

QOverload::of(&FunctionTest::valueChangedflag) 是一个用于获取成员函数指针的静态函数模板。

在这里,QOverload 是一个模板类,提供了多个静态成员函数 of,用于获取特定参数签名的成员函数指针。QString 和 bool 是参数类型。FunctionTest::valueChangedflag 是一个信号函数,它将被连接到槽函数。

通过使用 QOverload::of(&FunctionTest::valueChangedflag),可以在连接信号和槽时指定正确的参数类型,并确保信号函数与槽函数的参数匹配。

请注意, QOverload 类是 Qt 提供的用于信号和槽连接的辅助类,它提供了一种类型安全的方法来处理函数指针的重载问题。它允许在连接信号和槽时检查参数类型的一致性,以避免潜在的编译错误和运行时错误。

connect(comboBox, QOverload::of(&QComboBox::currentIndexChanged),[=](int index){

/* do ... */

});

《写在最前边》

《一、QT的前世今生》

《二、QT下载、安装及问题解决(windows系统)》


《三、Qt Creator使用》 ​​​

​​​​​​​《四、Qt 的第一个demo-CSDN博客》

《五、带登录窗体的demo》

《六、新建窗体时,几种窗体的区别》 

《七、Qt 信号和槽》 ​​​​​​​文章来源地址https://www.toymoban.com/news/detail-803532.html

到了这里,关于七、Qt 信号和槽的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Qt 信号和槽机制

    一. 简介         在Qt中使用信号和槽机制来完成对象之间的协同操作。简单来说,信号和槽都是函数,比如按下窗口上的一个按钮后想要弹出一个对话框,那么就可以将这个按钮的单击信号和我们定义的槽关联起来,在这个槽中可以创建一个对话框,并且显示它。这样,

    2024年01月18日
    浏览(40)
  • 【Qt】信号和槽机制

    目录 一、认识信号和槽 二、connect函数 三、自定义槽函数 四、自定义信号 五、带参数的信号和槽 六、信号和槽断开连接 七、信号和槽存在的意义 八、Lambda表达式定义槽函数 概述 在Qt中,用户和控件的每次交互过程称为一个事件。如\\\"用户点击按钮\\\"是一个事件,\\\"用户关闭窗

    2024年02月22日
    浏览(46)
  • 07.QT信号和槽-2

            在Qt中,允许⾃定义信号的发送⽅以及接收⽅,即可以⾃定义信号函数和槽函数。但是对于⾃定义的信号函数和槽函数有⼀定的书写规范。 1.1 自定义信号 (1)⾃定义信号函数必须写到\\\"signals\\\"下; (2)返回值为void,只需要声明,不需要实现; (3)可以有参数,

    2024年04月14日
    浏览(35)
  • [Qt的学习日常]--信号和槽

    前言 作者 :小蜗牛向前冲 名言 :我可以接受失败,但我不能接受放弃   如果觉的博主的文章还不错的话,还请 点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 本期学习:什么是信号和槽,自定义槽函数和信号函数,信号和槽的传参,断开,

    2024年04月28日
    浏览(28)
  • 20221210 QT----信号和槽的使用

    什么是信号(signal) 以QPushButton为例: (1)按下按钮时,会触发一个mousePressEvent事件,此时会发出一个pressed信号; (2)松开按钮时,会触发一个mouseReleaseEvent事件,此时会发出released和clicked信号。 事件的种类有很多,不同的事件都对应着不同的信号,当事件发生时,对应

    2024年02月15日
    浏览(46)
  • qt信号和槽避免多次连接

    qt同一个信号和槽多次连接,则槽函数 会触发多次 (默认),可能不是我们想要的结果。 有3种方法可以解决这个问题: 因为初始化函数在在整个程序中只运行一次,所以这里面连接信号和槽,就能避免重复连接问题了。 Qt::UniqueConnection 的作用是:如果该信号以前没连接过

    2024年02月10日
    浏览(39)
  • Qt快速学习(一)--对象,信号和槽

    目录 1.Qt概述 1.1 什么是Qt 2.2 手动创建 2.3 pro文件 2.4 一个最简单的Qt应用程序        3 第一个Qt小程序 3.1 按钮的创建 3.2 对象模型(对象树)       3.3 Qt窗口坐标体系 4 信号和槽机制         4.1 系统自带的信号和槽 4.2 自定义信号和槽     4.3信号槽的拓展     

    2024年02月12日
    浏览(37)
  • 02 qt基本控件及信号和槽

    功能:显示一个字符串内容 主要接口函数 构造函数: 赋值运算符重载: 功能函数: 1)基本数据类型(int,float,double,char*)转换成字符串 number(long , int ) : QString number(int , int ) : QString number(uint , int ) : QString number(ulong , int ) : QString number(qlonglong , int ) : QString number(qulonglong , int

    2024年02月12日
    浏览(40)
  • QT基础之——ui文件以及信号和槽机制

            上一节我们讲了除界面文件ui文件其他的所有文件,这一节我们来介绍一下ui文件:在文件目录中我们能看到界面文件这一栏,点击展开我们可以看到一个以\\\".ui\\\"结尾的文件,双击我们会看到如下界面:         我们在右侧选中label和PushButton拖入到工作台上的窗口中,

    2024年04月08日
    浏览(65)
  • qt解决信号和槽连接时传递额外参数的问题

    QSignalMapper 是 Qt 框架中的一个类,用于解决信号和槽连接时传递额外参数的问题。当一个信号被触发时,QSignalMapper 可以将该信号与一个特定的参数关联起来,并将信号与对应的槽函数进行连接。 下面是关于 QSignalMapper 的一些详细解释: 1.作用: QSignalMapper 类的主要作用是在一

    2024年02月07日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包