当前位置: 首页 > article >正文

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

系列文章目录

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


文章目录

  • 系列文章目录
    • @[TOC](文章目录)
  • 前言
  • 一、Qt 信号与槽机制
    • 1.1 什么是信号和槽
    • 1.1 信号和槽的关联及断连
  • 二、编辑槽函数
    • 1. 自动关联
    • 2. 手动关联

前言

  在学习 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 中,实现槽函数,这部分同上文自动关联。

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


http://www.kler.cn/news/365343.html

相关文章:

  • 入侵检测算法平台部署LiteAIServer视频智能分析平台行人入侵检测算法
  • 设计模式: Pimpl(Pointer to Implementation)
  • Servlet(三)-------Cookie和session
  • MySQL 初阶——多版本控制 MVCC
  • 当当平台商品详情接口技术实现与代码示例
  • Axios 基本使用
  • sqli-labs靶场安装以及刷题记录-docker
  • 应用假死?
  • HTTP和HTTPS基本概念,主要区别,应用场景
  • 华为配置 之 IPv6路由配置
  • Rust求解八皇后问题
  • C# 文档打印详解与示例
  • 三维管线管网建模工具MagicPipe3D V3.5.3
  • Clickhouse 笔记(一) 单机版安装并将clickhouse-server定义成服务
  • 【华为HCIP实战课程十四】OSPF网络中LSA过滤,网络工程师
  • [网络协议篇] UDP协议
  • docker部署rustdesk
  • Linux系统中使用yum命令高效更新镜像源的步骤
  • 等保测评:安全计算环境的详细讲解
  • React第十一章(useReducer)
  • 语音识别——使用Vosk进行语音识别
  • Angular 保姆级别教程高阶应用 - RxJs
  • 在Milvus中管理标量Indexes
  • docker 下载netcore 镜像
  • springboot044美容院管理系统(论文+源码)_kaic
  • 处理Hutool的Http工具上传大文件报OOM