Qt:QListWidget分隔线后面的特殊项目?

时间:2014-07-10 08:22:20

标签: qt qlistwidget

这与Qt: QListWidget separator line between items?有关 但是这个上面的答案在每个项目之后添加了分隔线,我想知道在特定项目之后添加分隔线的方法。

3 个答案:

答案 0 :(得分:7)

创建代表分隔符的QListWidgetItem。这样的项目需要定义setSizeHint(),因此它的高度很小,setFlags()也应该定义Qt::NoItemFlags,因此项目不可选择等等。然后,在添加之后将项目设置为QListWidget,将QFrame的形状设置为QFrame::HLine,作为项目的小部件(使用QListWidget::setItemWidget())。

至于评论中的其他问题,即:

  

我想在此分隔线/框架的每一侧添加一些间隙。我怎样才能做到这一点?

我现在想到的唯一解决方案是将QFrame嵌入到另一个QWidget内,并将QWidget作为项目的小部件(请记住,您需要将布局管理器添加到QWidget以便在其中嵌入任何内容)。然后在窗口小部件上设置适当的边距:QWidget::setContentsMargins(int left, int top, int right, int bottom)

答案 1 :(得分:1)

我发现了另一种可能性并且这次测试了它:p 您可以创建一个继承QStyledItemDelegate的新类,如下所示:

void MyStyledItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    QStyledItemDelegate::paint(painter, option, index);

    // I have decided to use Qt::UserRole + 1 to store my boolean
    // but it could be any other role while it's value is bigger than Qt::UserRole
    QVariant isSeparator = index.data(Qt::UserRole + 1);
    if (isSeparator.isValid() && isSeparator.toBool())
    {
        QRect rct = option.rect;
        rct.setY(rct.bottom() - 1);
        painter->fillRect(rct, QColor::fromRgb(qRgb(0, 0, 0)));
    }
}

对于每个QListWidgetItem,您可以执行以下操作:

// Qt::UserRole + 1 => Must match the role set in the delegate
item->setData(Qt::UserRole + 1, true);

在您的QListWidget中安装自定义

listWidget->setItemDelegate(new MyStyledItemDelegate());

如果Qt :: UserRole + 1设置为true,它将在项目文本下绘制一条黑线。

答案 2 :(得分:-1)

您可以尝试使用与动态属性相同的技巧。

myListWidget->setStyleSheet( "QListWidget::item[separator="true"] { border-bottom: 1px solid black; }" );

在小部件上,您希望绘制线条:

myWidget->setProperty("separator", true);

但请注意documentation说:

  

警告:如果在设置样式表后Qt属性的值发生更改,则可能需要强制重新计算样式表。实现此目的的一种方法是取消设置样式表并再次设置它。