使单击的 QListWidgetItem 无边框

Posted

技术标签:

【中文标题】使单击的 QListWidgetItem 无边框【英文标题】:Making a clicked QListWidgetItem borderless 【发布时间】:2020-07-16 03:27:19 【问题描述】:

我有一个 QListWidget 子类小部件处理鼠标事件,如下图:

当光标悬停在图标上时,其项目将显示文本,并且悬停背景是透明的。单击后选择将自动清除,但悬停时我仍然在单击的项目周围出现虚线:

我将样式表设置如下:

self.setStyleSheet("ListLabelWidget background: transparent;border: borderless;\
                    ListLabelWidget::item:hover background-color: transparent;")

如果我将悬停边框设置为无边框或 0px:

self.setStyleSheet("ListLabelWidget background: transparent;border: borderless;\
                    ListLabelWidget::item:hover background-color: transparent;border: borderless;")

矩形仍然显示在文本字段周围:

我应该怎么做才能完全隐藏它?

【问题讨论】:

请提供minimal reproducible example @S.Nick Setting stylesheet 是我输入的关于这个问题的所有代码,这种情况可以通过简单地创建一个 QListWidget 子类并将其背景设置为透明来重现 【参考方案1】:

我找不到使用qss 的任何解决方案,但可以使用QStyledItemDelegate 实现它。这是 C++ 的示例。

首先为项目创建自己的小部件。在我的示例中,我在设计器中创建了带有两个 QLabel 的简单小部件:用于图标和文本。并添加简单的数据设置方法

void ItemWidget::SetData(const QIcon &icon, const QString &text)

    ui->iconLabel->setPixmap(icon.pixmap(QSize(16,16)));
    ui->textLabel->setText(text);

然后继承QStyledItemDelegate并重新实现paint方法

class ListWidgetDelegate : public QStyledItemDelegate

    Q_OBJECT
public:
    explicit ListWidgetDelegate(QObject *parent = 0);

    void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
    
        ItemWidget widget;
        widget.SetData(index.data(Qt::DecorationRole).value<QIcon>(),
                       index.data(Qt::DisplayRole).toString());
        widget.resize(option.rect.width(), option.rect.height());

        painter->drawPixmap(option.rect, QPixmap::grabWidget(&widget));
    
;

如果您需要更大的物品,您也可以重新实现sizeHint 方法。

最后为QListWidget设置项目和委托。

QIcon icon(":/crown.ico");
QListWidgetItem *item1 = new QListWidgetItem(icon, "Text1", ui->listWidget);
QListWidgetItem *item2 = new QListWidgetItem(icon, "Text2", ui->listWidget);
QListWidgetItem *item3 = new QListWidgetItem(icon, "Text3", ui->listWidget);
QListWidgetItem *item4 = new QListWidgetItem("No Icon", ui->listWidget);

ListWidgetDelegate *delegate = new ListWidgetDelegate(ui->listWidget);
ui->listWidget->setItemDelegate(delegate);

在这个实现中,QListWidget::item 不需要 qss (StyleSheet)

【讨论】:

看起来很有希望。我稍后会尝试这个,但现在我用的是懒惰的方式 - 将焦点策略设置为 NoFocus,因为无论如何我都需要覆盖鼠标事件。

以上是关于使单击的 QListWidgetItem 无边框的主要内容,如果未能解决你的问题,请参考以下文章

C#WinForm无边框窗体移动----模仿鼠标单击标题栏移动窗体位置

如何使 QListWidgetItem 根据其内容自动调整大小,并适合其 QListWidget

在 QListWidget 项目上绘制边框使文本在单击时消失

Delphi中无边框窗体应用程序使任务栏右键菜单有效的方法

要使一个textbox显示的像无边框的label,要怎样写css

怎么把QListWidget 的边框设置为透明 或者是看不见