qml TableView itemdelegate未触发(使用QAbstractTableModel)。

我试图让我的第一个QML TableView 在Qt 5.2中工作(因为我们现在的工作还停留在那个版本上),使用一个 QAbstractTableModel 在后端。

我的主要问题是,由于某些原因 itemDelegate 所以我从来没有在视图中看到任何东西,除了轮廓的。TableView.我也验证了 theData_ 中的每一行每一列都充满了二维数字,我在构造函数中做了个 emit layoutChanged()以及一个 emit dataChanged() 的构造函数中。

我意识到我没有检查无效的 QModelIndexdata() 这一次,我没有实现callat。

我也没有实现 index() 完全没有。

另外是否需要使用 ROLE 这里?

我显示的数据是一个单一的整数(作为一个 QString)每单元,目前没有更多的内容。

谢谢您的帮助

qml.QAbstractTableModel

TableView {
  width: 600
  height: 600

  model: myModel
  visible: true

  itemDelegate: Rectangle {
     color: "lightgray"
     width: 100
     height: 20

     Text {
        text: styleData.value
        color: "black"
     }
   }
}

相关代码来自子类QAbstractTableModel。

int MyModel::rowCount(const QModelIndex&) const
{
return 10;
}

int MyModel::columnCount(const QModelIndex&) const
{
return 3;
}

QVariant MyModel::data(const QModelIndex& index, int role) const
{
const int row = index.row();
const int col = index.column();

return QString("%1").arg(this->theData_[col][row]);
}

解决方案:

在Qt 5.12之前,Qt 5.12中只有一个 TableView 属于Qt QuickControl 1的组件,它只支持列表类型的模型,其中每个列反映了一个角色的信息,所以这可能是你的问题,因为你没有创建任何TableViewColumn。另一方面,从>=Qt5.12开始,另一个 TableView 已经存在,它支持作为表类型模型。

mymodel.h

#ifndef MYMODEL_H
#define MYMODEL_H

#include <QAbstractListModel>

struct Data{
    int number;
    QString text;
};

class MyModel : public QAbstractListModel
{
    Q_OBJECT
public:
    enum CustomRoles{
        NumberRole = Qt::UserRole,
        TextRole
    };
    explicit MyModel(QObject *parent = nullptr);
    int rowCount(const QModelIndex &parent = QModelIndex()) const override;
    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
    QHash<int, QByteArray> roleNames() const override;
private:
    QList<Data> m_data;
};

#endif // MYMODEL_H

mymodel.cpp

#include "mymodel.h"

MyModel::MyModel(QObject *parent)
    : QAbstractListModel(parent)
{
    // for test
    for(int i=0; i< 10; i++){
        Data d{i, QString::number(i)};
        m_data.push_back(d);
    }
}

int MyModel::rowCount(const QModelIndex &parent) const
{
    if (parent.isValid())
        return 0;
    return m_data.count();
}

QVariant MyModel::data(const QModelIndex &index, int role) const
{
    if (!index.isValid())
        return QVariant();
    if(role == NumberRole)
        return m_data.at(index.row()).number;
    if(role == TextRole)
        return m_data.at(index.row()).text;
    return QVariant();
}

QHash<int, QByteArray> MyModel::roleNames() const
{
    QHash<int, QByteArray> roles;
    roles[NumberRole] = "number";
    roles[TextRole] = "text";
    return roles;
}

main.qml

// ...
TableView {
    width: 600
    height: 600

    model: myModel
    visible: true

    TableViewColumn {
        role: "number"
        title: "Number"
        width: 100
    }
    TableViewColumn {
        role: "text"
        title: "Text"
        width: 200
    }

    itemDelegate: Rectangle {
        color: "lightgray"
        width: 100
        height: 20

        Text {
            text: styleData.value
            color: "black"
        }
    }
}
// ...

给TA打赏
共{{data.count}}人
人已打赏
未分类

输入流使程序等待

2022-9-8 10:49:40

未分类

关于Java语法的一些疑问

2022-9-8 11:00:35

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索