要在Qt控件QTreeView中设置左侧节点的漂亮形状,可以通过代理(delegate)来实现。与上一个问题类似,我们需要创建一个自定义代理类,并重写paint()函数以绘制想要的形状。
以下是一个示例代码:
class MyDelegate : public QStyledItemDelegate
{
public:
void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const override
{
QStyledItemDelegate::paint(painter, option, index);
// 绘制图形
if (index.column() == 0) // 只对第一列进行操作
{
QRect rect = option.rect;
int shapeSize = 16; // 形状大小
// 根据index判断应该显示哪种形状
QPainterPath path;
if (index.data(Qt::UserRole).toBool())
{
// 绘制文件夹形状
path.moveTo(rect.left() + shapeSize / 2, rect.top() + shapeSize);
path.lineTo(rect.left(), rect.top() + shapeSize / 2);
path.lineTo(rect.left() + shapeSize / 4, rect.top());
path.lineTo(rect.right() - shapeSize / 4, rect.top());
path.lineTo(rect.right(), rect.top() + shapeSize / 2);
path.lineTo(rect.left() + shapeSize / 2, rect.top() + shapeSize);
}
else
{
// 绘制文件形状
path.addRect(rect.left(), rect.top(), shapeSize, shapeSize);
}
QColor color(255, 255, 255); // 形状颜色
painter->setPen(color);
painter->setBrush(color);
painter->drawPath(path);
}
}
};
上面的代码将TreeView中第一列的每个单元格都绘制了一个漂亮的形状,其中包括文件夹和文件两种形状。根据需要,可以使用QPainterPath类来绘制各种自定义形状,并在paint()函数中使用QPainter绘制。
接下来,在MainWindow或其他窗体中,将TreeView对象的setItemDelegate()方法设置为刚才创建的自定义代理即可:
ui->treeView->setItemDelegate(new MyDelegate);
这样就可以在TreeView中显示左侧漂亮的自定义形状了。