当信号槽中使用自己定义的结构体或class类型时,需要先注册
摘自链接
源码目录:D:\workspace\qRegisterMetaType_demo
#ifndef MYWIDGET_H
#define MYWIDGET_H
#include <QWidget>
namespace Ui {
class MyWidget;
}
struct MyData{
QString str;
};
Q_DECLARE_METATYPE(MyData)
class MyWidget : public QWidget
{
Q_OBJECT
public:
explicit MyWidget(QWidget *parent = 0);
~MyWidget();
signals:
void sendData(MyData myWidget);
public slots:
void textChanged(QString str);
private:
Ui::MyWidget *ui;
QString m_str;
};
#endif // MYWIDGET_H
#include "mywidget.h"
#include "ui_mywidget.h"
#include <QDebug>
MyWidget::MyWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::MyWidget)
{
ui->setupUi(this);
connect(ui->lineEdit,SIGNAL(textChanged(QString)),this,SLOT(textChanged(QString)));
qDebug() << "Id:" << qRegisterMetaType<MyData>();
}
MyWidget::~MyWidget()
{
delete ui;
}
void MyWidget::textChanged(QString str)
{
MyData myData;
myData.str=str;
sendData(myData);
}
#ifndef WIDGET_H
#define WIDGET_H
#include "mywidget.h"
class MyWidget;
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
public slots:
void btnClicked();
void receiverData(MyData var);
private:
Ui::Widget *ui;
MyWidget *m_mywidget;
};
#endif // WIDGET_H
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
m_mywidget=new MyWidget;
connect(ui->pushButton,SIGNAL(clicked(bool)),this,SLOT(btnClicked()));
connect(m_mywidget,SIGNAL(sendData(MyData)),this,SLOT(receiverData(MyData)),Qt::QueuedConnection);
}
Widget::~Widget()
{
delete ui;
}
void Widget::btnClicked()
{
m_mywidget->show();
}
void Widget::receiverData(MyData var)
{
ui->lineEdit->setText(var.str);
}
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}