更改 QTableWidget 默认选择颜色,并使其半透明

Posted

技术标签:

【中文标题】更改 QTableWidget 默认选择颜色,并使其半透明【英文标题】:Change QTableWidget default selection color, and make it semi transparent 【发布时间】:2017-02-14 12:55:26 【问题描述】:

我正在尝试更改 QTableWidget 中选择的默认颜色,但我需要使其透明,以便我仍然可以看到底层单元格的颜色。

我用过:

self.setStyleSheet("QTableView selection-background-color: rgba(255, 0, 0, 50);  ")
self.setSelectionBehavior(QAbstractItemView.SelectRows)

所以现在选择颜色有点红色,但有些单元格定义为:

cell.setBackgroundColor(color)
...
self.setItem(i, j, cell)

单元格的颜色仍然被选择颜色覆盖(没有混合,只是粉红色选择)。我尝试为单元格设置前景色而不是背景色:

brush = QBrush(color, Qt.SolidPattern)
cell.setForeground(brush)

但它不会改变任何东西。 那么有没有一种简单的方法可以做到这一点,还是我应该手动处理选择? (用我自己的颜色重新绘制选定的行) 提前致谢。

【问题讨论】:

尝试使用 only 样式表,QTableWidget::item background-color: rgba(255, 0, 0, 50%); 设置正常单元格颜色,QTableWidget::item:selected background-color: rgba(20, 0, 0, 50%) 设置选定单元格颜色 如果我使用QTableWidget::item设置背景颜色,每个单元格的背景颜色都是一样的,对吧?问题是我们为每个单元格设置了不同的颜色,我们将小部件重新用于显示三值矩阵,所以颜色才是最重要的 你是对的,所以据我了解,你需要为每个单元格使用不同的颜色,但选择的颜色,对于每个单元格必须是相同的,并且具有一定的透明度(在你的情况下为红色),然后尝试将您的样式表应用到您的 QTableWidget 上,仅使用 QTableWidget::item:selected background-color: rgba(255, 0, 0, 50%) 我试过只使用你给我的那条线(顺便说一句,这条线和QTableView selection-background-color: rgba(255, 0, 0, 50); 有区别吗)但结果最终是相同的Visual。此外,选择不必是红色甚至是颜色:如果 a 可以圈出整行也可以。 【参考方案1】:

我有几乎相同的场景,但是我在单元格中有文本,我想要完全透明的选择(所以不改变背景颜色) 如果您设置透明颜色,它将是实心的(qt 中的错误?)所以我将文本设置为 BOLD(= 选中)并打开选择样式 这里的代码,也许它会有所帮助

//.h
#include <QStyledItemDelegate>
class SelectionControlDelegate : public QStyledItemDelegate

    public:
        SelectionControlDelegate(QObject* parent = 0);
        void initStyleOption(QStyleOptionViewItem* option, const QModelIndex& index) const override;
;

//.cpp
SelectionControlDelegate::SelectionControlDelegate(QObject* parent) : QStyledItemDelegate(parent)



void SelectionControlDelegate::initStyleOption(QStyleOptionViewItem* option, const QModelIndex& index) const

    QStyledItemDelegate::initStyleOption(option, index);
    const bool selected = option->state & QStyle::State_Selected;
    option->font.setBold(selected); // this will represent selected state
    if (selected)
    
        option->state = option->state & ~QStyle::State_Selected; // this will block selection-style = no highlight
    


// in widget class
...
_ui->tableView->setItemDelegate(new SelectionControlDelegate(this));
...


// when setting cell background, i would change also text color 
QColor textColor = backgroundColor.value() <= 120 ? Qt::white : Qt::black;  // if it is dark, text would be white otherwise black
// or you can compute invert color... 

这是我的可视化:选择了 5% 和 25% 的项目

选择展示

【讨论】:

以上是关于更改 QTableWidget 默认选择颜色,并使其半透明的主要内容,如果未能解决你的问题,请参考以下文章

QTableWidget 选择颜色

如何更改 qtablewidget 项的 qtooltip 的背景颜色?

如何在pyqt中更改Qtablewidget的特定单元格背景颜色

在 QTableWidget 中区分交替行颜色和选择颜色

QTableWidget 颜色、样式

QTableWidget - 更改行颜色