Qt中QVector/QList运算符!=不匹配编译错误的解决咨询
Qt中Q_GADGET/Q_OBJECT类使用QVector作为Q_PROPERTY成员的编译错误修复
问题描述
编写了如下Qt代码,定义带Q_GADGET、Q_OBJECT宏的类,并将QVector作为Q_PROPERTY成员变量:
class test_gadget { Q_GADGET Q_PROPERTY(QString test MEMBER test) public: QString test; }; class test_gadget2 { Q_GADGET Q_PROPERTY(QVector<test_gadget> testo MEMBER testo) public: QVector<test_gadget> testo; }; class test_object : public QObject { Q_OBJECT Q_PROPERTY(QVector<test_gadget2> gadget MEMBER gadget) public: test_object(const test_gadget2& g); private: QVector<test_gadget2> gadget; };
编译时出现错误,关键提示:
C:\Users\USER\source\repos\build-testqt2-Desktop_Qt_6_6_0_MinGW_64_bit-Debug\apptestqt2_autogen\EWIEGA46WW/moc_test.cpp:211:27: error: no match for 'operator!=' (operand types are 'QVector<test_gadget>' {aka 'QList<test_gadget>'} and 'QList<test_gadget>') ... mingw32-make.exe: *** [Makefile:135: all] Error 2
尝试为每个自定义类添加operator!=重载后问题依然存在:
class test_gadget { Q_GADGET Q_PROPERTY(QString test MEMBER test) public: QString test; bool operator!=(const test_gadget& other) const { return this->test != other.test; } }; class test_gadget2 { Q_GADGET Q_PROPERTY(QVector<test_gadget> testo MEMBER testo) public: QVector<test_gadget> testo; bool operator!=(const test_gadget2& other) const { return this->testo != other.testo; } }; class test_object : public QObject { Q_OBJECT Q_PROPERTY(QVector<test_gadget2> gadget MEMBER gadget) public: test_object(const test_gadget2& g); private: QVector<test_gadget2> gadget; };
解决方案
问题核心是自定义gadget类型未被Qt元类型系统识别,导致MOC生成的属性比较代码无法正确处理容器类型的比较,按以下步骤修复:
为自定义gadget类声明元类型
在每个gadget类定义之后,添加Q_DECLARE_METATYPE宏,让Qt元类型系统识别这些类型:class test_gadget { Q_GADGET Q_PROPERTY(QString test MEMBER test) public: QString test; bool operator!=(const test_gadget& other) const { return this->test != other.test; } }; Q_DECLARE_METATYPE(test_gadget) class test_gadget2 { Q_GADGET Q_PROPERTY(QVector<test_gadget> testo MEMBER testo) public: QVector<test_gadget> testo; bool operator!=(const test_gadget2& other) const { return this->testo != other.testo; } }; Q_DECLARE_METATYPE(test_gadget2)注册容器类型的元类型(可选但推荐)
在程序初始化的地方(比如main函数开头),注册容器类型的元类型,确保Qt能正确处理这些容器:#include <QMetaType> int main(int argc, char *argv[]) { QApplication app(argc, argv); qRegisterMetaType<QVector<test_gadget>>(); qRegisterMetaType<QVector<test_gadget2>>(); // 其他初始化代码 return app.exec(); }确保比较运算符的正确性
已重载的operator!=需保持为const成员函数(你已正确实现),确保容器的比较能递归调用元素的比较运算符。
完成以上步骤后,重新编译项目即可解决该错误。
内容的提问来源于stack exchange,提问作者user1558325
相关产品推荐
相关产品推荐

