如何设置QTableView选中行的整行边框样式及选中圆角效果
QTableView 实现选中行整行圆角边框效果
要实现自定义选中行的整行圆角边框(即你说的selection-border-radius效果),核心逻辑是重写绘制委托,替代默认的单元格选中样式绘制,整行统一计算绘制区域后渲染圆角。
实现步骤
- 第一步:自定义
QStyledItemDelegate子类,重写paint方法,判断当前行是否为选中状态,若为选中则先绘制整行的圆角背景+边框,再绘制单元格文本内容
核心实现代码示例(PyQt/PySide 版本):from PyQt5.QtWidgets import QStyledItemDelegate, QStyle from PyQt5.QtGui import QPainter, QColor, QBrush, QPen from PyQt5.QtCore import Qt, QRectF class RoundedSelectionDelegate(QStyledItemDelegate): def paint(self, painter: QPainter, option, index): # 先判断当前行是否选中 if option.state & QStyle.State_Selected: painter.save() painter.setRenderHint(QPainter.Antialiasing) # 获取整行的绘制区域(把当前单元格的横向扩展到整行宽度) row_rect = option.rect row_rect.setLeft(option.widget.viewport().rect().left()) row_rect.setRight(option.widget.viewport().rect().right()) # 自定义圆角半径、背景色、边框色 radius = 6 bg_color = QColor("#409EFF") border_color = QColor("#66B1FF") # 绘制圆角背景 painter.setBrush(QBrush(bg_color)) painter.setPen(Qt.NoPen) painter.drawRoundedRect(QRectF(row_rect), radius, radius) # 绘制圆角边框(可选) painter.setPen(QPen(border_color, 1)) painter.setBrush(Qt.NoBrush) painter.drawRoundedRect(QRectF(row_rect), radius, radius) painter.restore() # 绘制文本时调整前景色为选中态的白色 option.palette.setColor(option.palette.Text, QColor("#FFFFFF")) # 调用父类方法绘制单元格文本、图标等内容 super().paint(painter, option, index) - 第二步:将自定义委托绑定到你的QTableView实例上
# 你的QTableView实例对象 table_view = QTableView() # 绑定委托,所有单元格都用这个委托绘制 table_view.setItemDelegate(RoundedSelectionDelegate(table_view)) - 第三步:关闭默认的选中样式避免重叠,在QSS中添加以下配置:
QTableView { outline: none; } QTableView::item:selected { background: transparent; }
注意事项
- 如果需要保留交替行背景色,可在委托的paint方法中先判断行奇偶,绘制非选中态的交替背景,再绘制选中态的圆角样式
- 绘制整行区域时要基于
viewport的宽度计算,避免出现横向滚动时圆角绘制不全的问题 - 可以根据需求自行调整代码中的圆角半径、背景色、边框色参数,匹配你的UI风格
内容的提问来源于stack exchange,提问作者siya
相关产品推荐
相关产品推荐

