Qt 中两个窗口使用信号与槽传递参数 分别在主从窗口中实现 connect

实验准备:

有两个窗口: mw1 和 mw2

实验目的:

将mw1 中的数据通过信号与槽机制传递给mw2

想要观察的现象:

分别在mw1中实现connect,和mw2中实现connect

使用IDE:

Qt creator

重难点分析:

1 当一个自定义类型 例如classA需要一个classB类型指针参数在classC中初始化时

(classC 分为.h 和 .cpp文件) 正确的做法是:

//classC.h 先声明 classA a 后面什么都不用写

#ifndef CLASSC_H
#define CLASSC_H

class classC 
{
private:
    classA a;  // classA 类型的成员变量
};

#endif

//classC.cpp 在classC的构造中将成员变量a初始化

#include "classC.h"
// 使用初始化列表初始化 classA 类型的成员变量a
classC::classC(classB* b) : a(b) {}

2 当一个自定义类型 例如classA 不需要任何参数 即调用默认构造初始化时 只需要在.h文件中声明

   不需要在.cpp文件中做任何操作

#ifndef CLASSC_H
#define CLASSC_H

class classC 
{
private:
    classA a;  // 直接声明成员变量,将使用 classA 的默认构造函数
};

#endif // CLASSC_H

3 解决头文件互相包含问题 没有通用手段 见招拆招

结论:

假设mw1是信号的发出者:

在 mw1中使用connect:


信号的发送者就是this 
信号的接收者:
在引入mw2.h 后
在mw1中创建mw2类型的成员变量mw22
则信号的接收者 就是对象mw22

如果想在 mw2 中使用connect:


应该确保在mw2中 存在有效的指向 mw1 的指针
发送者是mw1传递过来的mw1类型的指针
接受者是this

案例1:在 mw1中使用connect:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QListWidgetItem>
#include <QMainWindow>
#include "mainwindow2.h"

QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

private slots:
    void on_listWidget_itemDoubleClicked(QListWidgetItem *item);

private:
    Ui::MainWindow *ui;
    MainWindow2 mw2;
signals:
    void sig_send_text(QString);
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    connect(this, SIGNAL(sig_send_text(QString)), &mw2, SLOT(sig_handler_slot(QString)));
}

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

void MainWindow::on_listWidget_itemDoubleClicked(QListWidgetItem *item)
{
    emit sig_send_text(item->text());
    this->hide();
    mw2.show();
}
#ifndef MAINWINDOW2_H
#define MAINWINDOW2_H

#include <QMainWindow>

namespace Ui {
class MainWindow2;
}

class MainWindow2 : public QMainWindow
{
    Q_OBJECT

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

private:
    Ui::MainWindow2 *ui;
private slots:
    void sig_handler_slot(QString);
};

#endif // MAINWINDOW2_H
#include "mainwindow2.h"
#include "ui_mainwindow2.h"

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

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

void MainWindow2::sig_handler_slot(QString s1)
{
    ui->label->setText(s1);
}

案例2:在 mw2中使用connect:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QListWidgetItem>
#include <QMainWindow>
#include "mainwindow2.h"

QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

private slots:

    void on_listWidget_itemDoubleClicked(QListWidgetItem *item);

private:
    Ui::MainWindow *ui;
    MainWindow2 mw2;
signals:
    void signal_text(QString);
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"

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

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

void MainWindow::on_listWidget_itemDoubleClicked(QListWidgetItem *item)
{
    emit signal_text(item->text());
    this->hide();
    mw2.show();
}
#ifndef MAINWINDOW2_H
#define MAINWINDOW2_H

#include <QMainWindow>
class MainWindow;
namespace Ui {
class MainWindow2;
}

class MainWindow2 : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow2(MainWindow *mw, QWidget *parent = nullptr);
    ~MainWindow2();

private:
    Ui::MainWindow2 *ui;
    MainWindow *mw;
private slots:
    void signal_handler(QString);
};

#endif // MAINWINDOW2_H
#include "mainwindow.h"
#include "ui_mainwindow2.h"

MainWindow2::MainWindow2(MainWindow *mw, QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow2)
    , mw(mw)
{
    ui->setupUi(this);
    connect(mw, SIGNAL(signal_text(QString)), this, SLOT(signal_handler(QString)));
}

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

void MainWindow2::signal_handler(QString s1)
{
    ui->label->setText(s1);
}

  • 78
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值