You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在QListWidgetItem上绘制足够长的矩形条?

解决QListWidgetItem绘制长条的宽度限制问题

用QIcon设置长条时,QListWidget的默认项布局或图标绘制逻辑会限制宽度,更可靠的方式是自定义项委托直接绘制,而非依赖图标。以下是具体实现方案:

方案一:自定义委托绘制长条

通过继承QStyledItemDelegate重绘项内容,完全控制长条的尺寸和样式:

1. 实现自定义委托类

#include <QStyledItemDelegate>
#include <QPainter>

class TimelineDelegate : public QStyledItemDelegate
{
    Q_OBJECT
public:
    explicit TimelineDelegate(QObject *parent = nullptr) : QStyledItemDelegate(parent) {}

    void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override
    {
        // 可选:保留默认项的选中/ hover样式
        QStyledItemDelegate::paint(painter, option, index);

        // 定义长条的绘制区域,可自定义边距
        QRect barRect = option.rect.adjusted(5, 5, -5, -5);
        // 设置长条宽度,支持动态调整(比如从index获取自定义数据)
        barRect.setWidth(500);

        // 方式1:纯色填充长条
        painter->fillRect(barRect, Qt::black);

        // 方式2:用图片填充长条(替换上面的fillRect)
        // QPixmap pixmap(":/black.jpg");
        // painter->drawPixmap(barRect, pixmap);
    }

    QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override
    {
        // 固定项的高度,按需调整
        return QSize(option.rect.width(), 20);
    }
};

2. 在主窗口中绑定委托

// 初始化委托并绑定到QListWidget
TimelineDelegate *delegate = new TimelineDelegate(this);
ui->TimeLineDisplayer->setItemDelegate(delegate);

// 添加空项即可,委托会自动绘制长条
ui->TimeLineDisplayer->addItem("");

方案二:调整图标方案的限制(仅作备选)

如果坚持用图标实现,需强制设置项的尺寸并确保QListWidget宽度足够:

QIcon icon(":/black.jpg");
ui->TimeLineDisplayer->addItem("");
ui->TimeLineDisplayer->item(0)->setIcon(icon);
ui->TimeLineDisplayer->setIconSize(QSize(500, 20));
// 强制设置项的尺寸,突破默认限制
ui->TimeLineDisplayer->item(0)->setSizeHint(QSize(500, 20));
// 同时确保QListWidget本身宽度不小于500
ui->TimeLineDisplayer->setMinimumWidth(520);

注:此方案受QListWidget视图宽度限制,当窗口缩小时长条仍可能被截断,自定义委托方案更灵活稳定。

内容的提问来源于stack exchange,提问作者hosimiake021

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 00:55:13