首页 > 解决方案 > 在带有 QAbstractTableModel 的 Qt 5.14.1 上未定义对“_imp____类名____虚拟方法”的引用

问题描述

每个人。对不起我的英语不好。我懂一点英语。我有一个不寻常的问题。我创建了继承自 QAbstractTableModel 的 AbstractModel 和继承自 AbstractModel 的 MyAdvModel。这是我的部分代码。

// 抽象模型.hpp

#pragma once

#include <QAbstractTableModel>
#include "db/utility.hpp"
#include "net/serverloader.hpp"

class QNetworkReply;
class AbstractModel : public QAbstractTableModel
{
    Q_OBJECT
public:
    virtual void parseData(QByteArray*) = 0;
    enum Error{NoError = 0, Null, NoFound, BadJson, NoServerConnection, Unknown};
    explicit AbstractModel(QObject *parent = nullptr);
    void setUrl(const QString&);
    void clearParams();
    void addParam(const QString&, const QVariant&);
    void delParam(const QString&);
    void post();
    void get();
protected:
    ServerLoader* server() const;
private slots:
    void response(QNetworkReply*);
private:
    unique_ptr<ServerLoader> _loader;
    unique_ptr<QVariantMap> _params;
};

// myadvmodel.hpp

#pragma once

#include "models/abstractmodel.hpp"
#include <QAbstractTableModel>
#include <tuple>
#include <vector>
#include <map>

class MyAdvModel :public AbstractModel
{
    Q_OBJECT

public:

    static constexpr auto ID_FIELD          = 0;
    static constexpr auto TYPE_FIELD        = 1;
     static constexpr auto ISCLOSED_FIELD    = 2;
//    static constexpr auto ISARRIVED_FIELD   = 3;
    static constexpr auto DATA_FIELD        = 3;
    static constexpr auto STATUS            = 0;
    static constexpr auto LAST              = 6;
    static constexpr auto COLUMNS           = 7;
    enum Type {Driver, Passanger};
    qint32 ID, MAX_ID;
    //                                    id       p/d     isc   isa   datas
    using data_t = std::vector<std::tuple<int32_t, Type, bool,/* bool,*/ std::map<QString, QVariant>>>;
    explicit MyAdvModel(QObject *parent = nullptr);
    ~MyAdvModel() override;
    QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
    int rowCount(const QModelIndex &parent = QModelIndex()) const override;
    int columnCount(const QModelIndex &parent = QModelIndex()) const override;
    bool setData(const QModelIndex &index, const QVariant &value,
                 int role = Qt::EditRole) override;
    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
    Qt::ItemFlags flags(const QModelIndex& index) const override;
private:
    std::unique_ptr<data_t> _data, _tmp;
private slots:
    void parsed();
public:
    void parseData(QByteArray *) override;
};

关于编译时间。我得到这样的错误。

myadvmodel.o:myadvmodel.cpp:(.text+0x1225): undefined reference to > `_imp___ZNK18QAbstractItemModel4dataERK11QModelIndexi' collect2.exe: error: ld returned 1 exit status mingw32-make: *** [Makefile:182: up_desktop.exe] 错误1 20:38:38: Процесс «C:\Qt\Tools\mingw730_32\bin\mingw32-make.exe» завершился с кодом 2. Ошибка при сборке/развёртывании проекта up_desktop (комплект: Desktop MinGW_32) Во время выполнения этапа «Сборка »

感谢所有帮助我的人。再次对不起我的英语。

标签: c++qt

解决方案


QAbstractItemModel是一个抽象基类。在对其进行子类化时,所有纯虚函数都需要在至少一个子类中实现。在这种情况下,链接器抱怨缺少data()函数,它是纯虚拟 ( = 0)。

所以实现它和所有其他纯虚函数(如columnCount(), index(),parent()等)


推荐阅读