c++ - 子类化:QAbstractItemModel 没有成员

标签 c++ qt subclassing qabstractitemmodel

我对 C++ 和 Qt Framework 比较陌生。我尝试使用派生自 QAbstractListModel 的自定义模型来实现一个简单的 QTableView。

如果我打电话

model->appendRow("Test");

在我的主应用程序中,一切正常。但是,如果我调用

table->model()->appendRow("Test");

我收到以下构建错误:

'class QAbstractItemModel' has no member named 'appendRow'
         table->model()->appendRow("Test");
                     ^

我错过了什么?

源代码:

ma​​in.c

#include <QApplication>
#include <QTableView>
#include "exercises.h"


int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QTableView *table = new QTableView();
    exercisesModel *model = new exercisesModel();
    table->setModel(model);

    model->appendRow("Test"); //why does this work...
    table->model()->appendRow("Test"); //...and this doesn't?

    table->show();

    return a.exec();
} 

练习.h

#ifndef EXERCISES_H
#define EXERCISES_H

#include <QWidget>
#include <QAbstractListModel>

class exercisesModel : public QAbstractListModel
{
public:
    exercisesModel(QObject *parent = 0);
    int rowCount(const QModelIndex &parent) const;
    QVariant data(const QModelIndex &index, int role) const;
    bool appendRow(QString data);
private:
    QList <QString> lst;

};

#endif // EXERCISES_H

练习.c

#include "exercises.h"
#include <QDebug>


exercisesModel::exercisesModel(QObject *parent) : QAbstractListModel(parent){
}

int exercisesModel::rowCount(const QModelIndex &parent) const{
    Q_UNUSED(parent);
    return this->lst.size();

}

QVariant exercisesModel::data(const QModelIndex &index, int role) const{
    if(this->lst.size() != 0){
        if (role == Qt::DisplayRole){
            return this->lst[index.row()];
        }

        return QVariant();
    }
    return QVariant();

}

bool exercisesModel::appendRow(QString data){
    int lastElemPos = this->lst.size();
    beginInsertRows(QModelIndex(), lastElemPos, lastElemPos);
    this->lst << data;

    endInsertRows();

    return true;

}

最佳答案

QTableView::model() 成员函数返回一个指向 QAbstractItemModel 的指针。这是编译器在您调用 table->model()->appendRow("Test") 时所知道的所有类型。它不知道您的派生模型是实际指向的模型。有几种方法可以解决这个问题。

一种方法是使用强制转换:

static_cast<exercisesModel*>(table->model())->appendRow("Test")

现在您明确地告诉编译器“我知道对象的实际类型是 exercisesModel”,因此它可以适本地处理它。

正如 Kuba Ober 所指出的,Qt 有自己的强制转换来验证类型是否正确

qobject_cast<exercisesModel*>(table->model())->appendRow("Test")

这比 static_cast 好,但这种检查只会在运行时进行,编译时发现的问题越多越好。

最好的选择可能是保留指向您的 exercisesModel 的指针并使用它,这样就不用担心底层类型是什么了。

关于c++ - 子类化:QAbstractItemModel 没有成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25119648/

相关文章:

c++ - 如何在 Qt 中移动文件?

ios - 如何在 Storyboard中为 UIView 创建初始化方法?

c++ - 函数局部枚举声明和 ADL 的交互

c++ - 结构类型 "does not provide a subscript operator"

c++ - 从数据库中提取数据时使用 QVariant 的正确方法

qt - 如何在Qt中绘制一个 9-patch 按钮?

python - 获取函数的参数数量

swift - 子类化 Swift double /运算符重载类型别名

c++ - 将自定义构建步骤的输出添加到项目

c++ - 将 pthread 条件变量与 rwlock 一起使用