【发布时间】:2014-06-04 16:43:39
【问题描述】:
我将QWidgets 排在QVBoxLayout 内的QScrollArea 和setWidgetResizable(True) 中
当我调整QWidgets 之一的大小时,QWidgets 在图形用户界面中相应地重新定位,但它们的geometry() 属性并没有反映这一点,geometry().x() 和geometry().y() 仍然是搬家前后一样。
到目前为止,我发现更新x() 和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()在其他上下文中导致一些问题(窗口闪烁或其他...)?
【问题讨论】:
-
本例中QScrollArea是如何添加到VLayout中的?
-
其实布局是针对一个QWidget,它是QScrollArea的内部小部件。 QScrollArea 不是任何布局的一部分。