Используя 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(self)
наself._layout = QtWidgets.QVBoxLayout(parent)
- person S. Nick   schedule 30.04.2020CentralWidget
и, как следствие, не использует абсолютное позиционирование для меток. - person Woltan   schedule 30.04.2020self._myWidget.show()
после его создания, если вы не используете макеты. - person titusjan   schedule 30.04.2020self._myWidget.show()
не отображает виджет в окне :/. - person Woltan   schedule 30.04.2020