首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >子类: QAbstractItemModel没有成员

子类: QAbstractItemModel没有成员
EN

Stack Overflow用户
提问于 2014-08-04 13:18:51
回答 2查看 898关注 0票数 1

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

如果我打电话

代码语言:javascript
复制
model->appendRow("Test");

在我的主要应用程序中,一切都很好。不过,如果我打电话

代码语言:javascript
复制
table->model()->appendRow("Test");

我得到以下构建错误:

代码语言:javascript
复制
'class QAbstractItemModel' has no member named 'appendRow'
         table->model()->appendRow("Test");
                     ^

我遗漏了什么?

Sourcecode

main.c

代码语言:javascript
复制
#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

代码语言:javascript
复制
#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

代码语言:javascript
复制
#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;

}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-04 13:29:55

QTableView::model()成员函数返回指向QAbstractItemModel的指针。这就是编译器在调用table->model()->appendRow("Test")时所知道的有关类型的全部信息。它不知道你的导出模型实际上是指什么。有几种方法可以解决这个问题。

一种方法是使用演员阵容:

代码语言:javascript
复制
static_cast<exercisesModel*>(table->model())->appendRow("Test")

现在,您将显式地告诉编译器“我知道对象的实际类型是exercisesModel",因此它可以随意地对待它。

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

代码语言:javascript
复制
qobject_cast<exercisesModel*>(table->model())->appendRow("Test")

这比static_cast要好,但是这个检查只能在运行时进行,而且在编译过程中可以捕捉到的问题越多,越好。

最好的选择可能是保留指向您的exercisesModel的指针并使用它,因此没有问题的基础类型是什么。

票数 4
EN

Stack Overflow用户

发布于 2014-08-04 13:34:09

因为table->model()返回一个QAbstractItemModel,而QAbstractItemModel没有在exerciseModel中声明的appendRow函数,这是QAbstractItemModel的一个子类。编译器无法知道存储的table的实际类型。

要从appendRow访问table->model(),需要进行类型转换:

代码语言:javascript
复制
exercisesModel *model = qobject_cast<exercisesModel *>(table->model());
// dynamic_cast could also be used.
Q_ASSERT(model);
model->appendRow("Test");
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25119648

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档