Qt 非常小的表模型示例未构建

问题描述

我正在尝试在 Qt 5.15 中编写一个表模型视图的最小示例。

我从 TableModel 派生出自己的类 QAbstractTableModel,但链接器抱怨没有该类的 vtable。

完整的 Qt Creator 项目和代码文件在此 GitHub repository 中,但我在此问题的末尾包含了 TableModel代码

链接错误是:

/Users/rodrigobraz/Documents/Qt Projects/build-tabledraganddrop-Desktop_Qt_5_15_2_clang_64bit-Debug/mainwindow.o:-1: error: Undefined symbols for architecture x86_64:
  "vtable for TableModel",referenced from:
      TableModel::TableModel() in mainwindow.o
  NOTE: a missing vtable usually means the first non-inline virtual member function has no deFinition.

它说这通常是由未实现的非内联虚拟方法引起的,但我相信 TableModel 正在实现所有纯虚拟方法; 它派生自 QAbstractTableModel,它没有任何纯虚方法,而它的基类 QAbstractItemModel 确实有四个纯虚方法TableModel 实现。导致错误的原因是什么?

int qabstractitemmodel::rowCount(const QModelIndex &parent = QModelIndex()) const

int qabstractitemmodel::columnCount(const QModelIndex &parent = QModelIndex()) const

QVariant qabstractitemmodel::data(const QModelIndex &index,int role = Qt::displayRole) const

QModelIndex qabstractitemmodel::index(int row,int column,const QModelIndex &parent = QModelIndex()) const

QModelIndex qabstractitemmodel::parent(const QModelIndex &index) const

tablemodel.h

#ifndef TABLEMODEL_H
#define TABLEMODEL_H

#include <qabstractitemmodel.h>
#include <qvariant.h>
#include <vector>

using std::vector;

class TableModel : public QAbstractTableModel {

    vector<vector<QVariant>> dataList;

    QModelIndex index(int row,const QModelIndex &parent = QModelIndex()) const override;

    QModelIndex parent(const QModelIndex &child) const override;

    int rowCount(const QModelIndex &parent = QModelIndex()) const override;
    int columnCount(const QModelIndex &parent = QModelIndex()) const override;

    QVariant data(const QModelIndex &index,int role = Qt::displayRole) const override;


};

#endif // TABLEMODEL_H

tablemodel.cpp

#include "mainwindow.h"

#include <QAbstractTableModel>
#include <qabstractitemmodel.h>
using std::vector;


class TableModel : public QAbstractTableModel {

    vector<vector<QVariant>> dataList{{"Lion","Tiger","Bear"}};

    QModelIndex index(int row,const QModelIndex &parent = QModelIndex()) const override {
        Q_UNUSED(parent);
        return createIndex(row,column);
    }

    QModelIndex parent(const QModelIndex &child) const override {
        Q_UNUSED(child);
        return QModelIndex();
    }

    QVariant virtual data(const QModelIndex &index,int role = Qt::displayRole) const override {
        if (role == Qt::displayRole)
            return dataList[index.row()][index.column()];
        return QVariant();
    }

    bool setData(const QModelIndex &index,const QVariant &value,int role = Qt::EditRole) override {
        Q_UNUSED(role);
        dataList[index.row()][index.column()] = value;
        emit dataChanged(index,index);
        return true;
    }

    int rowCount(const QModelIndex &parent = QModelIndex()) const override {
        Q_UNUSED(parent);
        return dataList.size();
    }

    int columnCount(const QModelIndex &parent = QModelIndex()) const override {
        Q_UNUSED(parent);
        return 3;
    }

    Qt::ItemFlags flags(const QModelIndex &index) const override {
        Q_UNUSED(index);
        return Qt::ItemIsSelectable | Qt::ItemIsEditable | Qt::ItemIsEnabled | Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled;
    }

    Qt::DropActions supportedDropActions() const override {
        return Qt::copyAction | Qt::MoveAction;
    }

};

顺便说一下,我使用的是基于 Qt 5.15.2(Clang 11.0(Apple),64 位)的 Qt Creator 4.14.2。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)