【QT实战】第二章 QT窗体之间值的传递,多种方法实现

❤️作者主页:凉开水白菜
❤️作者简介:共同学习,互相监督,热于分享,多加讨论,一起进步!
❤️文章代码:https://pan.baidu.com/s/1M8mTtkYD7wMTulvk-Ew5wA?pwd=j0q2
❤️点赞 👍 收藏 ⭐再看,养成习惯

订阅的粉丝可通过PC端左侧加我微信,可对文章的内容进行一对一答疑!


在桌面程序中很多时候会出现很多窗口,各个窗口中免不了会有数据的传输,下面给大家带来三种方法来实现QT的窗体数据传递。

1、新建工程

在这里插入图片描述新建工程过后添加一个新的窗口到工程中,实际目录结构如上,然后我们实现按钮方式打开新建的窗,在主窗口中包含副窗口的头,再添加子窗口的类到主窗口的成员变量中,然后我们添加一个按钮并通过槽函数的方式打开子窗口。
在这里插入图片描述
到这里我们要实现传值的工程就搭建完成了下面开始传值的方法实现。

2、全局变量extern

通过全局变量的方法来设置子窗口的标题设置,首先我们需要在主窗口的CPP文件中添加一个全局变量,然后在子窗口的构造函数中我们使用这个全局变量来设置窗口标题。
在这里插入图片描述

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

然后我们编译工程可以看到标题栏已经跟随主窗口CPP文件中的全局变量所更改了,下面我们将工程改变一下将子窗口类添加到父窗口成员变量中去方便我们调用
在这里插入图片描述在这里插入图片描述

3、公共成员函数public

接下来我们来实现通过调用公共成员函数的方法在主窗口中获取子窗口空间中的内容,我们先在主窗口和子窗口各添加一些控件,效果如下图:
在这里插入图片描述在这里插入图片描述然后我们在子页面添加一个公共成员函数用来获取编辑框的内容。

// 核心代码
class Dialog : public QDialog
{
    Q_OBJECT

public:
    explicit Dialog(QWidget *parent = nullptr);
    ~Dialog();

public:
    QString getFromText();

private:
    Ui::Dialog *ui;
};

QString Dialog::getFromText()
{
    return ui->lineEdit->text();;
}

然后我们在主窗口中来调用这个成员函数获得控件的值;

// 核心代码
void Widget::on_pushButton_2_clicked()
{
    ui->lineEdit->setText(w->getFromText());
}

在这里插入图片描述

4、信号与槽singnals

最后一个方法我们实现从子窗口来改变父窗口中编辑框中的内容,首先我们需要在子窗口类中发出一个senddata的信号,然后在主窗口中connect绑定这个信号在接受函数中将其内容设置到lineEdit上就可以实现这个效果,新建一个发送信号的按钮,然后再头文件中添加信号函数;

// 核心代码
signals:
   void sendDate(QString);


void Dialog::on_pushButton_clicked()
{
    sendDate(ui->lineEdit->text());
}

然后我们再主窗口中绑定该信号并将该信号传过来的内容设置到编辑框中;

// 核心代码
void Widget::on_pushButton_clicked()
{
    w = new Dialog();
    connect(w,SIGNAL(sendDate(QString)),this,SLOT(receiveData(QString)));
    w->show();
}

void Widget::receiveDate(QString date)
{
    ui->lineEdit->setText(date);
}

在这里插入图片描述

5、总结与工程分享

主窗口.cpp文件

#include "widget.h"
#include "ui_widget.h"

QString formTitle = "子窗口标题";

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

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


void Widget::on_pushButton_clicked()
{
    w = new Dialog();
    connect(w,SIGNAL(sendDate(QString)),this,SLOT(receiveDate(QString)));
    w->show();
}

void Widget::on_pushButton_2_clicked()
{
    ui->lineEdit->setText(w->getFromText());
}

void Widget::receiveDate(QString date)
{
    ui->lineEdit->setText(date);
}

主窗口头文件

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include "dialog.h"

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

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

private slots:
    void on_pushButton_clicked();

    void on_pushButton_2_clicked();

    void receiveDate(QString date);
private:
    Ui::Widget *ui;
    Dialog *w;
};
#endif // WIDGET_H

子窗口.cpp文件

#include "dialog.h"
#include "ui_dialog.h"

extern QString formTitle;

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

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

QString Dialog::getFromText()
{
    return ui->lineEdit->text();;
}

void Dialog::on_pushButton_clicked()
{
    sendDate(ui->lineEdit->text());
}

子窗口头文件

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>

namespace Ui {
class Dialog;
}

class Dialog : public QDialog
{
    Q_OBJECT

public:
    explicit Dialog(QWidget *parent = nullptr);
    ~Dialog();

public:
    QString getFromText();

private slots:
    void on_pushButton_clicked();

signals:
   void sendDate(QString);

private:
    Ui::Dialog *ui;
};

#endif // DIALOG_H

QT的核心就是信号与槽,所以上面的方法我更推荐使用第三种

完整工程下载:https://pan.baidu.com/s/1M8mTtkYD7wMTulvk-Ew5wA?pwd=j0q2 提取码:j0q2

五、最后

完整的代码工程我都放在百度云盘的软件里面,如果需要可以自行下载;

❤️专栏资料:https://pan.baidu.com/s/192A28BTIYFHmixRcQwmaHw 提取码:qtqt


我是凉开水白菜,我们下文见~

  • 37
    点赞
  • 145
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
### 回答1: Qt不同之间变量传递方法有很多种。 一、使用信号与槽机制 在Qt中,通过connect连接信号与槽,可以实现不同之间的变量传递。例如,当一个类中的变量改变时,可以通过emit发送一个信号,并在其他类中通过connect连接相应的槽函数,实现变量传递。这种方法尤其适合于不同之间交互较少的情况。 二、使用全局变量 全局变量可以在程序的任何地方访问,因此可以通过定义全局变量,在需要访问的类中直接使用。但是,全局变量存在两个显著问题:一个是可读性问题,全局变量存在于整个程序中,难以追踪;二是安全性问题,全局变量容易被误操作。 三、使用单例模式 单例模式是一种常用的设计模式,它可以保证一个类只有一个实例,并提供一个全局的访问点。通过使用单例模式,不同的类可以通过调用单例类的函数来获取需要的变量。这种方法比全局变量更安全,但也需要注意不要过度使用。 四、使用传参方式 当某个类需要使用另一个类的变量时,可以将需要使用的变量通过传参的方式传递给该类的函数,这种方式适用于变量的交互较为频繁的情况,但也需要注意过度传参可能会导致程序设计复杂化。 以上几种方法都可以实现不同之间的变量传递,但使用时需要根据具体的情况选择合适的方法。 ### 回答2: 在Qt中,不同之间变量的传递可以通过以下方式实现: 1. 使用信号和槽传递变量: 信号和槽是Qt的重要机制之一,它可以实现不同之间的通讯。在发送信号的类中定义一个信号,接收信号的类中定义一个槽函数,并将两者关联起来。在信号函数中传递变量,槽函数中接收变量即可实现变量传递。示例代码如下: //发送信号的类 class Sender: public QObject { Q_OBJECT signals: void sendVar(int var); //定义一个带参数的信号 }; //接收信号的类 class Receiver: public QObject { Q_OBJECT public slots: void receiveVar(int var); //定义一个带参数的槽函数 }; //在两个类中实现信号和槽的关联 connect(sender, &Sender::sendVar, receiver, &Receiver::receiveVar); 2. 使用全局变量传递变量: 全局变量可以在整个程序中访问,因此可以用于不同之间的变量传递。在定义全局变量的文件中声明变量并实现其访问方法,其他类中可以直接调用该变量,并通过访问方法获取或修改变量的。示例代码如下: //定义全局变量 extern int var; //声明访问方法 int getVar(); void setVar(int var); //在Sender类中获取和修改变量 int var = getVar(); setVar(var); //在Receiver类中获取和修改变量 int var = getVar(); setVar(var); 3. 使用构造函数和成员函数传递变量: 在创建一个类的对象时,可以通过其构造函数传递变量,在其他类中创建该对象并调用其成员函数获取或修改变量的。示例代码如下: //定义类 class MyClass { public: MyClass(int var): m_var(var) {} //定义构造函数传递变量 int getVar() { return m_var; } //定义成员函数获取变量 void setVar(int var) { m_var = var; } //定义成员函数修改变量 private: int m_var; }; //在Sender类中创建对象并获取和修改变量 MyClass myClass(var); int var = myClass.getVar(); myClass.setVar(var); //在Receiver类中创建对象并获取和修改变量 MyClass myClass(var); int var = myClass.getVar(); myClass.setVar(var);
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凉开水白菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值