如何在PyQt的QTableWidget中隐藏选定单元格的边框?

9

有没有办法隐藏QTableWidget中选定单元格的边框(或将边框颜色设置为白色)?默认情况下,会显示一个带虚线的边框。您能帮助我吗?

3个回答

16

我倾向于这样做:

ui->tableWidget->setFocusPolicy(Qt::NoFocus);

你也可以使用设计选项卡更改焦点策略。


4
这样做会失去键盘导航功能。 - swdev

15

看起来你试图隐藏的选定单元格周围的点状边框是一个焦点矩形。任何给定的单元格都可以具有焦点,但并非同时被选中,反之亦然。如果您不想绘制此边框,请使用项目代理。在那里,您可以在绘制之前从项目的状态中删除State_HasFocus样式。请参见下面的示例,演示如何进行操作,它使用c++编写,如果您在将其转换为python时遇到麻烦,请告诉我。

// custom item delegate class
class NoFocusDelegate : public QStyledItemDelegate
{
protected:
    void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const;
};

void NoFocusDelegate::paint(QPainter* painter, const QStyleOptionViewItem & option, const QModelIndex &index) const
{
    QStyleOptionViewItem itemOption(option);
    if (itemOption.state & QStyle::State_HasFocus)
        itemOption.state = itemOption.state ^ QStyle::State_HasFocus;
    QStyledItemDelegate::paint(painter, itemOption, index);
}
...
// set the item delegate to your table widget
ui->tableView->setItemDelegate(new NoFocusDelegate());

希望这能有所帮助,谢谢。


2
非常感谢您的回复。由于我使用了qtablewidget,因此我已经使用setFocusPolicy(QtCore.Qt.NoFocus)实现了相同的功能。不过我不熟悉代理。我无法为这个答案点赞。它说声望积分必须大于15. - Jeba

3

Qt::NoFocus会移除QTableWidget中行的选中状态。

接受答案的Python3/PySide2版本:

class NoFocusDelegate(QtWidgets.QStyledItemDelegate):
    def paint(self, painter: PySide2.QtGui.QPainter, option: PySide2.QtWidgets.QStyleOptionViewItem, index: PySide2.QtCore.QModelIndex) -> None:
        itemOption = QtWidgets.QStyleOptionViewItem(option)
        if option.state & QtWidgets.QStyle.State_HasFocus:
            itemOption.state = itemOption.state ^ QtWidgets.QStyle.State_HasFocus
        super().paint(painter, itemOption, index)

table.setItemDelegate(NoFocusDelegate())

对我来说完美地运作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接