Qt:QListWidget分隔符行在分词项之后?

Qt:QListWidget分隔符行在分词项之后?,qt,qlistwidget,Qt,Qlistwidget,这与 但是上面的回答在每个项目后添加分隔符行,我想知道在特定项目后添加分隔符行的方法。您可以尝试在动态属性中使用相同的技巧 myListWidget->setStyleSheet( "QListWidget::item[separator="true"] { border-bottom: 1px solid black; }" ); 在小部件上,您希望画一条线: myWidget->setProperty("separator", true); 不过,请小心,该公司表示: 警告:

这与
但是上面的回答在每个项目后添加分隔符行,我想知道在特定项目后添加分隔符行的方法。

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

myListWidget->setStyleSheet( "QListWidget::item[separator="true"] { border-bottom: 1px solid black; }" );
在小部件上,您希望画一条线:

myWidget->setProperty("separator", true);
不过,请小心,该公司表示:

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


我发现了另一种可能性,这次进行了测试: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,它将在项的文本下画一条黑线。

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

至于你在评论中的补充问题,即:

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


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

我认为样式表技巧在这里不适用。您是否考虑过添加特殊项目作为分隔符?这些项目需要定义
setSizeHint()
,因此它们的高度很小,
setFlags()
也应该定义
Qt::NoItemFlags
,因此项目是不可选择的,等等。哦,您需要找到在项目中绘制水平线的方法;)也许可以尝试使用
QListWidget::setItemWidget()
并将
QFrame
放在那里,它的形状设置为
QFrame::HLine
。是的,我喜欢这个主意。让我试试这个,谢谢你的建议。在回答中,我猜@KaxukiCP会将其与“特定列表小部件”混淆,而不是同一个小部件和特定项目之后。@Googie感谢您的建议。它起作用了:)你应该把它作为答案加上去。然而,我还有一个小问题——看看你是否能在这里提供帮助。我想在分隔线/框架的每一侧添加一些间隙。如何实现这一点,任何指针都会非常有用。这将在列表小部件的每个项目下应用分隔符。问题是如何在同一个列表小部件的特定项下应用分隔符。有一个细微的区别,在sylesheet中我添加了一个属性选择器。在每个小部件上,它将检查属性“separator”是否为真值。如果不存在或属性不存在,则不应应用样式。此解决方案中有2个错误:1。您正在为整个列表小部件设置属性,而不是它的特定项。2.
QListWidget
QListWidgetItem
)中的项目不是
QObject
,因此它们不能包含动态属性。@KazukiCP我想根据每个项目的内容而不是每个小部件添加分隔线。哎呀,Googie是对的。我忘记了QListWidgetItem不是QObject的事实。发布前应进行测试>\还要禁用分隔符项的悬停添加ui->listWidget->setStyleSheet(“QListWidget::item:disabled{background:transparent;}”);