QWidget
QVBoxLayout
内QScrollArea
setWidgetResizable(True)
QWidget
与QWidget
对齐geometry()
当我调整其中一个geometry().x()
时,geometry().y()
会在图形用户界面中相应地重新定位自己,但他们的x()
属性并未反映出来,{{ 1}}和y()
在重定位之前和之后都保持不变。
到目前为止,我发现更新hide()
和show()
坐标的唯一方法是QScrollArea
和update()
updateGeometry()
。
我已尝试repaint()
,import sys
from PySide import QtGui, QtCore
class MainWindow(QtGui.QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.showMaximized()
self.widget_window = QtGui.QWidget()
self.scrollarea = QtGui.QScrollArea()
self.v_layout = QtGui.QVBoxLayout()
self.test_1 = QtGui.QPushButton('Test 1')
self.test_2 = QtGui.QPushButton('Test 2')
self.v_layout.addWidget(self.test_1)
self.v_layout.addWidget(self.test_2)
self.widget_window.setLayout(self.v_layout)
self.scrollarea.setWidgetResizable(True)
self.scrollarea.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn)
self.scrollarea.setAlignment(QtCore.Qt.AlignCenter)
self.scrollarea.setWidget(self.widget_window)
self.setCentralWidget(self.scrollarea)
print(self.test_2.geometry().x())
print(self.test_2.geometry().y())
self.test_1.setFixedHeight(1000)
#uncommenting the following next two lines, solves the problem
#self.scrollarea.hide()
#self.scrollarea.show()
print(self.test_2.geometry().x())
print(self.test_2.geometry().y())
def main():
app = QtGui.QApplication(sys.argv)
main = MainWindow()
sys.exit(app.exec_())
if __name__ == "__main__":
main()
和updateGeometry()
但未取得任何成功。
以下是我总结问题的示例测试代码:
geometry()
我的问题是:
hide()
应该实际更新show()
吗?答案 0 :(得分:1)
更新GUI时,它不是即时的。当您将控件提供给事件循环时执行。在这种情况下,它在 __init__
完成后完成,这显然是在所有print
之后。因此,你会看到旧位置。
hide/show
强制进行更新。这就是为什么你得到正确的价值观。但是,这不是最好的方法,因为在hide/show
完成其工作时您可能会观察到闪烁。
更好的方法是告诉事件循环在继续之前处理事件。这将确保GUI更新:
#...
print(self.test_2.geometry().x())
print(self.test_2.geometry().y())
self.test_1.setFixedHeight(1000)
QtGui.QApplication.processEvents()
print(self.test_2.geometry().x())
print(self.test_2.geometry().y())
#...
PS :我在假设,你有充分的理由这样做。大多数情况下,GUI不会在何时更新。