自定义paint()无法使用QLayout.setSpacing()

时间:2012-07-10 07:05:22

标签: qt pyqt4 pyside

我正在努力理解看似简单的事情:

我有一个来自QPushButton的自定义小部件子类,我在QGridLayout()中布置了多个实例。我添加一个paint()函数并绘制背景颜色以填充按钮的rect()时,布局的间距似乎不再有效。 这是一个显示我的意思的屏幕截图: enter image description here

这显示默认的QPushButtons遵循布局的间距,而我的自定义“按钮”则没有。 我确定我只需要(重新)在我的CustomButton中实现一些东西但是找不到它。我尝试设置contentMargins无济于事。

我错过了什么?也许我不需要填写self.rect()但还有其他东西? 以下是产生上述屏幕截图的示例代码:

import sys
from PySide.QtGui import *
from PySide.QtCore import *
class CustomButton(QPushButton):
    def __init__(self, tool, icon=None, parent=None):
        super(CustomButton, self).__init__(parent)
        self.setSizePolicy(QSizePolicy.Expanding,  QSizePolicy.Fixed)
        self.setMinimumWidth(200)
        self.frameGeometry()

    def paintEvent(self, event):
        painter = QPainter(self)
        bgColor  = QColor(60, 60, 60)
        painter.fillRect(self.rect(), bgColor)

app = QApplication(sys.argv)
mainWindow = QWidget()
grid = QGridLayout()
grid.setSpacing(10)
mainWindow.setLayout(grid)
for i in xrange(4):
    btn1 = CustomButton('A')
    btn2 = QPushButton('B')
    grid.addWidget(btn1, 0, i)
    grid.addWidget(btn2, 1, i)

mainWindow.show()
sys.exit(app.exec_())

1 个答案:

答案 0 :(得分:0)

所以一个解决方案似乎是手动调整self.rect()要小一点,虽然我不明白为什么这是必要的,因为我认为这是布局的间距:

def paintEvent(self, event):
    rect = self.rect()
    rect.adjust(5,5,-5,-5)
    painter = QPainter(self)
    bgColor = QColor(60, 60, 60)
    painter.fillRect(rect, bgColor)

这会给我我需要的间距。如果有人能够阐明这是一个错误还是一个功能,我将非常感激。