【问题标题】:QAbstractTableModel inheritance vtable problemQAbstractTableModel继承vtable问题
【发布时间】:2010-09-24 05:49:18
【问题描述】:

这是 qt 的另一个问题: 我扩展了 QAbstractTableModel,但出现编译错误(我正在使用 cmake)

// file.h
#ifndef TABLEMODEL_H
#define TABLEMODEL_H

#include <QAbstractTableModel>

class TableModel : public QAbstractTableModel
{
Q_OBJECT

public:
TableModel(QObject *parent = 0);
int rowCount(const QModelIndex &parent = QModelIndex()) const;
int columnCount(const QModelIndex &parent = QModelIndex()) const;
};
#endif

// file.c
#include "tableModel.h"

TableModel::TableModel(QObject *parent)
: QAbstractTableModel(parent){}
int TableModel::rowCount(const QModelIndex & ) const
{ return 1; }

int TableModel::columnCount(const QModelIndex & ) const
{ return 1;}

当我编译时,我得到:

在函数TableModel': /partd/unusedsvn/unusedpkg/iface/tableModel.cpp:4: undefined reference tovtable for TableModel' /partd/unusedsvn/unusedpkg/iface/tableModel.cpp:4:对vtable for TableModel' collect2: ld returned 1 exit status的未定义引用

有人遇到同样的问题吗?

【问题讨论】:

    标签: c++ qt inheritance cmake vtable


    【解决方案1】:

    确保您正在通过 MOC 运行您的标头,并且正在链接那些 MOC 对象文件。

    【讨论】:

    • 确实这就是答案。使用 QMake,您必须将标头添加到 HEADERS 变量中,但我不知道 cmake。
    • 这是如何在 QT creator 上完成的?
    • @Petruza,我不知道,因为我不使用 Qt 创建器。如果你可以编辑你的 qmake (.pro) 文件,我会先检查那里。
    【解决方案2】:

    解决了将所需的 cpp 文件添加到 CMakeLists.txt 的问题。

    set(tutorial_SRCS app.cpp mainWin.cpp tableModel.cpp)
    

    当我运行 cmake 时,moc* 会自动创建

    【讨论】:

    • 这在 QT creator 中是如何实现的?
    【解决方案3】:

    几乎 100% 的 vtable 错误是由缺少标头/类定义或这些定义中的拼写错误引起的,因此首先要做的是确保标头和源代码正确(并包含在项目中)。我个人为此诅咒 Qt 到最低的地狱,并错过了项目文件中的那个小错字,不好玩:)

    【讨论】:

      【解决方案4】:

      是的,vtable 错误很糟糕。
      你必须实现 code() 方法,它也是一个纯虚方法。

      来自QAbstractTableModel documentation:

      子类化
      子类化 QAbstractTableModel 时,必须实现 rowCount()、columnCount()、和 data()。

      我也遇到了一个 vtable 问题,并且我实现了 data(),所以我错过了其他虚拟废话,但我不知道是哪一个。

      【讨论】:

        【解决方案5】:

        这是object isn't moc'ed 时相当常见的错误。我会阅读整个debugging document 以节省一些时间。

        【讨论】:

        • 解决方案是什么?文件说这是一个常见问题,但没有解决方案
        【解决方案6】:

        为了解决这个问题,我从 TableModel 中删除了 Q_OBJECT,创建了新的类 TableModelController,它派生自 QObject 并在里面有 TableModel

        class TableModel : public QAbstractTableModel
        {
        public:
            TableModel(QObject *parent = 0);
            // Some overrided functions
            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;
        };
        
        class TableModelController : public QObject
        {
        Q_OBJECT
        public:
            explicit TableModelController(QObject *parent = nullptr);
            TableModelController(TableModel *m, QObject *parent = nullptr);
        
            TableModel *getModel() {
                return model;
            }
        
        public slots:
            void addRow();
            void deleteRows();
        private:
            TableModel *model;
        };
        

        然后我使用 TableModelController 来访问 TableModel throw get Methond 和 public slot。我正在使用 QtCreator

        【讨论】:

          猜你喜欢
          • 2010-11-25
          • 2011-08-04
          • 1970-01-01
          • 1970-01-01
          • 2011-04-05
          • 1970-01-01
          相关资源
          最近更新 更多