QT:复杂结构体不同窗口间传递

QT:复杂结构体不同窗口间传递(父传子,子传父)


(父传子)


在写程序时,难免会碰到多窗体之间进行传值的问题,今天主要谈一下复杂结构体传值的问题(网上有很多博客,看的头疼,本篇进行详细解读)。
具体原理不会讲,直接上流程:
1.首先新建你的主窗口(我建了一个按钮,lineEdit和Qlabel)。
在这里插入图片描述
2. 建立你的子窗口,在一个工程下(目的是将子窗口的字符串和数字分别传递如主窗口的lineEdit和Qlabel)
在这里插入图片描述
在这里插入图片描述
3. 在主窗口的.h文件中包含子窗口的头文件。
在这里插入图片描述
4.定义主窗口“弹出按钮”的槽函数,链接子窗口
《1》查看子窗口的类名:
在这里插入图片描述
《2》在主窗口新建指向子窗口的指针,并在主窗口的构造函数中初始化
在这里插入图片描述
在这里插入图片描述
《3》定义主窗口按钮的槽函数链接子窗口,并实现代码。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
此时,已经完成了弹出功能
在这里插入图片描述
4. 在子窗口的.h头文件中定义一个结构体(Q_DECLARE_METATYPE用于注册(必须有)
在这里插入图片描述
5. 在子窗口定义一个信号和槽函数(信号用于发射信息,槽函数用于响应子窗口的按钮,
并包含对应头文件#include )
在这里插入图片描述
在这里插入图片描述
6. 定义子窗口的链接,和槽函数
在这里插入图片描述
实现槽函数
在这里插入图片描述
7. 在主窗口中定义一个接受子窗口发出信号的槽函数,并进行链接,实现。
在这里插入图片描述
在这里插入图片描述
实现
在这里插入图片描述
8.大功告成了
在这里插入图片描述
接下来贴上源码:

//main_dialog.h
#pragma once

#include <QtWidgets/QDialog>
#include "ui_main_dialog.h"
#include "son_dialog.h"

class main_dialog : public QDialog
{
    Q_OBJECT

public:
    main_dialog(QWidget *parent = Q_NULLPTR);
public slots:
    void open_son_dia();
	void dispaly(QVariant result);
private:
    Ui::main_dialogClass ui;
	son_Dialog *son_dia;
};

//main_dialog.cpp
#include "main_dialog.h"

main_dialog::main_dialog(QWidget *parent)
	: QDialog(parent)
{
	ui.setupUi(this);
	son_dia = new son_Dialog;
	connect(ui.pushButton, SIGNAL(clicked()), this, SLOT(open_son_dia()));
	connect(son_dia, SIGNAL(send_data(QVariant)), this, SLOT(dispaly(QVariant)));
}
void main_dialog::open_son_dia(){
	son_dia->show();//弹出窗口
	son_dia->setModal(true);//让子窗口处于模态(可有可无)
}
void main_dialog::dispaly(QVariant result){
	store_data final_data;
	final_data = result.value<store_data>();
	ui.lineEdit->setText(final_data.str);
	ui.label->setNum(final_data.num);
}
//main.cpp
#include "main_dialog.h"
#include <QtWidgets/QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    main_dialog w;
    w.show();
    return a.exec();
}

//son_dialog.h
#ifndef SON_DIALOG_H
#define SON_DIALOG_H

#include <QDialog>
#include <QVariant>
struct store_data
{
	int num;//存储数字
	QString str;//存储字符
};
Q_DECLARE_METATYPE(store_data);

namespace Ui {
class son_Dialog;
}

class son_Dialog : public QDialog
{
    Q_OBJECT
signals:
	void send_data(QVariant);
public slots:
    void push_slots();

public:
    explicit son_Dialog(QWidget *parent = 0);
    ~son_Dialog();

private:
    Ui::son_Dialog *ui;

};

#endif // SON_DIALOG_H

//son_dialog.cpp
#include "son_dialog.h"
#include "ui_son_dialog.h"

son_Dialog::son_Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::son_Dialog)
{
    ui->setupUi(this);
	connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(push_slots()));
}

son_Dialog::~son_Dialog()
{
    delete ui;
}
void son_Dialog::push_slots(){
	store_data data;//结构体实例化
	QVariant variance;//将结构体打包入QVariant再进行传递
	data.num = (ui->lineEdit_2->text()).toInt();//获取的为字符串,转化为int
	data.str = ui->lineEdit->text();
	variance.setValue(data);
	emit send_data(variance);//发出信号
}

文章主要对复杂结构体的传递进行了详述,熟练后就可以自由发挥了,嘿嘿,这种结构体传递的方式在软件中很常见,如下:
在这里插入图片描述
运行结果(调整过点号)
在这里插入图片描述


(子传父)


雷同于父传子,也是定义信号和槽函数,有区别的是:父传子是在父窗口中,父窗口定义信号,定义链接函数,子窗口定义槽函数和实现函数。
(1)父窗口的信号函数
在这里插入图片描述
(2)在父窗口中定义子窗口的指针(子窗口没法定义父窗口指针),并初始化
在这里插入图片描述
在这里插入图片描述
(3)链接函数,四个对象分别为1,父窗口指针(this) 2,父窗口信号(父窗口定义) 3.子窗口指针(父窗口定义) 4.子窗口槽函数(在子窗口定义)
在这里插入图片描述
(4)父窗口发送信号(下图表示:在打开影像线性增强界面的同时发送一个父窗口传递到子窗口的整型值)
在这里插入图片描述
(5)子窗口定义一个接收父窗口整型value的槽函数,并实现它(下图是根据影像的信息传递一个滑块的初值)。
在这里插入图片描述
在这里插入图片描述
(6)结果展示:
在这里插入图片描述
子窗口表示初始影像的最大灰度值为255,
在这里插入图片描述
将影像整体灰度值线性压缩至0-滑块位置的灰度
在这里插入图片描述

  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值