delegate

QStyledItemDelegate和QItemDelegate

QStyledItemDelegate和QItemDelegate都是Qt中用于自定义表格、列表或树形视图中项目的显示和编辑方式的类。它们的主要区别在于样式支持和默认行为的不同。

具体来说,QStyledItemDelegate相对于QItemDelegate有以下区别:

样式支持:QStyledItemDelegate提供了更多的样式支持,可以更好地适应应用程序的外观和主题。它使用QStyle来绘制项目,可以自动适应不同的外观和主题。而QItemDelegate则使用Qt的默认绘制方式,样式比较固定。

默认行为:QStyledItemDelegate提供了更多的默认行为,例如对于QComboBox、QSpinBox等控件的默认行为进行了封装,使得使用更加方便。而QItemDelegate则更加基础,需要自己实现各种控件的默认行为。

代码复杂度:由于QStyledItemDelegate提供了更多的默认行为和样式支持,使用它可以减少代码量和复杂度。而QItemDelegate则需要手动实现更多的细节,代码量和复杂度相对较高。

总的来说,QStyledItemDelegate相对于QItemDelegate提供了更多的样式支持和默认行为,可以使得自定义表格、列表或树形视图中项目的显示和编辑更加方便和灵活。但是,如果需要更加细致的控制和定制,QItemDelegate可能更加适合。

QTreeView和QTreeWidget都可以设置QItemDelegate

class MyItemDelegate : public QItemDelegate
{
  Q_OBJECT
public:
  QTreeView* tree;
public:
    MyItemDelegate(QObject* obj):
      QItemDelegate(Qobj),
      tree((QTreeView*)obj)
    {
    
    }
    void paint(QPainter* painter, const QStyleOptionViewItem &option, const QModelIndex &index)const
    {
      // 描绘边框
      if(index == tree->currentIndex()) {
        painter->drawLine();
      } else {
        painter->drawLine();
      }
    }
}
QTreeWidget* tree = new QTreeWidget;
tree->setItemDelegate(new MyItemDelegate(tree));

以上功能也可以用qss实现

QTreeWidget::item{
  border-right:1px solid rgb(234,234,234);
  border-bottom:1px solid rgb(234,234,234);
}
Table of Contents