这与Qt:QListWidget项之间的分隔线?有关。 但是,上面的答案在每个项目后添加分隔线,我想知道一种在特定项目后添加分隔线的方法。
QListWidgetItem
,该项目需要定义setSizeHint()
,以使其高度较小,setFlags()
应该定义Qt::NoItemFlags
,以使该项不可选择等。然后,在将该项添加到QListWidget
后,将一个形状设置为QFrame::HLine
的QFrame
作为该项的小部件(使用QListWidget::setItemWidget()
)。我目前能想到的唯一解决方案是将我想在此分隔符线/框的每侧添加一些间隙。我该如何实现?
QFrame
嵌入另一个QWidget
中,并将QWidget
作为该项的小部件(请记住,您需要为QWidget
添加布局管理器以嵌入其中的任何内容)。然后,在小部件上设置适当的边距:QWidget::setContentsMargins(int left, int top, int right, int bottom)
。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);
listWidget->setItemDelegate(new MyStyledItemDelegate());
myListWidget->setStyleSheet( "QListWidget::item[separator="true"] { border-bottom: 1px solid black; }" );
在小部件上,您希望绘制该线:
myWidget->setProperty("separator", true);
然而要注意文档中所说:
警告:如果Qt属性的值在设置样式表后发生更改,则可能需要强制重新计算样式表。一种方法是取消设置样式表,然后再次设置它。
QListWidget
(QListWidgetItem
) 中的项不是 QObject
,因此它们不能持有动态属性。 - Googie
setSizeHint()
,使它们的高度很小,而且setFlags()
应该定义为Qt::NoItemFlags
,这样该项就不能被选择等。哦,你还需要找到一种方法来绘制项目中的水平线 ;) 也许可以尝试使用QListWidget::setItemWidget()
并将QFrame
放置在那里,其形状设置为QFrame::HLine
。 - Googie