2012-05-23 127 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) 
相關問題