父小部件上的中心小部件没有布局

时间:2012-05-23 11:52:34

标签: python pyqt4 pyside

我在不使用布局的情况下向父窗口小部件添加窗口小部件(因为我使用的是一些与布局尝试的设置冲突的动画)。

我正在尝试了解我需要做些什么来手动将子窗口小部件与其父窗口对齐(即使在调整父窗口小部件的大小时也将其水平和垂直居中)。

我自己尝试使用QWidget.move()QWidget.setGeometry()来计算位置,但由于我似乎无法获得正确的父宽度和高度,因此无法正常工作。

以下是我正在尝试实现的简化示例:

import sys
from PySide.QtGui import *
from PySide.QtCore import *

class Test( QWidget ):

    def __init__( self, parent=None ):
          super( Test, self ).__init__( parent )

    def sizeHint( self ):
        return QSize( 500, 500 )

    def addPage( self, widget ):
        widget.setParent( self )
        # THIS SEEMS UNPREDICTABLE:
        widget.move( self.sizeHint().width()/2, self.sizeHint().height()/2 ) 

if __name__ == '__main__':
    app = QApplication( sys.argv )

    mainW = Test()
    childW = QPushButton( 'centre me please' )
    mainW.addPage( childW )
    mainW.show()

    sys.exit( app.exec_() )

1 个答案:

答案 0 :(得分:0)

您可以使用QWidget.setGeometry将子窗口小部件放在中心位置。如果您希望它保持这种方式,无论您的主要小部件发生什么,那么您需要捕获与您期望的更改相对应的事件。

以下内容应该有效:

#!/usr/bin/env python


from PyQt4 import QtGui, QtCore
import sys

class Application(QtGui.QApplication):

    def __init__(self):
        QtGui.QApplication.__init__(self, sys.argv)

        self.main = MyWidget()
        self.main.show()


class MyWidget(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QLabel.__init__(self, parent)

        self.setStyleSheet("QWidget { background-color : white}")
        self.setGeometry(0, 0, 200, 200)

        self.sub_widget = QtGui.QWidget(self)
        self.sub_widget.setStyleSheet("QWidget { background-color : black}")
        self.sub_widget.setGeometry((self.width()-100)/2, (self.height()-100)/2 , 100, 100)

    def resizeEvent(self, event):

        self.sub_widget.setGeometry((self.width()-100)/2, (self.height()-100)/2 , 100, 100)