Qt Model/View理解(四)---实战

前面讲解了有关Model/View的实现方式,下面将用一个例子,介绍如何构造model和使用Delegate渲染进行混合编程,主要显示学生信息,tableview里面有checkbox,  combBox,  lineEdit等操作控件,最终效果如下。


1.首先,我们建立2个学生的基本信息(姓名,性别,年龄,分数,是否毕业),并放在链表中。姓名不可编辑,性别combox下拉可选,年龄,分数双击可修改,是否毕业开关可编辑。

enum E_Gender
{
    E_BOY,
    E_GIRL,
};

typedef struct S_Student
{
    bool m_check;
    QString m_name;
    int m_age;
    E_Gender m_gender;
    int m_score;
    bool m_graduate;
}S_STU;
QList<S_STU*> StuList;
    StuList.clear();

    S_STU *stu1 = new S_STU;
    stu1->m_check = false;
    stu1->m_name = QString("XiaoMing");
    stu1->m_gender = E_BOY;
    stu1->m_age = 12;
    stu1->m_score = 98;
    stu1->m_graduate = true;

    S_STU *stu2 = new S_STU;
    stu2->m_check = false;
    stu2->m_name = QString("XiaoHong");
    stu2->m_gender = E_GIRL;
    stu2->m_age = 10;
    stu2->m_score = 100;
    stu2->m_graduate = false;

    StuList.append(stu1);
    StuList.append(stu2);
2.构造model模型,重载常用的虚函数。
int	StudentModel::columnCount(const QModelIndex & parent) const
{
    Q_UNUSED(parent);
    return 6;
}

int	StudentModel::rowCount(const QModelIndex & parent) const
{
    Q_UNUSED(parent);
    return StuList.count();
}

QVariant StudentModel::data(const QModelIndex & index, int role) const
{
    if (!index.isValid())
        return QVariant();

    int nRow = index.row();
    int nColumn = index.column();

    S_STU *stu = StuList.at(nRow);
    switch(role){
        case Qt::TextColorRole:
            return QColor(Qt::black);
        case Qt::TextAlignmentRole:
            return QVariant(Qt::AlignHCenter | Qt::AlignVCenter);
        case Qt::UserRole+COLUMN_CHECK:
        {
            if (nColumn == COLUMN_CHECK)
                return stu->m_check;
            return "";
        }
        case Qt::DisplayRole:
        {
            if (nColumn == COLUMN_NAME)
                
  • 10
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
Qt Model/View/Delegate 是 Qt 提供的一种用于实现 MVC 设计模式的框架,其中 Model 负责存储数据,View 负责显示数据,Delegate 负责定制数据的显示方式。 在 Model 中,我们可以通过实现 `roleNames()` 函数来定义数据的角色名称。这些角色名称可以被 View 和 Delegate 使用来访问 Model 中的数据。 `roleNames()` 函数返回一个 `QHash<int, QByteArray>` 类型的值,其中键是角色的编号,值是角色的名称。对于一个标准的 ModelQt 提供了一些已经定义好的角色,例如 `Qt::DisplayRole` 用于显示数据,`Qt::EditRole` 用于编辑数据等。 我们也可以自定义角色,例如在一个存储学生信息的 Model 中,我们可以自定义一个 `Qt::UserRole` 角色,用于存储学生的分数信息。在 `roleNames()` 中,我们可以这样定义: ```cpp QHash<int, QByteArray> StudentModel::roleNames() const { QHash<int, QByteArray> roles; roles[Qt::DisplayRole] = "display"; roles[Qt::UserRole] = "score"; return roles; } ``` 在 View 中,我们可以使用 `data()` 函数来访问 Model 中的数据,同时指定要访问的角色。例如: ```cpp QVariant score = model->data(modelIndex, Qt::UserRole); ``` 在 Delegate 中,我们可以重写 `setModelData()` 函数来更新 Model 中的数据,同时指定要更新的角色。例如: ```cpp void ScoreDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const { QLineEdit *lineEdit = static_cast<QLineEdit*>(editor); QString score = lineEdit->text(); model->setData(index, score, Qt::UserRole); } ``` 通过定义和使用自定义角色,我们可以更加灵活地操作 Model 中的数据,并将数据以更加自然的方式展示给用户。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值