0

我在不使用布局的情况下将小部件添加到父小部件(因为我正在使用一些与布局尝试执行的操作相冲突的动画)。

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

我试过自己计算位置并使用QWidget.move()and 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_() )
4

1 回答 1

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)
于 2012-05-23T16:26:54.933 回答