[Interest] Why does Q_ENUM() need qRegisterMetaType()?
Tom Isaacson
Tom.Isaacson at navico.com
Sun Jun 30 10:09:32 CEST 2019
I'm using Qt 5.12.2 on Visual Studio 2019 / Win7. I wanted to make sure Q_ENUM works the way I think it does before updating some legacy code so I wrote a unit test (we use Google Test):
TestConnectEnum.h:
class tColoredObjectV3 : public QObject
{
Q_OBJECT
public:
enum class eColor
{
Red = 1,
Blue = 2,
Green = 3
};
Q_ENUM(eColor)
tColoredObjectV3() : m_color(tColoredObjectV3::eColor::Red) {}
void EmitColor(tColoredObjectV3::eColor color);
signals:
void ColorSignal(tColoredObjectV3::eColor color);
private:
eColor m_color;
};
TestEnumConnect.cpp:
TEST(Connect, ConnectEnumSucceedsV3)
{
//qRegisterMetaType<tColoredObjectV3::eColor>();
tColoredObjectV3 coloredObject;
QSignalSpy spy(&coloredObject, &tColoredObjectV3::ColorSignal);
coloredObject.EmitColor(tColoredObjectV3::eColor::Blue);
EXPECT_TRUE(spy.isValid());
EXPECT_EQ(spy.count(), 1); // make sure the signal was emitted exactly one time
QList<QVariant> arguments = spy.takeFirst(); // take the first signal
ASSERT_FALSE(arguments.isEmpty());
tColoredObjectV3::eColor color = arguments.at(0).value<tColoredObjectV3::eColor>();
EXPECT_EQ(tColoredObjectV3::eColor::Blue, color); // verify the first argument
}
But this fails - I have to uncomment the qRegisterMetaType() to get it to work. If I use the old Q_DECLARE_METATYPE() this works. Am I doing something wrong or does Q_ENUM() require this?
Tom Isaacson
More information about the Interest
mailing list