【问题标题】:Making a clicked QListWidgetItem borderless使单击的 QListWidgetItem 无边框
【发布时间】: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;}")

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

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

【问题讨论】:

  • @S.Nick Setting stylesheet 是我输入的关于这个问题的所有代码,这种情况可以通过简单地创建一个 QListWidget 子类并将其背景设置为透明来重现

标签: qt pyqt5 qtstylesheets


【解决方案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,因为无论如何我都需要覆盖鼠标事件。
猜你喜欢
  • 2020-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多