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;}”);