Qt:我什么时候应该使用 Q_DECLARE_METATYPE?

Nya*_*uko 0 c++ qt

文档说我需要 Q_DECLARE_METATYPE 一个自定义结构,这样它才能在信号槽中正常工作。

但我已经尝试了以下似乎工作正常的代码?

#include <QMainWindow>

namespace Ui {
class MainWindow;
}
struct MyStruct
{
        int a;
        int b;
};

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;

signals:
    void test(MyStruct);

public slots:
    void tested(MyStruct);
private slots:
    void on_pushButton_clicked();
};

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
//------------------------CPP-------------------------------
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    connect(this, SIGNAL(test(MyStruct)),this,SLOT(tested(MyStruct)));
}

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

void MainWindow::tested(MyStruct t)
{
    qDebug()<<t.a<<t.b;
}

void MainWindow::on_pushButton_clicked()
{
    MyStruct t;
    t.a=1;
    t.b=2;
    emit test(t);
}
Run Code Online (Sandbox Code Playgroud)

信号槽工作没有任何问题,但在以下情况下:

struct SoundType 
{
    enum Type
    {
        Bip = 0,
        LowBatt, 
        LowSat,
        FarAway,
        LostLink
    };
};
Q_DECLARE_METATYPE(SoundType::Type)
Run Code Online (Sandbox Code Playgroud)

看来我必须调用声明才能使用

声音类型::类型

在信号槽中。

那么在什么情况下我必须使用 Q_DECLARE_METATYPE 才能使用信号槽?

Rei*_*ica 5

我什么时候应该使用 Q_DECLARE_METATYPE?

总是当该类型与信号/插槽或QVariant.

您的测试用例不完整:只要您将一个连接的对象移动到不同的线程,它就会中断。

您可能还需要qRegisterMetatype<YourType>()例如在main.