我目前正在将一个庞大的项目从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)声明中将解决此问题。

10-05 18:04