c++ - 在带有 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) Во время выполнения этапа «Сборка »
感谢所有帮助我的人。再次对不起我的英语。
解决方案
QAbstractItemModel
是一个抽象基类。在对其进行子类化时,所有纯虚函数都需要在至少一个子类中实现。在这种情况下,链接器抱怨缺少data()函数,它是纯虚拟 ( = 0
)。
所以实现它和所有其他纯虚函数(如columnCount()
, index()
,parent()
等)
推荐阅读
- java - 创建动态过程模型
- vba - 带有表单日期值的 VBA 访问 Where 子句
- git - git卡在分离的头中 - 无法恢复到分支中的前一个文件
- python - 从python中的迭代和混合行中提取字符串
- javascript - 如何使用 php sql 查询让事件显示在日历中?
- coq - Ltac:将目标与取决于先前目标名称的类型匹配
- r - 检查字符串是否存在于多个列中并返回真/假列
- java - 如何在 selenium java 中单击此行?
- r - 从 r 中的列名中删除特定字符
- r - unclass(x) 中的 R Shiny 错误:无法使用 dplyr 过滤器函数取消对环境的分类