QT:信号和槽01

news2024/12/27 3:59:09

QT中什么是信号和槽

概念解释
在 Qt 中,信号(Signals)和槽(Slots)是一种用于对象间通信的机制。信号是对象发出的事件通知,而槽是接收并处理这些通知的函数。
例如,当用户点击一个按钮时,按钮对象会发出一个 “clicked” 信号,这个信号可以连接到一个槽函数,槽函数可以是任何具有合适参数的成员函数,当信号被发射时,与之连接的槽函数就会被自动调用。
信号(Signals)
定义:信号是一个成员函数的声明,它只需要声明,不需要(也不应该)在类的定义中实现。信号没有函数体,它的声明使用signals关键字。

新建项目

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
完成后双击widget.ui文件

在设计模式中往界面上添加一个Label和一个Push Button
更改Label的显示文本为“主界面就是我!”​,更改按钮的显示文本为“切换子窗口”​

在这里插入图片描述
回到编辑模式打开widget.h文件,在Widget类定义的最后添加槽的声明:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

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

private:
    Ui::Widget *ui;

public slots:
    void showChildDialog();
};
#endif // WIDGET_H

槽一般使用slots关键字进行修饰,这里使用public slots 表示这个槽可以在类外被调用,现在需要实现该槽函数,快捷键是Alt+回车键,选择“重构→在widget.cpp添加定义”菜单项,编辑器便会转到widget.cpp文件中
在这里插入图片描述
编辑器便会转到widget.cpp文件中

#include "widget.h"
#include "ui_widget.h"
#include <QDialog>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    connect(ui->pushButton,&QPushButton::clicked,this,&Widget::showChildDialog);
}

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

void Widget::showChildDialog()
{
    QDialog *dialog = new QDialog(this);
    dialog->resize(400,400);
    dialog->setWindowTitle(tr("子窗口"));
    dialog->show();
}

然后在Widget类的构造函数添加信号和槽的关联:

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    connect(ui->pushButton,&QPushButton::clicked,this,&Widget::showChildDialog);
}

connect函数中的4个参数分别是发射信号的对象、发射的信号、接收信号的对象和要执行的槽。运行程序,然后单击主界面上的按钮,会弹出一个对话框。
在这里插入图片描述

自动关联

将showChildDialog重新命名为on_pushButton_clicked(),就是由字符on、发射信号的部件对象名和信号名组成

在Widget类的构造函数中删除connect()函数,
统一更改函数名快捷键:先在showChildDialog上右击,在弹出的快捷菜单中选择“重构→重命名光标所在符号”​,或者直接按下Ctrl+Shift+R快捷键,在出现的替换栏中输入on_pushButton_clicked,再单击Replace按钮就可以了。
在这里插入图片描述
现在运行程序,和前面的效果是一样的。

自动关联的方式比较简单,对于不是在Qt设计器中往界面上添加的部件,就要在调用setupUi()函数前定义该部件,而且要使用setObjectName()函数指定部件的对象名,这样才可以使用自动关联。在编写程序时一般使用第一种方式。

自定义对话框

首先向该项目中添加Qt设计器界面类。界面模板选择Dialog without Buttons,类名改为MyDialog。完成后在设计模式中向窗口上添加两个Push Button,并且分别更改其显示文本为“进入主界面”和“退出程序”​。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

使用设计器来实现“退出程序”按钮的信号和槽的关联。单击设计器

按下快捷键F4,则进入了部件的信号和槽的编辑模式。在“退出程序”按钮上按住鼠标左键,然后拖动到主窗口界面上,这时松开鼠标左键。在弹出的“配置连接 - Qt Creator”对话框中,选中“显示从QWidget继承的信号和槽”复选框,然后在左边的QPushButton栏中选择信号clicked(),在右边的QDialog栏中选择对应的槽close(),完成后单击“确定”按钮,
在这里插入图片描述

要想取消这个关联,只需在信号和槽编辑模式中选择这个关联,当它变为红色时,按下Delete键,或者右击后选择“删除”菜单项

设置好关联后,按下F3键,或者单击“编辑控件”图标,则回到部件编辑模式
在这里插入图片描述

设置“进入主界面”按钮的信号和槽的关联

在这里插入图片描述
在该按钮上右击,在弹出的快捷菜单中选择“转到槽”​,然后在弹出的对话框中选择clicked()信号,并单击“确定”按钮。这时便会进入编辑模式,并且定位到自动生成的on_pushButton_clicked()槽中。在其中添加代码
mydialog.cpp

#include "mydialog.h"
#include "ui_mydialog.h"

myDialog::myDialog(QWidget *parent)
    : QDialog(parent)
    , ui(new Ui::myDialog)
{
    ui->setupUi(this);
}

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

void myDialog::on_pushButton_clicked()
{
    accept();
}


这里讲述了两种关联信号和槽的方法,第一种方法是直接在设计器中进行关联,这更适合在设计器中的部件间进行。第二种方法是在设计器中直接进入相关信号的槽,这与前面讲到的手写函数是一样的,它用的就是自动关联,这样也会在.h文件中自动添加该槽的声明,我们只需更改其实现代码就可以了。在以后的章节中,如果在设计器中添加的部件要使用信号和槽,一般会使用第二种方法。

在主界面中使用自定义的对话框

首先更改main.cpp文件内容如下

#include "widget.h"

#include <QApplication>
#include "mydialog.h"
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    // Widget w;
    // w.show();

    // return a.exec();
    myDialog dialog;

    //  创建新对象
    if(dialog.exec() == QDialog::Accepted)
    {
        Widget w;
        w.show();
        return a.exec();
    }
    else
    {
        return 0;
    }


}

在主函数中建立了MyDialog对象,然后判断其exec()函数的返回值,如果是按下了“进入主界面”按钮,返回值应该是QDialog::Accepted,就显示主界面,并且正常执行程序;如果不是,则直接退出程序。

运行程序后可以发现,已经实现了从登录对话框到主界面,再从主界面显示一个对话框的应用了。
在这里插入图片描述

实现从主界面重新进入登录界面的功能

双击widget.ui文件,在设计模式中再向界面上添加两个Push Button,分别更改它们的显示文本为“重新登录”和“退出”​。
在这里插入图片描述
然后使用信号和槽模式将“退出”按钮的clicked()信号和Widget界面的close()槽关联。
完成后再转到“重新登录”按钮的clicked()信号的槽,并更改如下。

void Widget::on_pushButton_2_clicked()
{
    close();
    myDialog dlg;
    if(dlg.exec() == QDialog::Accepted)
    {
        show();
    }
}

需要说明的是,close()槽不一定使程序退出,只有当剩下最后一个主界面(就是没有父窗口的界面)时调用close()槽,程序才会退出;而其他情况下界面只是隐藏起来了,并没有被销毁。这里还需要包含MyDialog类的头文件#include “mydialog.h”,最后可以运行程序查看效果。

参考

《零基础学Ot 6编程》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2252777.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SQL面试50题

数据表关系图 数据表 CREATE TABLE student (id int(11) NOT NULL AUTO_INCREMENT,name varchar(255) NOT NULL,sex enum(female,male) NOT NULL,birth date NOT NULL,credit float(5,2) DEFAULT NULL,PRIMARY KEY (id) ) ENGINEInnoDB AUTO_INCREMENT25 DEFAULT CHARSETutf8;…

下载maven 3.6.3并校验文件做md5或SHA512校验

一、下载Apache Maven 3.6.3 Apache Maven 3.6.3 官方下载链接&#xff1a; 二进制压缩包&#xff08;推荐&#xff09;: ZIP格式: https://archive.apache.org/dist/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.zipTAR.GZ格式: https://archive.apache.org/dist/…

基于poi和javabean的excel读取

写在前面 示例写出时间&#xff1a;2024-12-02 这仅仅是excel读取的一个示例, 记录一下&#xff0c;这里也改了一下之前的导出&#xff0c;主要是为了兼容读取 之前的博客地址 基于poi和JavaBean的excel导出 poi依赖 <dependency><groupId>org.apache.poi</gr…

一键生成后端服务,MemFire Cloud重新定义开发效率

作为开发者&#xff0c;特别是独立开发者和小团队成员&#xff0c;大家都知道开发的最大难题之一就是搭建后端服务。要让一个应用从零开始&#xff0c;除了前端的开发工作外&#xff0c;还需要考虑数据库、接口、认证、存储等等一系列繁琐的后台工作。而MemFire Cloud这款神器&…

Maven、JAVAWeb、Servlet

知识点目标 1、MavenMaven是什么Maven项目的目录结构Maven的Pom文件Maven的命令Maven依赖管理Maven仓库JavaWeb项目 2.网络基础知识 3、ServletMaven Maven是什么 Maven是Java的项目管理工具&#xff0c;可以构建&#xff0c;打包&#xff0c;部署项目&#xff0c;还可以管理…

controller中的参数注解@Param @RequestParam和@RequestBody的不同

现在controller中有个方法&#xff1a;&#xff08;LoginUserRequest是一个用户类对象&#xff09; PostMapping("/test/phone")public Result validPhone(LoginUserRequest loginUserRequest) {return Result.success(loginUserRequest);}现在讨论Param("login…

Linux 内核系统架构

Linux 内核是一个复杂且高度模块化的系统&#xff0c;负责操作硬件资源、管理进程和内存、提供网络服务、执行文件系统操作、进行设备驱动程序的管理等。它为用户空间提供了一个抽象层&#xff0c;并为应用程序提供了底层服务。本文将深入探讨 Linux 内核的系统架构&#xff0c…

AI开发:逻辑回归 - 实战演练- 垃圾邮件的识别(二)

接上一篇AI开发&#xff1a;逻辑回归 - 实战演练- 垃圾邮件的识别&#xff08;一&#xff09; new_email 无论为什么文本&#xff0c;识别结果几乎都是垃圾邮件,因此我们需要对源码的逻辑进行梳理一下&#xff1a; 在代码中&#xff0c;new_email 无论赋值为何内容都被识别为…

WPF+MVVM案例实战与特效(三十)- 封装一个系统日志显示控件

文章目录 1、运行效果2、日志控件封装1、文件创建2、DisplayLogPanel.xaml 代码3、DisplayLogPanel.cs 代码4、数据模型5、枚举类型3、自定义控件使用1、LogPanelWindow.xaml2、LogPanelViewModel.cs4、总结1、运行效果 2、日志控件封装 1、文件创建 打开 Wpf_Examples ,在 …

VideoBooth: Diffusion-based Video Generation with Image Prompts

VideoBooth: Diffusion-based Video Generation with Image Prompts 概括 文章提出了一个视频生成模型VideoBooth&#xff0c;输入一张图片和一个文本提示词&#xff0c;即可输出保持图片中物体且符合文本提示词要求的视频。 方法 粗-细两阶段设计&#xff1a;1&#xff09;…

电子电气架构 --- 面向服务的汽车诊断架构

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 所有人的看法和评价都是暂时的,只有自己的经历是伴随一生的,几乎所有的担忧和畏惧,都是来源于自己的想象,只有你真的去做了,才会发现有多快乐。…

生成树详解(STP、RSTP、MSTP)

目录 1、STP 1.概述 2.基本概念 3.端口角色及其作用 4.报文结构 5.STP的端口状态 6.三种定时器 7.STP选举步骤 8.配置BPDU的比较原则 9.TCN BPDU 10.临时环路的问题 11.传统STP的不足 拓扑变更处理过程 2、RSTP 1.端口角色 2.端口状态 3.P/A&#xff08;Propo…

基于Python制作一个简易UI界面

基于Python制作一个简易UI界面 目录 基于Python制作一个简易UI界面1 原理简介2 编写程序3 程序测试 1 原理简介 这里用到了Python自带的UI库tkinter。 tkinter 是 Python 的标准 GUI&#xff08;图形用户界面&#xff09;库&#xff0c;用于创建和管理图形界面。它提供了一个简…

emp.dll丢失导致游戏/软件无法继续运行:详细描述emp.dll丢失原因并提供解决方案

emp.dll 并不是一个标准的 Windows 系统文件&#xff0c;也不是一个广泛认知的第三方库。因此&#xff0c;它可能是一个特定于某个应用程序或游戏的自定义 DLL 文件。如果 emp.dll 丢失导致了你的软件或游戏无法运行&#xff0c;这通常意味着该文件是程序正常运作所必需的。下面…

IDEA使用HotSwapHelper进行热部署

目录 前言JDK1.8特殊准备DECVM安装插件安装与配置参考文档相关下载 前言 碰到了一个项目&#xff0c;用jrebel启动项目时一直报错&#xff0c;不用jrebel时又没问题&#xff0c;找不到原因&#xff0c;又不想放弃热部署功能 因此思考能否通过其他方式进行热部署&#xff0c;找…

droppath

DropPath 是一种用于正则化深度学习模型的技术&#xff0c;它在训练过程中随机丢弃路径&#xff08;或者说随机让某些部分的输出变为零&#xff09;&#xff0c;从而增强模型的鲁棒性和泛化能力。 代码解释&#xff1a; import torch import torch.nn as nn # 定义 DropPath…

机器学习算法(六)---逻辑回归

常见的十大机器学习算法&#xff1a; 机器学习算法&#xff08;一&#xff09;—决策树 机器学习算法&#xff08;二&#xff09;—支持向量机SVM 机器学习算法&#xff08;三&#xff09;—K近邻 机器学习算法&#xff08;四&#xff09;—集成算法 机器学习算法&#xff08;五…

Ubuntu24.04初始化教程(包含基础优化、ros2)

将会不断更新。但是所有都是基础且必要的操作。 为重装系统之后的环境配置提供便捷信息来源。记录一些错误的解决方案。 目录 构建系统建立系统备份**Timeshift: 系统快照和备份工具****安装 Timeshift****使用 Timeshift 创建快照****还原快照****自动创建快照** 最基本配置换…

【Maven】Nexus私服

6. Maven的私服 6.1 什么是私服 Maven 私服是一种特殊的远程仓库&#xff0c;它是架设在局域网内的仓库服务&#xff0c;用来代理位于外部的远程仓库&#xff08;中央仓库、其他远程公共仓库&#xff09;。一些无法从外部仓库下载到的构件&#xff0c;如项目组其他人员开发的…

Gradle vs. Maven: 到底哪个更适合java 项目?

ApiHug ApiHug - API Design & Develop New Paradigm.ApiHug - API Design & Develop New Paradigm.https://apihug.com/ 首先 ApiHug 整个工具链是基于 gradle 构建,包括项目模版&#xff0c; 插件&#xff1b; 说到 Java 项目管理&#xff0c;有两个巨头脱颖而出&a…