首页 > 其他分享 >简单理解QT中的信号和槽

简单理解QT中的信号和槽

时间:2023-08-16 11:35:54浏览次数:40  
标签:layout QT 自定义 信号 理解 QWidget include public

信号和槽

信号和槽之间的连接,实现对象间的通信。

  • 信号是一个发出的动作或事件。

  • 槽是对应的响应动作。

  • 一个信号可以关联多个槽函数,信号也可以连接信号

  • 使用信号槽,类必须继承QObject。在类的定义开头需要添加宏定义Q_OBJECT

实现方式

  • 通过函数指针连接
connect(sender, SIGNAL(signal()), receiver, SLOT(slot()));
//参数1 发送者
//参数2 发出的信号
//参数3 接收者
//参数4 槽(用来响应)

新的语法

connect(sender, &SenderClass::signal, receiver, &ReceiverClass::slot);

断开连接:

disconnect(sender, &SenderClass::signal, receiver, &ReceiverClass::slot);

使用自定义信号和槽

class MyWidget : public QWidget {
    Q_OBJECT
public:
    // 自定义信号
    void customSignal(int value);

private slots:
    // 自定义槽函数
    void customSlot(int value);
};
connect(sender, &SenderClass::customSignal, receiver, &ReceiverClass::customSlot);

简单的例子

#include "mainwindow.h"

#include <QApplication>
#include <QDebug>
#include <QtWidgets/QtWidgets>
class CounterApp:public QWidget{

public:
    CounterApp(QWidget *parent = nullptr) : QWidget(parent) {
        count =110;
        // 创建界面元素
        QVBoxLayout *layout = new QVBoxLayout;
        QLabel *label = new QLabel("点击次数:");
        QPushButton *button = new QPushButton("增加");
        // 将按钮的点击信号连接到自定义的槽函数
        connect(button, &QPushButton::clicked, this, &CounterApp::incrementCount);

        // 将界面元素添加到布局
        layout->addWidget(label);
        layout->addWidget(button);
        setLayout(layout);
    }

private slots:
    void incrementCount() {
        count++;
        qDebug()<<"count"<<count;
    }

private:
    int count;
};
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    CounterApp c ;
    c.show();
    return a.exec();
}

标签:layout,QT,自定义,信号,理解,QWidget,include,public
From: https://www.cnblogs.com/doubleconquer/p/17621567.html

相关文章

  • 【QT 学习之路】事件
    事件(event)是由系统或者Qt本身在不同的时刻发出的。当用户按下鼠标、敲下键盘,或者是窗口需要重新绘制的时候,都会发出一个相应的事件。一些事件在对用户操作做出响应时发出,如键盘事件等;另一些事件则是由系统自动发出,如计时器事件。事件也就是我们通常说的“事件驱动(eventdrive)”......
  • 【单调队列】 单调队列的“扫描线”理解
    【单调队列】单调队列的“扫描线”理解  “如果一个选手比你小还比你强,你就可以退役了。”——单调队列的原理比你强,而且比你影响时间更长。某种意义上,数学思维是生活中的思考的延伸。  算法学习笔记(66):单调队列。引用Pecco的算法笔记。  在这里给出一种扫描线......
  • ABPvNext模块化理解(AI)
    来自你的消息:如何理解ABPvNext模块化?它是怎么实现模块化的?解决了什么问题?如果没有模块化会是什么场景?来自ChatAI的消息:ABPvNext是一种开发框架,它采用模块化的设计理念,使开发过程更加简单、灵活和可扩展。模块化是指将一个系统或应用程序拆分成多个独立的模块,每个模块都有自......
  • m扩展索引OFDM(Spread-OFDM-IM)matlab仿真,信号检测对比ZF,MMSE,ML等方法
    1.算法仿真效果matlab2022a仿真结果如下:     2.算法涉及理论知识概要        基于索引调制的OFDM(OFDM-IM,OFDMwithIndexModulation)技术被提出,在频率选择性衰落信道上提升了系统的分集增益,特别是在较低频谱效率场景下能够有效降低系统的误比特率。......
  • 原型链深入理解
      //原型链//1.原型->类//2.原型对象->类中属性与方法组成的一个对象//3.实例对象->创建的实例//4.如何互相转换//原型(它是一个函数)functionUser(){}console.log("原型:",User);User.prototype.username="test......
  • QT使用QML实现地图绘制虚线
    QML提供了MapPolyline用于在地图上绘制线段,该线段是实线,因此我使用Canvas自定义绘制的方式在地图上绘制线段,如图:鼠标在地图上点击后,在点击位置添加图标,当有多个图标被添加到地图上后,计算各个图标间的距离,并创建一个新的虚线线段组件,连接两个图标点,显示距离数值。如果对自定义图标......
  • java中对无参构造和有参构造的理解
    构造器的最大作用就是在创建对象时,对对象实例进行初始化。1.一个类即使什么都不写,也会存在无参构造方法。2.无参构造方法没有返回值类型,且方法名称和类名相同。比如:1publicclassStudent{2privateStringname;3privateintage;45publicvoidst......
  • 对线程池的理解
    线程池是一种并发编程的技术,它是管理和重用线程的一种机制,能够有效地提高多线程应用程序的性能和资源利用率。线程池维护一组可重用的线程,可以分配任务给这些线程来执行,从而避免了频繁地创建和销毁线程,减少了系统开销。以下是我对线程池的一些关键理解:线程池的组成:线程池由线......
  • QT:打印当前文件名,行号和函数名称
    定义:#include<QDebug>#definemyDebug()qDebug()<<tr("文件名:")<<__FILE__<<tr("行号:")<<__LINE__<<tr("函数名:")<<__FUNCTION__;在函数中执行myDebug()即可:voidMainWindow::doAction......
  • QT快捷键
    常用高频快捷键Ctrl+/ 多行注释/取消多行注释Ctrl+B 编译工程Ctrl+R 运行工程Ctrl+Alt+up(向上箭头) 当前行向上复制Ctrl+Alt+down(向下箭头) 当前行向下复制Ctrl+Shift+up(向上箭头) 整行向上移动Ctrl+Shift+down(向下箭头) 整行向下移动Ctrl+I 代码格式化对......