Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Windows上使用PySide/PyQT删除QPushButton周围奇怪的一像素空间_Python_Windows_Pyqt5_Pyside_Pyside2 - Fatal编程技术网

Python 在Windows上使用PySide/PyQT删除QPushButton周围奇怪的一像素空间

Python 在Windows上使用PySide/PyQT删除QPushButton周围奇怪的一像素空间,python,windows,pyqt5,pyside,pyside2,Python,Windows,Pyqt5,Pyside,Pyside2,这是我当前的代码 导入系统 从PySide6.QtWidgets导入( QApplication, QGridLayout, QProgressBar, QPushButton, QTableWidget, QWidget ) 类窗口(QWidget): 定义初始化(自): super()。\uuuu init\uuuuu() self.setWindowTitle(“示例”) 布局=QGridLayout() 布局。设置内容边缘(6,6,6,6) addWidget(QTableWidget(

这是我当前的代码

导入系统 从PySide6.QtWidgets导入( QApplication, QGridLayout, QProgressBar, QPushButton, QTableWidget, QWidget ) 类窗口(QWidget): 定义初始化(自): super()。\uuuu init\uuuuu() self.setWindowTitle(“示例”) 布局=QGridLayout() 布局。设置内容边缘(6,6,6,6) addWidget(QTableWidget(),0,0,1,3) bar=QProgressBar() bar.设定值(50) bar.setTextVisible(False) layout.addWidget(条、1、0、1、2) btn=QPushButton(“确定”) layout.addWidget(btn,1,2,1,1) self.setLayout(布局) 如果名称=“\uuuuu main\uuuuuuuu”: app=QApplication(sys.argv) window=window() window.show() sys.exit(app.exec_())

正如你所见,按钮周围有一个奇怪的单像素空间

有办法删除它吗


我尝试使用CSS并设置负边距,但没有成功。

这完全取决于QStyle,显然在Windows上,按钮的边距比其他小部件稍大

这不能通过使用样式表来解决,除非为所有按钮状态(正常、按下、禁用等)提供带有边框的完整样式表

只有两种解决方案:绕过小部件上的绘制,或使用proxystyle

paintEvent()
覆盖 QProxyStyle
我有
AttributeError:'PySide6.qtwidts.QCommonStyle'对象在第一种方法中没有属性“baseStyle”
。第二种方法是在app.style().objectName()=='windowsvista':@0lan抱歉的情况下使用
。将该行更改为
self.proxy().baseStyle().objectName()
。对于第一种方法,仅
self.style().proxy().objectName()!='windowsvista':
正在运行。我也在Linux上试过。@0lan抱歉,我弄错了方法,以为这行代码是为代理类写的。我会相应地编辑这篇文章。
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())