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

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



1 跨界面发送信号

1.1 例子

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

1.2 界面效果

一个QLineEdit显示数字

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

1.3 总体思路

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

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

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

1.4 添加一个新界面

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

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

随便起一个名字

点击确定完成创建

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

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_OBJECT
        
public:
    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中按钮控件为btnOpen
    
private:
    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_OBJECT
public:
    explicit setDialog(QWidget *parent = nullptr);
    ~setDialog();
    void set_value(int value); //设置value
    int 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的实际应用和创新。🌐🔍

相关文章
|
2月前
|
存储 安全 编译器
【Qt 底层机制之信号和槽 】深入探究Qt信号和槽背后的原理
【Qt 底层机制之信号和槽 】深入探究Qt信号和槽背后的原理
504 4
|
2月前
【Qt 学习笔记】按钮实现helloworld | 信号与槽概述
【Qt 学习笔记】按钮实现helloworld | 信号与槽概述
49 0
|
2月前
|
编译器 C++ 开发者
QT基础【7-跨进程发送信号】
QT基础【7-跨进程发送信号】
|
2月前
QT自定义信号,信号emit,信号参数注册
使用signals声明返回值是void在需要发送信号的地方使用emit 信号名字(参数)进行发送在需要链接的地方使用connect进行链接ct进行链接。
30 0
QT自定义信号,信号emit,信号参数注册
|
2月前
|
存储 API C++
【Qt 信号槽】深入探索 Qt 信号和槽机制中的引用传递“ (“A Deep Dive into Reference Passing in Qt Signal and Slot Mechanism“)
【Qt 信号槽】深入探索 Qt 信号和槽机制中的引用传递“ (“A Deep Dive into Reference Passing in Qt Signal and Slot Mechanism“)
172 0
|
2月前
|
安全 编译器 开发者
【Qt 学习笔记】Qt信号和槽的其他说明及Lambda表达式
【Qt 学习笔记】Qt信号和槽的其他说明及Lambda表达式
74 0
|
1月前
|
安全 C++ Windows
Qt信号与槽机制
Qt信号与槽机制
20 1
|
11天前
|
C++
Qt信号和槽
Qt信号和槽
14 2
|
4天前
|
C++
Qt中的信号与槽如何学习?(包括自定义信号)这篇文章告诉你
以现实中的事件来举例的话,例如有两把不同颜色的信号枪,分别是红色,绿色,打响不通颜色的信号枪会触发不同的槽发生,比如说打响红色这个人就跑步,绿色就走步,但是还有一个很重要的机制,那就是连接,我们需要把信号枪去跟这个人的动作连接起来。 如果上面理解没问题的话我们可以把信号和槽看成两个工具,我们最重要的是如何去把这两个工具连接起来。 它的作用可以让我们更加灵活的去使用不同窗口间的切换以及某些事件的连接。