首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QTableWidgetItem集隐藏数据

QTableWidgetItem集隐藏数据
EN

Stack Overflow用户
提问于 2015-01-19 13:26:21
回答 1查看 5.4K关注 0票数 3

给定一个QTableWidget,是否有一种方法可以为单元格(QTableWidgetItem)设置与显示值不同的“隐藏”值?

例如,我的单元格应该显示“项目1”文本,但双击它应该只编辑值1,显示一个默认为1的旋转框。换句话说,由单元格显示的文本应该从与单元格关联的值(隐藏)开始。

我在QTableWidgetItem上找不到合适的QT函数。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-19 13:31:54

是的,您可以使用QTableWidgetItem::setData()函数来实现这一点。第一个参数定义角色,第二个参数定义数据本身。除了标准角色(定义项文本的Qt::DisplayRole,等等)您可以使用自定义角色来存储其他数据。F

代码语言:javascript
复制
QTableWidgetItem item;
// Store the custom "invisible" data: 22
item.setData(Qt::UserRole, 22);

要检索它,您必须使用相同的角色:

代码语言:javascript
复制
QVariant v = item.data(Qt::UserRole);
int i = v.toInt();

通常,为了获得更好的代码风格,您可以使用enum来定义自定义数据:

代码语言:javascript
复制
enum {
    MyIntData = Qt::UserRole,
    MyDblData,
    MySuperItem
};

更新

下面是使用item委托类的替代解决方案:

代码语言:javascript
复制
class Delegate : public QItemDelegate
{
public:
    void setEditorData(QWidget *editor, const QModelIndex &index) const
    {
        QVariant value = index.model()->data(index, Qt::UserRole);
        // If the editor is a spin box, set its value.
        QSpinBox *spin = qobject_cast<QSpinBox *>(editor);
        if (spin) {
            spin->setValue(value.toInt());
        } else {
            QItemDelegate::setEditorData(editor, index);
        }
    }
    void setModelData(QWidget *editor, QAbstractItemModel *model,
                        const QModelIndex &index) const
    {
        QSpinBox *spin = qobject_cast<QSpinBox *>(editor);
        if (spin) {
            int value = spin->value();
            // If the value is changed, update the data.
            if (value != index.model()->data(index, Qt::UserRole).toInt()) {
                model->setData(index, value, Qt::DisplayRole);
                model->setData(index, value, Qt::UserRole);
            }
        } else {
            QItemDelegate::setModelData(editor, model, index);
        }
    }
};

以及如何创建表小部件和项:

代码语言:javascript
复制
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QTableWidget tw(1, 1);
    tw.setItemDelegate(new Delegate);

    QTableWidgetItem *item = new QTableWidgetItem();
    item->setData(Qt::UserRole, 22);
    item->setData(Qt::DisplayRole, 33);
    tw.setItem(0, 0, item);
    tw.show();

    [..]
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28025703

复制
相关文章

相似问题

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