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-滑块位置的灰度