You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

QTableWidget单元格左padding与自定义背景色不兼容问题咨询

QTableWidget 样式冲突解决方案

问题原因

该冲突属于Qt QSS渲染优先级的固有特性:

  • 给QTableWidget::item设置border属性后,Qt会完全切换为QSS逻辑绘制单元格,此时QSS配置的padding-left可正常生效,但会覆盖QTableWidgetItem.setBackground()设置的自定义背景色
  • 不设置border属性时,Qt使用原生单元格绘制逻辑,setBackground设置的粉色背景可正常生效,但原生逻辑不会处理QSS的padding属性,导致左内边距失效

同时你原有代码两次调用setStyleSheet,后一次的表格样式会覆盖前一次的滚动条样式,导致滚动条样式不生效,需要合并QSS配置。

解决方法

完全通过QSS控制所有单元格样式,避免代码设置背景和QSS渲染的优先级冲突:

  1. 合并所有QSS配置到同一次setStyleSheet调用中,保留滚动条样式
  2. 新增QTableWidget::item:column(0)选择器,直接在QSS中设置第一列的粉色背景
  3. 删除代码中给第一列单元格调用setBackground的逻辑

修改后完整可运行代码

#! python
# -*- coding: utf-8 -*-

from PyQt5.QtWidgets import QApplication,QWidget,QMenu,QTableWidget,QTableWidgetItem
from PyQt5.QtGui import QPainter,QBrush,QColor,QFont
from PyQt5.QtCore import Qt,QPoint
import sys
import pandas as pd


class win(QWidget):

    def __init__(self,master=None):
        super(win,self).__init__(master)
        left=800;top=100;width=1360;height=1200
        self.setGeometry(left,top,width,height)
        self.setWindowFlags(Qt.FramelessWindowHint)
        self.setAttribute(Qt.WA_TranslucentBackground)

        self.table = QTableWidget(10,3,self)
        self.table.setHorizontalHeaderLabels(["Name","Street","City"])
        self.table.horizontalHeader().setStyleSheet('QHeaderView::section{font-family:"Times New Roman";font-size:12pt;color:darkBlue;background-color:rgb(255,239,239);font-weight:400;border:2px solid rgba(0,0,126,255);border-radius:16px}')
        self.table.verticalHeader().setStyleSheet('QHeaderView::section{font-family:"Times New Roman";font-size:9pt;color:darkBlue;background-color:rgb(255,239,239);font-weight:400;border:2px solid rgba(0,0,126,255);border-radius:16px}')
        self.table.verticalHeader().setDefaultAlignment(Qt.AlignCenter)
        self.table.verticalHeader().setFixedWidth(35)
        self.table.setColumnWidth(0,300)
        self.table.setColumnWidth(1,300)
        self.table.setColumnWidth(2,300)
        self.table.setAlternatingRowColors(True)
        # 合并所有QSS配置,新增第一列背景设置
        self.table.setStyleSheet("""
        QScrollBar:horizontal{border:2px solid grey;background:#32CC99;height:14px}
        QScrollBar:vertical{border:2px solid grey;background:#32CC99;width:15px}
        QTableView{alternate-background-color:rgba(220,254,218,255);background-color:rgba(201,254,198,255);color:rgba(200,0,0,255);font-family:Century725 Cn BT;font-size:12pt;padding:10px;border:2px outset rgba(0,0,126,255);border-radius:30px}
        QTableWidget::item{padding-left:20px;border:0px}
        QTableWidget::item:column(0){background-color: rgb(255,221,255);}
        QTableView::item:selected:active{background:#4B94FF;}
        """)
        self.table.setGeometry(200,300,960,400)

        col = ['Name','Street','City']
        data = [['James','Oxford','London'],['Robert','Abbey','Liverpool'],['John','Carnaby','Bristol']]
        df = pd.DataFrame(columns=col,data=data)

        self.LoadTable(df)


    def LoadTable(self,df):

        self.table.blockSignals(True)
        self.table.setSortingEnabled(False)
        while (self.table.rowCount() > 0):
            self.table.removeRow(0)

        for index,row in df.iterrows():
            self.table.insertRow(index)

            font = QFont('Brush Script MT',20)
            item = QTableWidgetItem(row['Name'])
            item.setTextAlignment(Qt.AlignCenter)
            item.setFont(font)
            item.setForeground(QBrush(QColor(0,0,255)))
            # 删除原来的setBackground调用
            self.table.setItem(index,0,item)
            self.table.resizeRowsToContents()

            item = QTableWidgetItem(row['Street'])
            item.setTextAlignment(Qt.AlignLeft|Qt.AlignVCenter)
            self.table.setItem(index,1,item)

            item = QTableWidgetItem(row['City'])
            item.setTextAlignment(Qt.AlignLeft|Qt.AlignVCenter)
            self.table.setItem(index,2,item)

        self.table.setSortingEnabled(True)
        self.table.blockSignals(False)


    def paintEvent(self,ev):
        painter = QPainter(self)
        painter.setRenderHint(QPainter.Antialiasing,True)
        painter.begin(self)
        painter.setBrush(QColor(76,77,0,120))
        painter.drawRoundedRect(self.rect(),140,140)
        painter.end()

    def mousePressEvent(self,event):
        self.oldPos = event.globalPos()

    def mouseMoveEvent(self,event):
        delta = QPoint(event.globalPos()-self.oldPos)
        self.move(self.x()+delta.x(),self.y()+delta.y())
        self.oldPos = event.globalPos()

    def contextMenuEvent(self,event):
        contextMenu = QMenu(self)
        actionDue = contextMenu.addAction("Exit")
        action = contextMenu.exec_(self.mapToGlobal(event.pos()))
        if action == actionDue:
            quit()


App = QApplication(sys.argv)
widget = win()
widget.show()
sys.exit(App.exec_())

内容的提问来源于stack exchange,提问作者Nepura

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 11:36:03