QStyledItemDelegate
是 Qt 框架中的一个类,主要用于自定义视图中项的呈现和编辑。它是 QAbstractItemDelegate
的一个子类,提供了一些方便的方法来实现更复杂的项样式和行为。
主要功能
绘制项:通过重写
paint()
方法,可以控制如何在视图中绘制每个项的外观。这使得你能够定制单元格的样式、字体、颜色等。编辑项:通过重写
createEditor()
和setEditorData()
等方法,可以为模型中的数据创建自定义编辑器。这意味着你可以使用任何适合该数据类型的控件,比如文本框、下拉列表或复选框。保存编辑结果:通过重写
setModelData()
方法,可以将用户在编辑器中输入的数据保存回模型。调整大小:可以重写
sizeHint()
方法,为每个项提供建议的大小,这对布局非常有帮助。
使用示例
下面是一个简单示例,演示了如何使用 QStyledItemDelegate
自定义表格中的一列,使其显示为带有复选框的列:
#include <QApplication>
#include <QTableView>
#include <QStandardItemModel>
#include <QStyledItemDelegate>
#include <QCheckBox>
class CheckBoxDelegate : public QStyledItemDelegate {
public:
CheckBoxDelegate(QObject *parent = nullptr) : QStyledItemDelegate(parent) {}
// 绘制复选框
void paint(QPainter *painter, const QStyleOptionViewItem &option,
const QModelIndex &index) const override {
bool checked = index.data(Qt::CheckStateRole).toBool();
QStyleOptionButton checkBoxStyle;
checkBoxStyle.state = checked ? QStyle::State_On : QStyle::State_Off;
checkBoxStyle.rect = option.rect;
QApplication::style()->drawControl(QStyle::CE_CheckBox, &checkBoxStyle, painter);
}
// 创建复选框作为编辑器
QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &,
const QModelIndex &) const override {
return new QCheckBox(parent);
}
// 将模型数据设置到编辑器
void setEditorData(QWidget *editor, const QModelIndex &index) const override {
QCheckBox *checkBox = qobject_cast<QCheckBox *>(editor);
if (checkBox)
checkBox->setChecked(index.data(Qt::CheckStateRole).toBool());
}
// 从编辑器获取数据并保存到模型
void setModelData(QWidget *editor, QAbstractItemModel *model,
const QModelIndex &index) const override {
QCheckBox *checkBox = qobject_cast<QCheckBox *>(editor);
if (checkBox)
model->setData(index, checkBox->isChecked(), Qt::CheckStateRole);
}
};
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
// 创建标准项模型
QStandardItemModel model(4, 2); // 4行2列
model.setHorizontalHeaderLabels({"Name", "Active"});
model.setItem(0, 0, new QStandardItem("Alice"));
model.setItem(0, 1, new QStandardItem());
model.setItem(1, 0, new QStandardItem("Bob"));
model.setItem(1, 1, new QStandardItem());
model.setItem(2, 0, new QStandardItem("Charlie"));
model.setItem(2, 1, new QStandardItem());
model.setItem(3, 0, new QStandardItem("David"));
model.setItem(3, 1, new QStandardItem());
// 初始化复选框状态
for (int i = 0; i < model.rowCount(); ++i) {
model.item(i)->setData(Qt::Unchecked ,Qt::CheckStateRole);
}
// 创建表格视图并设置模型和委托
QTableView tableView;
tableView.setModel(&model);
CheckBoxDelegate *delegate = new CheckBoxDelegate(&tableView);
tableView.setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
tableView.setColumnWidth(0 ,100 );
tableView.setColumnWidth(1 ,100 );
tableView.setEditTriggers(QAbstractItemView::DoubleClicked);
tableView.setColumnHidden(1,true);
tableView.show();
[
{canvas:..},{chartType:...'line',dataPointType...}
]
[mobile:[...]]
[
...modes:{main:"tvs"..}
...
]
</script>
更新标志位,确保更新完成。
最后,需要在窗口关闭后释放相关资源。
小结
通过继承 QStyleditemdelegate
,你可以实现灵活且高度定制化的 UI 元素,在各种情况下提升应用程序用户体验。当需要不同于默认行为时,它特别有用,例如需要复杂控件或特定视觉风格时。
内容由零声教学AI助手提供,问题来源于学员提问