【问题标题】:Remove the strange one-pixel space around QPushButton with PySide/PyQT on Windows在 Windows 上使用 PySide/PyQT 移除 QPushButton 周围奇怪的一像素空间
【发布时间】:2020-12-11 14:43:55
【问题描述】:

这是我当前的代码。

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 并设置负边距但没有成功。

【问题讨论】:

    标签: python windows pyqt5 pyside pyside2


    【解决方案1】:

    这完全取决于 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")
    

    QProxyStyle

    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())
    

    【讨论】:

    • 我有AttributeError: 'PySide6.QtWidgets.QCommonStyle' object has no attribute 'baseStyle'第一种方法。
    • 第二种方法是使用if app.style().objectName() == 'windowsvista':
    • @0lan 抱歉。将该行更改为self.proxy().baseStyle().objectName()
    • 对于第一种方法,只有self.style().proxy().objectName() != 'windowsvista': 有效。我也在 Linux 上试过。
    • @0lan 再次抱歉,我弄错了方法,并认为该行是针对 Proxy 类的。我会相应地编辑帖子。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-16
    • 2021-09-03
    • 1970-01-01
    • 1970-01-01
    • 2011-06-05
    • 2018-06-18
    • 1970-01-01
    相关资源
    最近更新 更多