【发布时间】:2020-04-30 06:43:01
【问题描述】:
使用 Qt5 我正在尝试使用绝对定位使小部件工作。下面的代码是我正在尝试做的事情的最小工作示例。快速浏览代码:
-
CentralWidget是主窗口的中心小部件,使用绝对定位保存MyWidget,例如不使用任何布局。 -
MyWidget不会立即设置其子小部件,但提供了一个SetData方法,该方法首先删除所有当前子小部件,然后将新的子小部件添加到其布局中。 -
SetData使用主窗口中的计时器触发。
我注释掉了两行代码。第一个通过向CentralWidget 添加布局来“启用”使用布局的相对定位。这条线显示了我想要实现的目标,但使用绝对定位。第二条注释启用了一些调试信息:
MyWidget
layout.count: 3
size: PyQt5.QtCore.QSize(-1, -1)
sizeHint: PyQt5.QtCore.QSize(200, 100)
CentralWidget
size: PyQt5.QtCore.QSize(18, 18)
sizeHint: PyQt5.QtCore.QSize(18, 18)
为了让MyWidget 使用绝对定位可见,我做错了什么?
代码:
from PyQt5 import QtCore, QtWidgets
import sys
class MyWidget(QtWidgets.QWidget):
z = 0
def __init__(self, parent):
super().__init__(parent)
self._layout = QtWidgets.QVBoxLayout(self)
def SetData(self):
while self._layout.count() > 0:
widget = self._layout.takeAt(0).widget()
widget.hide()
widget.deleteLater()
for i in range(3):
self._layout.addWidget(QtWidgets.QLabel(str(MyWidget.z * 10 + i)))
MyWidget.z += 1
class CentralWidget(QtWidgets.QWidget):
def __init__(self, parent):
super().__init__(parent)
self._myWidget = MyWidget(self)
# QtWidgets.QHBoxLayout(self).addWidget(self._myWidget)
def SetData(self):
self._myWidget.SetData()
# print("MyWidget\n layout.count: {}\n size: {}\n sizeHint: {}\n\nCentralWidget\n size: {}\n sizeHint: {}\n\n".format(self._myWidget.layout().count(), self.sizeHint(), self.size(), self._myWidget.sizeHint(), self._myWidget.size()))
class MainWindow(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
centralWidget = CentralWidget(self)
self.setCentralWidget(centralWidget)
self._timer = QtCore.QTimer(self)
self._timer.timeout.connect(centralWidget.SetData)
self._timer.start(500)
def main():
app = QtWidgets.QApplication(sys.argv)
mainWindow = MainWindow()
mainWindow.show()
app.exec_()
if __name__ == "__main__":
main()
【问题讨论】:
-
尝试用
self._layout = QtWidgets.QVBoxLayout(parent)替换行self._layout = QtWidgets.QVBoxLayout(self) -
@S.Nick 您的建议确实显示了标签,但这不是我所追求的。您的建议将布局添加到
CentralWidget,因此不使用标签的绝对定位。 -
如果我没记错的话,如果你不使用布局,你应该在创建
self._myWidget.show()之后显式调用它。 -
@titusjan 不,调用
self._myWidget.show()不会将小部件绘制到窗口中:/。
标签: python pyqt5 position qt5 python-3.8