首页 > 其他分享 >QT信号与槽机制

QT信号与槽机制

时间:2024-09-21 22:50:58浏览次数:10  
标签:QT 信号 圆球 Dialog new 机制 include mLay

写在开头:
我们可以去这个网站进行学习C++的相关知识:https://github.com/0voice

目录

信号与槽机制连接方式

信号与槽机制连接方式

  • 一个信号可以跟另一个信号相连:

    connect(object1, SIGNAL(signal1), object2, SIGNAL(signal1));

    作用: 这里 object1 发出 signal1 信号时,会自动触发 object2signal2 信号。

    用途: 这种方式常用于信号链路,即当一个信号发出后,进一步发出另一个信号。这种模式可以用于多级事件处理或通知多个对象某一事件的发生。

  • 同一个信号跟多个槽相连

    connect(object1, SIGNAL(signal2), object2, SIGNAL(slot2));
    connect(object1, SIGNAL(signal2), object3, SIGNAL(slot1));

作用: object1 发出 signal2 信号时,会同时调用 object2slot2() 函数和 object3slot3() 函数。

用途: 这种模式非常适合需要多个对象对同一事件做出反应的场景。例如,当用户点击一个按钮时,多个操作(如保存数据、更新UI等)需要同时执行。

常用链接方案通常采用:

connect(object1, SIGNAL(signal), object2, SLOT(slot));

案例:计算球体的体积:

dialog.h

#ifndef DIALOG_H
#define DIALOG_H
​
// 引用标签、命令按钮对应头文件
#include <QDialog>
#include <qpushbutton.h>
#include <qlineedit.h>
#include <qlabel.h>
#include <QLabel>
​
QT_BEGIN_NAMESPACE
namespace Ui { class Dialog; }
QT_END_NAMESPACE
​
class Dialog : public QDialog
{
    Q_OBJECT
​
public:
    Dialog(QWidget *parent = nullptr);
    ~Dialog();
​
private:
    QLabel *lab1, *lab2;    // 创建两个标签,lab1用来作为提示语,lab2用来显示计算结果
    QLineEdit *lEdit;       // lEdit用来输入文本
    QPushButton *pbt;       // 这个是按钮
    Ui::Dialog *ui;
​
private slots:
    void CalcBallVolume();      // 槽函数计算圆球的体积
};
#endif // DIALOG_H

dialog.cpp

#include "dialog.h"
#include "ui_dialog.h"
const static double PI = 3.1415;
#include <QGridLayout>      // 用于表格布局
​
Dialog::Dialog(QWidget *parent)     // Dialog的有参构造函数
    : QDialog(parent)
    , ui(new Ui::Dialog)
{
    // 创建一个标签(提示用户输入圆球的半径)
    lab1 = new QLabel(this);
    lab1->setText(tr("请输入圆球的半径"));
    ui->setupUi(this);
​
    // 创建第二个标签(专门用来显示计算圆球的体积)
    lab2 = new QLabel(this);
​
    // 创建一个编辑框控件(专门用于接受用户的输入圆球半径的值)
    lEdit = new QLineEdit(this);
​
    // 创建命令按钮
    pbt = new QPushButton(this);
    pbt->setText(tr("计算圆球体积"));
​
    // 表格布局
    QGridLayout *mLay = new QGridLayout(this);
    mLay->addWidget(lab1, 0, 0);    // 把第一个标签放在左上角
    mLay->addWidget(lEdit, 0, 1);   // 把输入文本的操作放在右上角
    mLay->addWidget(lab2, 1, 0);     // 把结果放在左下角
    mLay->addWidget(pbt, 1, 1);     // 计算球的体积的按钮放在右下角
​
    // 让信号和槽函数进行关联
    connect(lEdit, SIGNAL(textChanged(QString)), this, SLOT(CalcBallVolume()));
}
​
Dialog::~Dialog()
{
    delete ui;
}
​
​
// 计算球体体积的函数
void Dialog::CalcBallVolume(){
    bool isLoop;
    QString tempStr;
    QString valueStr=lEdit->text();
​
    int valueInt = valueStr.toInt(&isLoop);
    double dVSum = 4.0/3.0 * PI * valueInt * valueInt * valueInt;
    lab2->setText(tempStr.setNum(dVSum));
​
}

main.cpp

#include "dialog.h"
​
#include <QApplication>
​
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Dialog w;
​
    w.setWindowTitle("计算圆球的体积:");       // 设置题目
    w.show();       // 显示对话框        
    return a.exec();
}
​

注意:这个是程序员一输入数字就会马上显示,不用点击按钮,如果我们需要点击按钮的话,可以把dialog.cpp改成这样:

#include "dialog.h"
#include "ui_dialog.h"
const static double PI = 3.1415;
#include <QGridLayout>      // 用于表格布局
​
Dialog::Dialog(QWidget *parent)     // Dialog的有参构造函数
    : QDialog(parent)
    , ui(new Ui::Dialog)
{
    // 创建一个标签(提示用户输入圆球的半径)
    lab1 = new QLabel(this);
    lab1->setText(tr("请输入圆球的半径"));
    ui->setupUi(this);
​
    // 创建第二个标签(专门用来显示计算圆球的体积)
    lab2 = new QLabel(this);
​
    // 创建一个编辑框控件(专门用于接受用户的输入圆球半径的值)
    lEdit = new QLineEdit(this);
​
    // 创建命令按钮
    pbt = new QPushButton(this);
    pbt->setText(tr("计算圆球体积"));
​
    // 表格布局
    QGridLayout *mLay = new QGridLayout(this);
    mLay->addWidget(lab1, 0, 0);    // 把第一个标签放在左上角
    mLay->addWidget(lEdit, 0, 1);   // 把输入文本的操作放在右上角
    mLay->addWidget(lab2, 1, 0);     // 把结果放在左下角
    mLay->addWidget(pbt, 1, 1);     // 计算球的体积的按钮放在右下角
​
    // 让信号和槽函数进行关联
    connect(pbt, &QPushButton::clicked, this, &Dialog::CalcBallVolume);
}
​
Dialog::~Dialog()
{
    delete ui;
}
​
​
// 计算球体体积的函数
void Dialog::CalcBallVolume(){
    bool isLoop;
    QString tempStr;
    QString valueStr=lEdit->text();
​
    int valueInt = valueStr.toInt(&isLoop);
    if(isLoop){
        double dVSum = 4.0/3.0 * PI * valueInt * valueInt * valueInt;   // 计算球体的体积
        lab2->setText(tempStr.setNum(dVSum));       // 然后将结果放在标签上去
    }else{
        // 如果不行的话,显示输入无效
        lab2->setText(tr("请输入有效数字"));
    }
​
​
}
​

总结:

一个信号可以跟多少信号进行连接,也可以只跟一个信号进行连接

 常用链接方案通常采用:

connect(object1, SIGNAL(signal), object2, SLOT(slot));

标签:QT,信号,圆球,Dialog,new,机制,include,mLay
From: https://blog.csdn.net/m0_74655006/article/details/142426118

相关文章

  • QT字符串类应用与常用数据类型:
    写在开头:我们可以去这个网站进行学习C++的相关知识:https://github.com/0voice目录1、Qt字符串类应用(1)操作字符串的方式(2)查询字符串的方式:2、Qt常见基本数据类型(注意:定义在#include)总结:1、Qt字符串类应用(1)操作字符串的方式第一:QString提供一个二元的“+”操作......
  • 带你0到1之QT编程:十五、探索QSplitter和QDockWidget的简单应用技巧
    此为QT编程的第十五谈!关注我,带你快速学习QT编程的学习路线!每一篇的技术点都是很很重要!很重要!很重要!但不冗余!我们通常采取总-分-总和生活化的讲解方式来阐述一个知识点!码农不易,各位学者学到东西请点赞支持支持!开始部分:总:QSplitter提供的是一种灵活的可拖拉布局方式来管......
  • Qt表格入门
    摘要    表格作为数据展示的界面,会在很多场景下使用。Qt为我们提供了使用简单方便和扩展性强的表格视图,这里做一个简单的入门整理。    个人能力有限,有错误欢迎留言指正,如果你有更好的方法,也欢迎分享讨论。关键词    Qt、表格、过滤、筛选、自定义单元格、排序......
  • Android RecyclerView 缓存机制深度解析与面试题
    本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点引言RecyclerView是Android开发中用于展示列表和网格的强大组件。它通过高效的缓存机制,优化了滑动性能和内存使用。本文将深入探讨RecyclerView的缓存机制,并......
  • Linux中的进程信号
    在Linux系统中,信号是一种用于进程间通信和进程控制的机制,它允许系统内核和用户进程对其他进程进行通知、干预和控制。信号可以被用于各种用途,例如终止进程、暂停进程、捕捉异常以及处理用户自定义事件。为了更好地理解进程信号,我们将从以下几个方面进行探讨:信号的基本概念:什么是......
  • MySQL数据库日志之WAL机制和Buffer Pool
    WAL机制(Write-Ahead-Logging)先磁盘之前先写入日志文件到磁盘,也就是redolog中的后台系统线程,每1秒进行一次对redologBuffer刷盘操作。标准的UndoLog这一步是靠WAL实现的,也就是要求Undo写入先于数据落盘。对于,undolog的WAL机制,只是相对于提交事务后的刷盘和......
  • 自注意力机制(1)
    自注意机制1.自注意机制的特点考虑这样一个问题,输入长度为m的序列\(\{x_1,x_2,...,x_m\}\),序列中的元素都是向量,要求输出长度同样为m的序列\(\{c_1,c_2,...,c_m\}\),另外还有两个要求:序列的长度m是不确定的,可以动态变化,但是神经网络的参数数量不能变。输出的向量\(c_i\)不......
  • 深入理解CAS机制
    CAS(Compare-and-Swap)是一种无锁算法,常见于无锁数据结构的实现中,以实现多线程环境下的原子操作。广泛应用于并发控制中,特别是在实现线程安全的数据结构和算法时。一、CAS原理CAS机制全称是Compare-and-Swap,即比较并替换。它的基本思想是通过比较内存中的值与预期值,如果相等则更新......
  • Qt 文本抗锯齿
    1.通常情况下,在paintEvent中绘制文本时,不管是否设置抗锯齿选项,都不会有明显的锯齿,如下代码所示, Antialiasing/TextAntialiasing对最终的效果没有显著影响.QFontft=painter.font();ft.setFamily("PingFangSC");ft.setPixelSize(13);ft.setW......
  • YOLOv8改进 - 注意力篇 - 引入ECA注意力机制
    一、本文介绍作为入门性第一篇,这里介绍了ECA注意力在YOLOv8中的使用。包含ECA原理分析,ECA的代码、ECA的使用方法、以及添加以后的yaml文件及运行记录。二、ECA原理分析ECA官方论文地址:ECA文章ECA的pytorch版代码:ECA的pytorch代码ECA注意力机制:深度卷积神经网络的高效通......