当信号槽中使用自己定义的结构体或class类型时,需要先注册
    摘自链接

    源码目录:D:\workspace\qRegisterMetaType_demo

    1. #ifndef MYWIDGET_H
    2. #define MYWIDGET_H
    3. #include <QWidget>
    4. namespace Ui {
    5. class MyWidget;
    6. }
    7. struct MyData{
    8. QString str;
    9. };
    10. Q_DECLARE_METATYPE(MyData)
    11. class MyWidget : public QWidget
    12. {
    13. Q_OBJECT
    14. public:
    15. explicit MyWidget(QWidget *parent = 0);
    16. ~MyWidget();
    17. signals:
    18. void sendData(MyData myWidget);
    19. public slots:
    20. void textChanged(QString str);
    21. private:
    22. Ui::MyWidget *ui;
    23. QString m_str;
    24. };
    25. #endif // MYWIDGET_H
    26. #include "mywidget.h"
    27. #include "ui_mywidget.h"
    28. #include <QDebug>
    29. MyWidget::MyWidget(QWidget *parent) :
    30. QWidget(parent),
    31. ui(new Ui::MyWidget)
    32. {
    33. ui->setupUi(this);
    34. connect(ui->lineEdit,SIGNAL(textChanged(QString)),this,SLOT(textChanged(QString)));
    35. qDebug() << "Id:" << qRegisterMetaType<MyData>();
    36. }
    37. MyWidget::~MyWidget()
    38. {
    39. delete ui;
    40. }
    41. void MyWidget::textChanged(QString str)
    42. {
    43. MyData myData;
    44. myData.str=str;
    45. sendData(myData);
    46. }
    1. #ifndef WIDGET_H
    2. #define WIDGET_H
    3. #include "mywidget.h"
    4. class MyWidget;
    5. namespace Ui {
    6. class Widget;
    7. }
    8. class Widget : public QWidget
    9. {
    10. Q_OBJECT
    11. public:
    12. explicit Widget(QWidget *parent = 0);
    13. ~Widget();
    14. public slots:
    15. void btnClicked();
    16. void receiverData(MyData var);
    17. private:
    18. Ui::Widget *ui;
    19. MyWidget *m_mywidget;
    20. };
    21. #endif // WIDGET_H
    22. #include "widget.h"
    23. #include "ui_widget.h"
    24. Widget::Widget(QWidget *parent) :
    25. QWidget(parent),
    26. ui(new Ui::Widget)
    27. {
    28. ui->setupUi(this);
    29. m_mywidget=new MyWidget;
    30. connect(ui->pushButton,SIGNAL(clicked(bool)),this,SLOT(btnClicked()));
    31. connect(m_mywidget,SIGNAL(sendData(MyData)),this,SLOT(receiverData(MyData)),Qt::QueuedConnection);
    32. }
    33. Widget::~Widget()
    34. {
    35. delete ui;
    36. }
    37. void Widget::btnClicked()
    38. {
    39. m_mywidget->show();
    40. }
    41. void Widget::receiverData(MyData var)
    42. {
    43. ui->lineEdit->setText(var.str);
    44. }
    1. #include "widget.h"
    2. #include <QApplication>
    3. int main(int argc, char *argv[])
    4. {
    5. QApplication a(argc, argv);
    6. Widget w;
    7. w.show();
    8. return a.exec();
    9. }