2012-05-23 128 views
0

我在没有使用布局的情况下将窗口部件添加到父窗口小部件中(因为我正在使用与布局尝试执行操作相冲突的动画)。没有布局的父窗口小部件上的中心窗口小部件

我想了解我需要做些什么来手动对齐子对象的父对象(即使父对象对象被调整大小时,它也会水平和垂直居中)。

我试过自己计算位置并使用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_()) 
+0

和经常,发布答案后立即浮现在脑海。我需要使用以下行来实现resizeEvent以获取我之后的内容: widget.move((event.size().width() - widget.sizeHint()。width())/ 2,(event.size ().height() - widget.sizeHint()。height())/ 2) –

+0

哎呀我没看过:) – Benjamin

回答

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) 
相关问题