QT基础【6-跨界面发送信号】

news/2025/3/14 17:57:23/

在这里插入图片描述

在这里插入图片描述

🌈个人主页:godspeed_lucip
🔥 系列专栏:QT从基础到进阶


  • 1 跨界面发送信号
    • 1.1 例子
    • 1.2 界面效果
    • 1.3 总体思路
    • 1.4 添加一个新界面
    • 1.5 自定义信号
    • 1.6 槽函数
    • 1.7 详细代码
  • 2 总结


1 跨界面发送信号

1.1 例子

目标实现这样的功能:一个界面显示数字,另外一个界面有按钮,按一下之后数字加1。

1.2 界面效果

一个QLineEdit显示数字

image-20240130195656749

打开弹窗之后,按下自增键,主窗口显示数字会加1

image-20240130195812566

1.3 总体思路

按下主窗口按钮,会出现子窗口:只需要让按钮绑定槽函数,在槽函数中创建一个子窗口对象并让其显示即可

按下子窗口”自增“按钮,父窗口数字加1:自定义一个信号value_add,"自增"按钮按下,就发送信号。同时将此信号与父窗口的handle_value_add函数绑定,该函数负责更新QLineEdit中的值。

父窗口更新value后,同时发送自定义信号send_value,将value值发送,同时将子窗口与该信号绑定,以便于子窗口更新它的value值

1.4 添加一个新界面

点击项目->右键->添加新文件->Qt->Qt设计器界面类->确定

image-20240129232826511

选择没有多余控件的界面。

image-20240129233147860

随便起一个名字

image-20240129233238146

点击确定完成创建

image-20240129233310240

UI界面添加一个按钮即可。

image-20240129233547417

1.5 自定义信号

  1. 使用signals声明
  2. 返回值是void,只需要声明,不需要实现
  3. 在需要发送的地方使用:emit 信号名字(参数);进行发送
  4. 在需要链接的地方使用connect进行链接
  5. 可以有参数,可以重载

1.6 槽函数

  1. 5.4版本以下,必须要写到Public slots下。高级版本下,既可以写到public slots,也可以写到全局下。

  2. 返回值是void,需要声明也需要实现

  3. 可以由参数,可以发生重载

1.7 详细代码

项目代码下载链接:提取码:ikun

注意:子窗口发送信号的函数中参数列表必须与父窗口接受信号的槽函数中参数列表保持一致。否则会接受不到,导致错误

(Qt Creator中自动生成的代码就没有全部写上来了)

manwindow.h

class MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();void handle_value_add(int value); //处理value加一的信号的槽函数。这类函数不需要定义在public slots中signals: //信号都需要定义在signals中void send_value(int value); //将value值发送给子窗口的信号public slots:void on_btnOpen_clicked(); //槽函数,也就是只依据函数名就自动实现绑定、无须手动实现的函数,必须要定义在public slots里面。UI中按钮控件为btnOpenprivate:Ui::MainWindow *ui;
};

mainwindow.cpp

void MainWindow::handle_value_add(int value){//让value值显示在界面上this->ui->lineEdit->setText(QString::number(value));int val = this->ui->lineEdit->text().toInt();emit this->send_value(val);
}void MainWindow::on_btnOpen_clicked(){ //注意这个事件不要写成on_btnOpen_click()setDialog *setWindow = new setDialog(this); //弹窗对象,填上this之后,该对象就和主窗口在同一个对象树上,可以由系统自动实现空间回收等int value = this->ui->lineEdit->text().toInt(); //获取初始值,并转换为int数值类型setWindow->set_value(value); //将子窗口的初始值设置为上面显示的//将子窗口的信号函数绑定//当MainWindow发送send_value信号时,setWindow对象的handle_send_value会运行connect(this,&MainWindow::send_value,setWindow,&setDialog::handle_send_value);//当sewtWindow发送value_add信号时,mainwddow对象的handle_value_add会运行connect(setWindow,&setDialog::value_add,this,&MainWindow::handle_value_add);setWindow->exec(); //窗口事件循环,相当于显示窗口。会阻塞代码的执行
}

setWindow.h

class setDialog : public QDialog
{Q_OBJECTpublic:explicit setDialog(QWidget *parent = nullptr);~setDialog();void set_value(int value); //设置valueint get_value();void handle_send_value(int value); //子窗口处理父窗口发送value的信号的槽函数private slots:void on_btnAdd_clicked(); //子窗口按钮被按下的槽函数signals: //自定义信号,写到signals下。value+1的信号是由子窗口发出的,当然要写在子窗口的头文件中void value_add(int value);private:int value;Ui::setDialog *ui;
};

setWindow.cpp

void setDialog::on_btnAdd_clicked(){ //ui中按钮控件名为btnAdd//按下按钮,就发送信号int val = this->get_value();val++;emit this->value_add(val);
}void setDialog::handle_send_value(int value){ //父窗口发送,则把自己的value设为父窗口lineEdit中的值//如果不更新value,那么子窗口发送给父窗口的value会一直是一样的this->set_value(value);
}void setDialog::set_value(int value){this->value = value; //设置value值
}int setDialog::get_value(){return this->value;
}

2 总结

在代码的舞台上翩翩起舞, Qt,如诗如画,编织梦的彩虹。

跨越平台的轻盈舞姿, 文档的琴音,灵感的涟漪。

模块的花瓣,细腻而丰满, 开发者的心灵,在那里盛开。

清新而深邃,如林中明月, Qt,用优雅的笔触,谱写未来的篇章。

渴望挑战Qt的学习路径和掌握进阶技术?不妨点击下方链接,一同探讨更多Qt的奇迹吧。我们推出了引领趋势的💻QT专栏:《QT从基础到进阶》 ,旨在深度探索Qt的实际应用和创新。🌐🔍

在这里插入图片描述

在这里插入图片描述


http://www.ppmy.cn/news/1357452.html

相关文章

Unity创建脚本等待很久的解决方法

创建脚本时出现 EditorApplication.update: Unity,PlasticsCM,Editor,WI.EditorDispatcher.Update Waiting for Unitys code in Unity,PlasticsCM,Editordl to finish executing. 这是因为在创建项目时勾选了版本管理 在目前的学习状态这个没用什么用,取消勾选即可…

【git】提交信息写错了,使用 amend 或者 reset 修改最近一次的提交信息 ,修改上上次/以前的提交信息

如果你的提交信息写错了,比如下面,你想修改【初始化项目】这5个字 修改最近一次的提交新的两个办法 (1)使用 reset 把这个提交重置,然后重新提交,reset 的使用方法请参考这篇文章。但是 reset 这种方法只能…

js设计模式:原型模式

作用: 使用js特有的原型链机制,可以通过Object.create方法创建新对象,将一个对象作为另外一个对象的原型 也可以通过修改原型链上的属性,影响新对象的行为 可以更方便的创建一些对象 示例: let obj {getName: function(){return this.name},getAge:function(){return this…

Map集合体系(HashMap,LinkedHashMap,TreeMap)

目录 1.Map集合 2.hashMap集合 3.LinkedHashMap集合 4. TreeMap集合 1.Map集合 Map集合是键值对集合 格式:{key1value1, key2value2, key3value3, ...} Map系列集合的特点都是由键决定的,值只是一个附属品,值不做要求 2.实现类有哪些&am…

机器人十大前沿技术(2023-2024年)

2023-2024年机器人十大前沿技术 1. 具身智能与垂直大模型 具身智能是指拥有自主感知、交互和行动能力的智能体,能够与环境进行实时互动,从而实现对环境的理解和适应。 “大模型”是指在深度学习和人工智能领域中,使用大量参数和数据进行训…

【设计模式】单例模式 Singleton Pattern

目录 遇到问题 浓缩成需求 单例模式的实现方式 一、懒汉方式A(懒加载线程不安全) 二、懒汉方式B(懒加载&线程安全) 三、预加载方式(预加载线程安全) 四、双重锁方式(懒加载线程安全&a…

各种手型都合适,功能高度可定制,雷柏VT9PRO mini和VT9PRO游戏鼠标上手

去年雷柏推出了一系列支持4KHz回报率的鼠标,有着非常敏捷的反应速度,在游戏中操作体验十分出色。尤其是这系列4K鼠标不仅型号丰富,而且对玩家的操作习惯、手型适应也很好,像是VT9系列就主打轻巧,还有专门针对小手用户的…

【Unity】五子棋AI博弈算法实讲

大家好!五子棋是我们在学习生活中比较常见的棋类游戏之一。两人对弈,一黑一白,下在棋盘的交叉点上,横竖斜形成五子连珠即可获胜。也许有的同学编程的入门之作就是做一款五子棋,我刚好在项目开发过程中,有涉…