2012-07-10 92 views
0

我努力理解看似简单的东西的工作:定制油漆()不QLayout.setSpacing()

我有一个从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_()) 
+0

您的示例按照我的预期工作..也许您需要一个更新的PySide? (也可能是一个操作系统特定的问题) – Luke 2012-07-10 21:37:23

+0

有趣的是,谢谢(我在OSX 1.0.4 pyside上) – 2012-07-11 01:05:21

+0

有没有人可以重现这个问题?无论我做主窗口的宽度如何,我都没有在自定义按钮之间找到任何间距。 – 2012-07-13 04:21:44

回答

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) 

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