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