当信号槽中使用自己定义的结构体或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_OBJECTpublic: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_OBJECTpublic: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();}
