使单击的 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 项目上绘制边框使文本在单击时消失