【问题标题】:Qt QAbstractModel: remove checkboxQt QAbstractitemModel:删除复选框
【发布时间】:2012-09-01 21:51:36
【问题描述】:

我开始学习Qt,我想通过QTableView实现一个填充数据的表格。我的问题是,我不知道如何从单元格中删除复选框。好像是默认放入的。

但是,我读到我必须返回一个 NULL-QVariant,但这不是我想要的,因为我还有数据要输入。

到目前为止,这是我的代码:

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

switch (col)
{
case 0:
{
    daten = "column 1";
    break;
}
case 1:
{
    daten = "column 2";
    break;
}
case 2:
{
    daten = "column 3";
    break;
}
case 3:
{
    daten = "column 4";
    break;
}
}

return daten;
}

现在,如您所见,我想用名为“daten”的 QString 填充单元格。但是在字符串旁边的每个单元格中都有一个复选框。

有人知道如何删除复选框,但仍然用“daten”填充内容吗?

谢谢!

【问题讨论】:

  • 复选框?您是否有可以删除的 Qt.ItemIsUserCheckable 标志?
  • 在你的data中,你应该(1)考虑index无效的情况,(2)确保在返回data之前检查角色(应该是Qt.DisplayRole 用于基本显示)。
  • 好的,谢谢,这行得通!你能解释一下这些线有什么影响吗?
  • 你指的是哪几行?
  • 好吧,你告诉我要添加的那些: if (!index.isValid()) return QVariant(); if (role != Qt::DisplayRole) return QVariant();

标签: qt qtableview qabstracttablemodel


【解决方案1】:

QTableView 中的单元格有一些复选框提示它们被定义为用户可检查的事实。检查您的QTableView 定义中的某处是否没有激活Qt.ItemIsUserCheckable 标志,如果是这种情况,请停用它。您可以尝试修改 flags 方法,例如,强制每个条目 not 是可检查的

作为附加注释,您可能应该修改您的::data 方法以考虑index 无效的情况,并且仅当角色对应于Qt.DisplayRole 时才返回一些值。在 Python 中,语法为

if index.isvalid():
    if (role == Qt.DisplayRole):
        (row, col) = (index.row(), index.column()
        return_something_depending_on_col
    return QVariant()
return QVariant()

这样,您涵盖了无效索引的情况,否则您的代码可能会崩溃。

role 上的测试允许您选择要访问的数据类型。 documentation 声明例如:

模型中的每个项目都有一组与之关联的数据元素,每个元素都有自己的角色。视图使用角色向模型指示它需要哪种类型的数据。自定义模型应返回这些类型的数据。

基本作用是Qt.DisplayRole,在这里你返回你当前单元格对应的QString。如果您的角色是Qt.BackgroundRole,您还可以返回QBrush 来绘制背景...

虽然不是强制性的,但仍强烈鼓励在 role 上进行这些测试:它使您的代码更简洁,更易于维护。

【讨论】:

    猜你喜欢
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-02
    • 2012-10-24
    相关资源
    最近更新 更多