【问题标题】:Qt: QListWidget separator line after particuler items?Qt:粒子项目后的 QListWidget 分隔线?
【发布时间】:2014-07-10 08:22:20
【问题描述】:

这与Qt: QListWidget separator line between items?有关 但是上面的答案在每个项目之后添加了分隔线,我想知道一种在特定项目之后添加分隔线的方法。

【问题讨论】:

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

标签: qt qlistwidget


【解决方案1】:

创建一个代表分隔符的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)

【讨论】:

  • 还要禁用分隔项的悬停添加 ui->listWidget->setStyleSheet("QListWidget::item:disabled { background: transparent; }");
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    myListWidget->setStyleSheet( "QListWidget::item[separator="true"] { border-bottom: 1px solid black; }" );
    

    在你想要画线的小部件上:

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

    但是要小心documentation 说:

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

    【讨论】:

    • 这将在列表小部件的每个项目下应用分隔符。问题是如何在同一个列表小部件中的特定项目下应用分隔符。
    • 有一个细微的差别,在样式表中我添加了一个属性选择器。在每个小部件上,它将检查属性“分隔符”是否为真值。如果不存在或该属性不存在,则不应应用该样式。
    • 此解决方案有 2 个错误: 1. 您正在为整个列表小部件设置属性,而不是其特定项目。 2. QListWidget (QListWidgetItem) 中的项目不是QObject,因此它们不能保存动态属性。
    • @KazukiCP 我想根据每个项目的内容添加分隔线,而不是每个小部件。
    • 糟糕,Googie 是对的。我忘记了 QListWidgetItem 不是 QObject 的事实。发帖前应该先测试>_
    猜你喜欢
    • 2021-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-28
    • 1970-01-01
    • 2017-05-13
    • 1970-01-01
    相关资源
    最近更新 更多