首页 > 其他分享 >Qt学习笔记(二)Qt 信号与槽

Qt学习笔记(二)Qt 信号与槽

时间:2024-10-22 18:17:08浏览次数:3  
标签:Qt 笔记 关联 mainwindow 信号 MainWindow 函数

系列文章目录

Qt开发笔记(一)Qt的基础知识及环境编译(泰山派)
Qt学习笔记(二)Qt 信号与槽


文章目录

前言

  在学习 Qt 的过程中,信号与槽是必不可少的部分,也是 Qt 编程的
基础,是 Qt 编程的一大创新,这里分一个章节来学习这个 Qt 的信号与槽。


一、Qt 信号与槽机制

1.1 什么是信号和槽

  信号(Signal)就是在特定情况下被发射的事件,例如 PushButton 最常见的信号就是鼠标单击时发射的 clicked() 信号,一个 ComboBox 最常见的信号是选择的列表项变化时发射的CurrentIndexChanged() 信号。GUI 程序设计的主要内容就是对界面上各组件的信号的响应,只需要知道什么情况下发射哪些信号,合理地去响应和处理这些信号就可以了。
  槽(Slot)就是对信号响应的函数。槽就是一个函数,与一般的 C++函数是一样的,可以定义在类的任何部分(public、private 或 protected),可以具有任何参数,也可以被直接调用。槽函数与一般的函数不同的是:槽函数可以与一个信号关联,当信号被发射时,关联的槽函数被自动执行。
在这里插入图片描述

1.1 信号和槽的关联及断连

  信号与槽关联是用 QObject::connect() 函数实现的,它是connect() 是 QObject 类的一个静态函数,其基本格式是:

// 完整格式
QObject::connect(sender, SIGNAL(signal()), receiver, SLOT(slot()));

// 在实际调用时可以忽略前面的限定符
connect(sender, SIGNAL(signal()), receiver, SLOT(slot()));

  其中,sender 是发射信号的对象的名称,signal() 是信号名称。信号可以看做是特殊的函数,需要带括号,有参数时还需要指明参数。receiver 是接收信号的对象名称,slot() 是槽函数的名称,需要带括号,有参数时还需要指明参数。
  断开连接需要使用 disconnect()函数,其格式如下:

// 断开一切与 myObject 连接的信号或槽
bool QObject::disconnect(sender,SIGNAL(signal()), receiver, SLOT(slot()));

  信号与槽机制是 Qt GUI 编程的基础,使用信号与槽机制可以比较容易地将信号与响应代码关联起来。我们在平常编辑的时候可以直接利用UI设计器进行编辑(自动关联),当运行之后会自动生成Ui_MainWindow.h文件。
在这里插入图片描述
在这里插入图片描述

二、编辑槽函数

1. 自动关联

  右键我们的控件,选择转到槽,然后选择一个触发方式,之后便会在mainwindow.cpp文件下生成一个槽函数,并在mainwindow.h下进行申明。这里要特别注意,槽函数只能申明在private slots 或者public slots下
在这里插入图片描述
  在生成的on_connect_clicked( )槽函数中进行功能编辑,笔者这里是进行了一个打印功能。
在这里插入图片描述
  执行之后可以看到,下方的控制窗口已经打印出来了信息。
在这里插入图片描述

2. 手动关联

  这种方式需要用的我们上文提到的connect和disconnect函数,主要是服务于大型项目。它可以自定义更多槽函数功能和名称,具有极大的灵活性,同时由于所有界面都在代码中定义,避免了 UI 文件和逻辑代码分离带来的管理复杂性,所有人都能在代码中找到界面和逻辑。以下是手动关联的基本流程:

  1. 创建项目与 UI 设计
      假设你已经在 Qt Designer 中设计了一个简单的窗口(也可以纯代码编写),包含一个按钮 pushButton 和一个标签 label。
  2. 创建 C++ 类
      创建一个 C++ 类并添加信号的声明,通常是继承自 QMainWindow 或 QWidget。
// 头文件 mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

signals:
    void myCustomSignal();  // 声明自定义信号
    
private slots:  // 声明槽函数
    void onButtonClicked();
    
private:
    Ui::MainWindow *ui;  // UI 指针
};
#endif // MAINWINDOW_H
  1. 实现构造函数与析构函数
// 源文件 mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);  // 设置 UI

    // 手动连接信号与槽
    connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(onButtonClicked())); // 连接按钮的点击信号到槽
}

MainWindow::~MainWindow()
{
    delete ui;
}

  1. 实现槽函数
      在 mainwindow.cpp 中,实现槽函数,这部分同上文自动关联。

免责声明:本文参考了网上公开的部分资料,仅供学习参考使用,若有侵权或勘误请联系笔者。

标签:Qt,笔记,关联,mainwindow,信号,MainWindow,函数
From: https://blog.csdn.net/sincerelover/article/details/142997440

相关文章

  • 2024年软件设计师中级(软考中级)详细笔记【9】数据库技术基础(分值6分)
    目录前言第9章数据库技术基础(6分)9.1基本概念9.1.1数据库与数据库系统9.1.5数据库的三级模式结构9.2数据模型9.2.1数据模型的基本概念9.2.2数据模型的三要素9.2.3E-R模型9.2.4数据模型9.3关系代数9.3.1关系数据库的基本概念9.3.1.1关系模型9.3.25种基本的......
  • zkw 线段树学习笔记
    一、简介zkw线段树专门用于线段树卡常,同时码量比普通线段树要小。原理是通过将线段树补成完全二叉树,直接找到第\(i\)个叶子节点(编号为\(p+i\)),然后从下往上更新,从而避免递归。这里常数p=1<<(__lg(n)+1),编号为\(p\)和\(p+n+1\)的叶子为虚点,编号为\(p+1\simp+n\)的......
  • 用PyQt5中的textline实现log的实时显示
    在PyQt5中使用QLineEdit(即QTextLine的实现类之一)来实现日志的实时显示是可行的,但可能不适合大规模、多行日志的输出,因为QLineEdit仅支持单行文本。若要显示多行日志,建议使用QTextEdit,它更适合日志实时显示。但如果你确实希望使用QLineEdit来实现简单的日志输出,可以通......
  • 网络空间安全导论笔记
    分组密码分为对称分组密码和非对称分组密码,习惯上分组密码指对称分组密码加解密速度较快,安全性好子密钥生成的评价指标实现简单、速度快、满足轮函数F的要求种子密钥的所有比特对每个子密钥比特的影响大致相同轮函数F是分组密码的核心,是分组密码中单轮加解密函数准则......
  • 珂朵莉树学习笔记
    区间操作\(1.\)\(\left[L,R\right]\)区间加上一个数\(2.\)\(\left[L,R\right]\)区间赋值适用范围\(1.\)数据随机\((因为容易被卡)\)\(2.\)有区间赋值操作\((核心操作不然和暴力没什么区别了)\)\(3.\)骗分小技巧习题CF896C\((起源)\)CF915EP1840P4979P434......
  • 折半搜索学习笔记
    引入\(1.\text{以经典例题引入:}\)有一个长度为n的序列a,任选一些数求能组成的小于m的数的方案数(0不算)\(\quad\text{看完题目第一反应,这不就是裸01背包吗?m为容量}\)\(a_i\text{为价值和体积,轻松AC。}\)\(\quad\text{我们再来看一下数据范围}\n\le40\a_i\le10^9\m\le4*10^......
  • Tokio信号量:掌握并发控制的艺术
    在现代并发编程中,合理控制任务的并发执行是确保系统稳定性和资源有效利用的关键。Tokio,作为Rust生态中强大的异步运行时,为我们提供了一系列的同步原语,其中信号量(Semaphore)尤为强大。它允许我们精确控制对共享资源的并发访问,是实现限流和防止资源耗尽的理想工具。本文将深入......
  • btslab笔记
    本文只涉及漏洞的验证与解题思路不进行安装等基础教学1.vulnerability.injection.sqlinjectionurl:https://172.16.26.44/btslab/vulnerability/ForumPosts.php?id=1第一步:判断注入类型字符型还是数字型:GET/btslab/vulnerability/ForumPosts.php?id=1GET/btslab/vulnera......
  • 【开源免费】基于SpringBoot+Vue.JS读书笔记共享平台(JAVA毕业设计)
    本文项目编号T029,文末自助获取源码\color{red}{T029,文末自助获取源码}......
  • 学习笔记10.21
    使用AI提示语设计公式、AI优化、Markdown模版、提示语智能体R(角色)T(任务)F(要求)C(说明)公式举例eg:你现在是一位高校大学英语教师,(角色)设计大学英语《XXX》单元的教学计划,(任务)给出教学目标、教学大纲、单元活动安排,教学策略,布置学生作业。(要求)要求按照5E教学策略设计教学活......