QTableWidgetItem 设置隐藏数据
QTableWidgetItem set hidden data
给定一个 QTableWidget,有没有办法为单元格 (QTableWidgetItem) 设置一个不同于显示值的 "hidden" 值?
例如,我的单元格应该显示 "Item 1" 文本,但双击它编辑应该只在值 1 上,显示默认为 1 的旋转框。
换句话说,单元格显示的文本应该从与单元格关联的值(隐藏)开始创建。
我在 QTableWidgetItem 上找不到合适的 QT 函数。
是的,您可以使用 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 的替代解决方案:
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);
}
}
};
以及如何创建 table 小部件和项目:
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();
[..]
}
给定一个 QTableWidget,有没有办法为单元格 (QTableWidgetItem) 设置一个不同于显示值的 "hidden" 值?
例如,我的单元格应该显示 "Item 1" 文本,但双击它编辑应该只在值 1 上,显示默认为 1 的旋转框。 换句话说,单元格显示的文本应该从与单元格关联的值(隐藏)开始创建。
我在 QTableWidgetItem 上找不到合适的 QT 函数。
是的,您可以使用 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 的替代解决方案:
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);
}
}
};
以及如何创建 table 小部件和项目:
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();
[..]
}