ZBLOG

QStyledItemDelegate

QStyledItemDelegate 是 Qt 框架中的一个类,主要用于自定义视图中项的呈现和编辑。它是 QAbstractItemDelegate 的一个子类,提供了一些方便的方法来实现更复杂的项样式和行为。

主要功能

  1. 绘制项:通过重写 paint() 方法,可以控制如何在视图中绘制每个项的外观。这使得你能够定制单元格的样式、字体、颜色等。

  2. 编辑项:通过重写 createEditor()setEditorData() 等方法,可以为模型中的数据创建自定义编辑器。这意味着你可以使用任何适合该数据类型的控件,比如文本框、下拉列表或复选框。

  3. 保存编辑结果:通过重写 setModelData() 方法,可以将用户在编辑器中输入的数据保存回模型。

  4. 调整大小:可以重写 sizeHint() 方法,为每个项提供建议的大小,这对布局非常有帮助。

使用示例

下面是一个简单示例,演示了如何使用 QStyledItemDelegate 自定义表格中的一列,使其显示为带有复选框的列:

  1. #include <QApplication>
  2. #include <QTableView>
  3. #include <QStandardItemModel>
  4. #include <QStyledItemDelegate>
  5. #include <QCheckBox>
  6. class CheckBoxDelegate : public QStyledItemDelegate {
  7. public:
  8. CheckBoxDelegate(QObject *parent = nullptr) : QStyledItemDelegate(parent) {}
  9. // 绘制复选框
  10. void paint(QPainter *painter, const QStyleOptionViewItem &option,
  11. const QModelIndex &index) const override {
  12. bool checked = index.data(Qt::CheckStateRole).toBool();
  13. QStyleOptionButton checkBoxStyle;
  14. checkBoxStyle.state = checked ? QStyle::State_On : QStyle::State_Off;
  15. checkBoxStyle.rect = option.rect;
  16. QApplication::style()->drawControl(QStyle::CE_CheckBox, &checkBoxStyle, painter);
  17. }
  18. // 创建复选框作为编辑器
  19. QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &,
  20. const QModelIndex &) const override {
  21. return new QCheckBox(parent);
  22. }
  23. // 将模型数据设置到编辑器
  24. void setEditorData(QWidget *editor, const QModelIndex &index) const override {
  25. QCheckBox *checkBox = qobject_cast<QCheckBox *>(editor);
  26. if (checkBox)
  27. checkBox->setChecked(index.data(Qt::CheckStateRole).toBool());
  28. }
  29. // 从编辑器获取数据并保存到模型
  30. void setModelData(QWidget *editor, QAbstractItemModel *model,
  31. const QModelIndex &index) const override {
  32. QCheckBox *checkBox = qobject_cast<QCheckBox *>(editor);
  33. if (checkBox)
  34. model->setData(index, checkBox->isChecked(), Qt::CheckStateRole);
  35. }
  36. };
  37. int main(int argc, char *argv[]) {
  38. QApplication app(argc, argv);
  39. // 创建标准项模型
  40. QStandardItemModel model(4, 2); // 4行2列
  41. model.setHorizontalHeaderLabels({"Name", "Active"});
  42. model.setItem(0, 0, new QStandardItem("Alice"));
  43. model.setItem(0, 1, new QStandardItem());
  44. model.setItem(1, 0, new QStandardItem("Bob"));
  45. model.setItem(1, 1, new QStandardItem());
  46. model.setItem(2, 0, new QStandardItem("Charlie"));
  47. model.setItem(2, 1, new QStandardItem());
  48. model.setItem(3, 0, new QStandardItem("David"));
  49. model.setItem(3, 1, new QStandardItem());
  50. // 初始化复选框状态
  51. for (int i = 0; i < model.rowCount(); ++i) {
  52. model.item(i)->setData(Qt::Unchecked ,Qt::CheckStateRole);
  53. }
  54. // 创建表格视图并设置模型和委托
  55. QTableView tableView;
  56. tableView.setModel(&model);
  57. CheckBoxDelegate *delegate = new CheckBoxDelegate(&tableView);
  58. tableView.setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
  59. tableView.setColumnWidth(0 ,100 );
  60. tableView.setColumnWidth(1 ,100 );
  61. tableView.setEditTriggers(QAbstractItemView::DoubleClicked);
  62. tableView.setColumnHidden(1,true);
  63. tableView.show();
  64. [
  65. {canvas:..},{chartType:...'line',dataPointType...}
  66. ]
  67. [mobile:[...]]
  68. [
  69. ...modes:{main:"tvs"..}
  70. ...
  71. ]
  72. </script>
  73. 更新标志位,确保更新完成。
  74. 最后,需要在窗口关闭后释放相关资源。

小结

通过继承 QStyleditemdelegate ,你可以实现灵活且高度定制化的 UI 元素,在各种情况下提升应用程序用户体验。当需要不同于默认行为时,它特别有用,例如需要复杂控件或特定视觉风格时。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=20556

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?