QTableWidgetItem 设置隐藏数据

Posted

技术标签:

【中文标题】QTableWidgetItem 设置隐藏数据【英文标题】:QTableWidgetItem set hidden data 【发布时间】:2015-01-19 13:26:21 【问题描述】:

给定一个 QTableWidget,有没有办法为单元格(QTableWidgetItem)设置一个“隐藏”值,与显示值不同?

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

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

【问题讨论】:

【参考方案1】:

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

QTableWidgetItem item;
// Store the custom "invisible" data: 22
item.setData(Qt::UserRole, 22);

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

QVariant v = item.data(Qt::UserRole);
int i = v.toInt();

一般来说,为了更好的代码风格,你可以使用枚举来定义你的自定义数据:

enum 
    MyIntData = Qt::UserRole,
    MyDblData,
    MySuperItem
;

更新

这是使用项目委托类的替代解决方案:

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);
        
    
;

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

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();

    [..]

【讨论】:

我已经尝试过您的代码,使用setText 显示数据并使用setData(Qt::UserRole, myData) 存储“隐藏”值。然后我将cellChanged(int, int) 信号连接到一个插槽,但双击单元格,编辑位于显示的标签(“项目 1”)上,而不是实际值(1)上。我错过了什么? @ABCplus,好吧,请尝试使用 Qt::EditRole 设置您的自定义数据,即setData(Qt::EditRole, myData) 完成,但 setData(Qt::UserRole, myData)myData 值设置为隐藏,setData(Qt::EditRole, myData) 显示单元格上的值 具有 Qt::EditRole 角色的数据集在您编辑单元格时将可见。如果单元格未处于编辑模式,则将显示使用Qt::DisplayRole 角色设置的值。 我看到的是 setData 函数覆盖了前面的函数,这意味着如果我写 setData(Qt::EditRole, 1) 然后 setData(Qt::DisplayRole, 2) 单元格中显示的数据是 2 并双击单元格一个旋转框显示值 2。是否有一些额外的属性要设置为QTableWidget

以上是关于QTableWidgetItem 设置隐藏数据的主要内容,如果未能解决你的问题,请参考以下文章

QT 编程,关于QTableWidgetItem的问题

QT:使用 QMouseEvent 从代码中选择多个 QTableWidgetItem

如何在 PyQt4 中将事件监听器添加到动态 QTableWidgetItem?

QTableWidgetItem QTreeWidgwtItem 复选框的取消显示方法

Qt下创建窗口的问题

qttablewidget绑定数据