QWidget Geometry()没有更新

时间:2014-06-04 16:43:40

标签: qt pyside qwidget

QWidget QVBoxLayoutQScrollArea setWidgetResizable(True) QWidgetQWidget对齐geometry()

当我调整其中一个geometry().x()时,geometry().y()会在图形用户界面中相应地重新定位自己,但他们的x()属性并未反映出来,{{ 1}}和y()在重定位之前和之后都保持不变。

到目前为止,我发现更新hide()show()坐标的唯一方法是QScrollAreaupdate() 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()

我的问题是:

  1. 有更好的解决方案吗?
  2. 不是hide()应该实际更新show()吗?
  3. 为什么会发生这种情况? (即为什么它以图形方式更新但不以编程方式更新?)
  4. 可以使用{{1}}和{{1}}在其他环境中连续导致一些问题(窗口闪烁或其他东西......)?

1 个答案:

答案 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不会在何时更新。