QTableView中每个单元格都有不需要的复选框

29

我刚开始学习Qt编程,并尝试使用自己创建的模型类继承自QAbstractTableModel,使用QTableView控件制作一个简单的表格数据布局。但不知何故,我的表格视图最终看起来像这样:

alt text
(图片来源:nerdland.net)

每个单元格里看起来像是复选框(但我点击它们却没有反应),到底是什么东西?如何让它们消失?除了对象名称之外,我没有更改任何QTableView属性。

如果有关系的话,我的模型代码非常简单:

MyTableModel::MyTableModel(QObject* parent)
  : QAbstractTableModel(parent)
{
}

MyTableModel::~MyTableModel()
{
}

int MyTableModel::rowCount(const QModelIndex& parent) const
{
  return 1000; 
}

int MyTableModel::columnCount(const QModelIndex& parent) const
{
  return 5;
}

QVariant MyTableModel::data(const QModelIndex& index, int role) const
{
  return "Foo";
}

对话框UI是使用Qt Designer构建的,在对话框的类中,我通过以下方式将模型附加到视图:

MyTableModel testModel = new MyTableModel(this);
ui.testTable->setModel(testModel);

除此之外,我没有对 ui.testTable 进行任何操作。

使用 Qt 4.6。

2个回答

57

尝试将MyTableModel::data()更改为以下内容:

QVariant MyTableModel::data(const QModelIndex& index, int role) const
{
    if (role == Qt::DisplayRole)
        return "foo";
    else
        return QVariant();
}

可能是 QTableView 错误理解了角色 Qt::CheckStateRole 的返回 QVariant。


1
太好了!谢谢。我想我不应该忽略我还没学过的参数... - Tyler McHenry
3
很高兴能帮助你 :) Qt 真的很棒! - Elrohir
2
谢谢你的最后一句话“可能是QTableView误解了Qt :: CheckStateRole角色的返回QVariant。”因为我想启用QTableView的编辑功能,所以我禁用了我的role == Qt :: DisplayRole检查,并得到了那些愚蠢的复选框。感谢您的评论,现在我明确检查Qt :: DisplayRole和Qt :: EditRole,并在其他情况下返回QVariant()。 - Charl Botha
1
如果有人正在使用没有 QVariant 类的 QVariant 版本 2 的 pyqt,返回 None 将解决问题。 - architectonic

2

1
不行,即使我覆盖 flags 方法并返回 QAbstractTableModel::flags(index) & ~Qt::ItemIsUserCheckable;,复选框仍然存在。 - Tyler McHenry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接