【问题标题】:undefined reference to "_imp____class name ____ virtual method" On Qt 5.14.1 with QAbstractTableModel在带有 QAbstractTableModel 的 Qt 5.14.1 上未定义对“_imp____类名____虚拟方法”的引用
【发布时间】:2020-03-05 00:15:23
【问题描述】:

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

// abstactmodel.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): 未定义引用 > `_imp___ZNK18QAbstractItemModel4dataERK11QModelIndexi' collect2.exe:错误:ld 返回 1 退出状态 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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      谢谢大家。我已经解决了这个问题。

      在我的 myadvmodel.cpp 文件中

      实施中

      QVariant MyAdvModel::data(const QModelIndex &index, int role) const
      {
      //......
         return AbstractModel::data(index, role);
      //......
      }
      

      这是我的错误。在我的 AbstractModel 类中,我没有为数据方法编写实现。在这种情况下,我的编译器给了我这个代码AbstractModel::data(index, role); 的错误。 :) 谢谢大家,对不起我的英语。

      【讨论】:

      • 没有AbstractModel::data,你没有实现所以不能调用。只有MyAdvModel::data
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-30
      • 1970-01-01
      • 2012-11-06
      相关资源
      最近更新 更多