Это мой текущий код.
import sys
from PySide6.QtWidgets import (
QApplication,
QGridLayout,
QProgressBar,
QPushButton,
QTableWidget,
QWidget
)
class Window(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("Example")
layout = QGridLayout()
layout.setContentsMargins(6, 6, 6, 6)
layout.addWidget(QTableWidget(), 0, 0, 1, 3)
bar = QProgressBar()
bar.setValue(50)
bar.setTextVisible(False)
layout.addWidget(bar, 1, 0, 1, 2)
btn = QPushButton("OK")
layout.addWidget(btn, 1, 2, 1, 1)
self.setLayout(layout)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())
И, как вы можете видеть, вокруг кнопки есть странное однопиксельное пространство.
Есть ли способ удалить его?
Я безуспешно пытался использовать CSS и ставить отрицательные поля.
Это полностью зависит от QStyle, по-видимому, в Windows кнопки имеют немного больший запас, чем другие виджеты.
Это не может быть решено с помощью таблиц стилей, если вы не предоставите полную таблицу стилей с границами для всех состояний кнопок (нормальное, нажатое, отключенное и т. д.).
Решения всего два: обойти отрисовку виджета или использовать проксистиль.
paintEvent()
переопределитьclass BiggerButton(QtWidgets.QPushButton):
def paintEvent(self, event):
if self.style().proxy().objectName() != 'windowsvista':
super().paintEvent(event)
return
opt = QtWidgets.QStyleOptionButton()
self.initStyleOption(opt)
opt.rect.adjust(-1, -1, 1, 1)
qp = QtWidgets.QStylePainter(self)
qp.drawControl(QtWidgets.QStyle.CE_PushButton, opt)
class Window(QtWidgets.QWidget):
def __init__(self):
# ...
btn = BiggerButton("OK")
class Proxy(QtWidgets.QProxyStyle):
def drawControl(self, ctl, opt, qp, widget=None):
if ctl == self.CE_PushButton:
opt.rect.adjust(-1, -1, 1, 1)
super().drawControl(ctl, opt, qp, widget)
# ...
app = QtWidgets.QApplication(sys.argv)
if app.style().objectName() == 'windowsvista':
app.setStyle(Proxy())
Второй подход работает с if app.style().objectName() == 'windowsvista':
.
@0lan извините. Измените эту строку на self.proxy().baseStyle().objectName()
.
Для первого подхода работает только self.style().proxy().objectName() != 'windowsvista':
. Я пробовал и на линуксе.
@ 0lan еще раз извините, я ошибся в подходе и подумал, что линия предназначена для класса Proxy. Я отредактирую пост соответственно.
У меня
AttributeError: 'PySide6.QtWidgets.QCommonStyle' object has no attribute 'baseStyle'
с первого подхода.