这与Qt: QListWidget separator line between items?有关 但是这个上面的答案在每个项目之后添加了分隔线,我想知道在特定项目之后添加分隔线的方法。
答案 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属性的值发生更改,则可能需要强制重新计算样式表。实现此目的的一种方法是取消设置样式表并再次设置它。