Die Dokumentation sagte, ich muss Q_DECLARE_METATYPE eine benutzerdefinierte Struktur, so dass es richtig in einem Signal-Slot funktioniert.Qt: Wann soll ich Q_DECLARE_METATYPE verwenden?
Aber ich habe den folgenden Code ausprobiert, der scheint gut zu funktionieren?
#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);
}
Das Signal Slot funktioniert ohne Probleme, aber im folgenden Fall:
struct SoundType
{
enum Type
{
Bip = 0,
LowBatt,
LowSat,
FarAway,
LostLink
};
};
Q_DECLARE_METATYPE(SoundType::Type)
es scheint, dass ich die Erklärung zu nennen haben Inorder
verwendenSoundType :: Typ
im Signalsteckplatz.
Also, in welchem Fall muss ich Q_DECLARE_METATYPE verwenden, um einen Signalsteckplatz zu verwenden?
Der Dokumentstatus: [* Deklarieren Sie neue Typen mit Q_DECLARE_METATYPE(), um sie für QVariant und andere vorlagenbasierte Funktionen verfügbar zu machen *] (http://doc.qt.io/qt-5/qmetatype.html#details). Ich bin neugierig, wo in den Dokumenten haben Sie gefunden, dass Sie es verwenden müssen, wenn Sie benutzerdefinierte Strukturen in Signalen/Slots verwenden? – thuga
Hier: doc.qt.io/qt-4.8/custom-types.html, oder im Qt5 ist das nicht mehr nötig? Oder ist es nur für anstehende Signale? – Nyaruko
Die Verwendung von benutzerdefinierten Typen in direkten Signal-Slot-Aufrufen ohne 'Q_DECLARE_METATYPE' hat so lange funktioniert, wie ich mich erinnern kann. Ich bin mir nicht sicher, was dieser Teil der Dokumentation versucht zu erzählen. – thuga