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

8

1
我认为这个样式表技巧在这里不适用。你考虑过添加特殊项作为分隔符吗?这些项需要定义setSizeHint(),使它们的高度很小,而且setFlags()应该定义为Qt::NoItemFlags,这样该项就不能被选择等。哦,你还需要找到一种方法来绘制项目中的水平线 ;) 也许可以尝试使用QListWidget::setItemWidget()并将QFrame放置在那里,其形状设置为QFrame::HLine - Googie
是的,我喜欢这个想法。让我试试,谢谢你的建议。 在回答中,我猜@KaxukiCP混淆了“特定列表小部件”和同一小部件以及特定项目之后的问题。 - Maverick33
@Googie 谢谢你的建议。它起作用了 :) 你应该将它添加为答案。然而,我还有一个小问题 - 看看你能否在这里提供帮助。 我想在这个分隔线/框架的每一侧添加一些间隙。你有什么建议吗?任何指针都会非常有帮助。 - Maverick33
3个回答

12
创建一个代表分隔符的QListWidgetItem,该项目需要定义setSizeHint(),以使其高度较小,setFlags()应该定义Qt::NoItemFlags,以使该项不可选择等。然后,在将该项添加到QListWidget后,将一个形状设置为QFrame::HLineQFrame作为该项的小部件(使用QListWidget::setItemWidget())。
至于您在评论中提出的其他问题,即:

我想在此分隔符线/框的每侧添加一些间隙。我该如何实现?

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

另外,要禁用分隔符项的悬停,请添加以下代码: ui->listWidget->setStyleSheet("QListWidget::item:disabled { background: transparent; }"); - Jeka

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,则会在项目文本下面绘制一条黑线。

-1
你可以尝试使用相同的技巧来处理动态属性。
myListWidget->setStyleSheet( "QListWidget::item[separator="true"] { border-bottom: 1px solid black; }" );

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

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

然而要注意文档中所说:

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


这将在列表小部件的每个项目下应用分隔符。问题是如何在同一列表小部件中为特定项目应用分隔符。 - Googie
有一个微妙的区别,在样式表中我添加了一个属性选择器。对于每个小部件,它将检查属性“separator”是否为真值。如果不存在或属性不存在,则不应用样式。 - KazukiCP
这个解决方案中有两个错误:1. 你正在为整个列表小部件设置属性,而不是它的特定项。2. QListWidget (QListWidgetItem) 中的项不是 QObject,因此它们不能持有动态属性。 - Googie
@KazukiCP 我想根据每个项目的内容添加分隔线,而不是每个小部件。 - Maverick33
哎呀,Googie是对的。 我忘记了QListWidgetItem不是QObject。 在发布之前应该进行测试>_< - KazukiCP

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接