微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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 举报,一经查实,本站将立刻删除。