实验准备:
有两个窗口: 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);
}