我目前正在将一个庞大的项目从Qt 4.x迁移到5.2.1,直到出现此错误之前,一切都还不错,由于它位于Qt文件中,因此我感到非常困惑,我相信解决方案必须应用于其他地方,不在位于5.2.1 \ mingw48_32 \ include / QtCore / qglobal.h的qglobal.h中。
该错误一定是在其他地方发生的。
继承人错误:
这是qglobal.h中的代码
// Intentionally undefined
template <bool Test> class QStaticAssertFailure;
template <> class QStaticAssertFailure<true> {};
#define Q_STATIC_ASSERT_PRIVATE_JOIN(A, B) Q_STATIC_ASSERT_PRIVATE_JOIN_IMPL(A, B)
#define Q_STATIC_ASSERT_PRIVATE_JOIN_IMPL(A, B) A ## B
#ifdef __COUNTER__
#define Q_STATIC_ASSERT(Condition) \
enum {Q_STATIC_ASSERT_PRIVATE_JOIN(q_static_assert_result, __COUNTER__) = sizeof(QStaticAssertFailure<!!(Condition)>)}
#else
#define Q_STATIC_ASSERT(Condition) \
enum {Q_STATIC_ASSERT_PRIVATE_JOIN(q_static_assert_result, __LINE__) = sizeof(QStaticAssertFailure<!!(Condition)>)}
#endif /* __COUNTER__ */
#define Q_STATIC_ASSERT_X(Condition, Message) Q_STATIC_ASSERT(Condition)
#endif
我已经尝试了一切,并对此进行了研究,但没有找到合适的解决方案。我整天浪费在这段令人讨厌的代码中。我希望有人能对此事有所启发。
非常感谢你。
编辑:我搜索了包括qglobal.h的所有文档,但是它们都没有使用任何断言函数,所以我不知道是什么触发了这种错误。 qglobal.h不可能是错误的,因此它一定是源代码。
EDIT2:我设法隔离了触发错误的行,显然,编译输出提供了比我想象的更多的信息,但是它是如此的“分离”,以至于我认为这是一个警告,没事做。这是我的应用程序中的代码。两条注释行是触发错误的行。对不起,我错了。
bool ISPSModel::removeGraphics(GraphicsPrimitive* _gtr) {
for (int _i = 0; _i < ispss.size(); _i++) {
for (int _j = 0; _j < ispss[_i]->graphicsObjects.size(); _j++) {
if (ispss[_i]->graphicsObjects[_j] != _gtr)
continue;
if (ispss[_i]->graphicsObjects.contains(_gtr)) {
//beginRemoveRows(indexFromItem(ispss[_i]->m_item), _gtr->getData(DATA_ROLE).value<ISPSItem*>()->row(), _gtr->getData(DATA_ROLE).value<ISPSItem*>()->row());
//_gtr->getData(DATA_ROLE).value<ISPSItem*>()->remove();
ispss[_i]->removeGraphics(ispss[_i]->graphicsObjects[_j]);
endRemoveRows();
return true;
}
}
}
return false;
}
其这部分导致错误:
value<ISPSItem*>()
如果可以帮助的话,下面是我忽略的编译错误的另一部分:
我在使用不同类的另一个.cpp文件中遇到了相同的错误,但是它们的共同点是
.value<Type>();
Notify* _n = ui.notifyBox->model()->data(index, Qt::UserRole).value<Notify*>();
因此,肯定是引发错误的
.value<Type>();
,现在剩下的唯一事情就是找到解决方法。如果它有用,这是对象ISPSItem:
class ISPSItem : public QObject {
public:
enum Level {ROOT_LEVEL = 1,
ISPS_LEVEL,
GRAPHICS_LEVEL
} level;
ISPSItem(ISPSItem* = NULL, Level = ROOT_LEVEL, int = -1);
~ISPSItem();
ISPSItem* parentItem() {return _parentItem;}
ISPSItem* child(int);
void appendChild(ISPSItem*);
void insertChild(ISPSItem*, int);
int childCount() const {return children.size();}
int row() const;
int newNodeRow(Level);
void remove();
private:
QList<ISPSItem*> children;
ISPSItem* _parentItem;
void remove(ISPSItem*);
};
Q_DECLARE_METATYPE(ISPSItem*)
最佳答案
在获得了有关错误及其触发源的大量信息之后,我得出结论,根本原因可能是在QVariant中使用QObject
子类,尤其是在调用QVariant::value()
函数时。正如Qt的文档所说:
我相信,将Q_OBJECT
宏添加到这些类(ISPSItem
)声明中将解决此问题。