Как разместить динамически создаваемые виджеты на QMainWindow?
Как можно программно создавать разные виджеты и добавлять их в макет?
То есть таких различных виджетов может быть много и они скроллятся на форме в рамках окна. Но нужно управлять границами каждого виджета. Или, например, скрывать по нажатию кнопки из виджета.
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.scroll = QScrollArea()
self.widget = QWidget()
self.vbox = QVBoxLayout()
"""
Здесь необходимо генерировать различные виджеты (с абсолютным позиционированием элементов внутри) и добавлять их в макет
"""
#self.vbox.addWidget()
self.widget.setLayout(self.vbox)
self.scroll.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
self.scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.scroll.setWidgetResizable(True)
self.scroll.setWidget(self.widget)
self.setCentralWidget(self.scroll)
self.setGeometry(600, 100, 1000, 900)
self.setWindowTitle('MainWindow')
self.show()
return
def main():
app = QtWidgets.QApplication(sys.argv)
main = MainWindow()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
Об абсолютным позиционированием вам лучше знать только то, что оно есть и все.
Более практично управлять виджетами через Layout-ы
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.widget = QWidget()
self.vbox = QVBoxLayout(self.widget)
"""
Здесь необходимо генерировать различные виджеты
(с абсолютным позиционированием элементов внутри) и добавлять их в макет
"""
#self.vbox.addWidget()
for i in range(20):
w = QWidget()
hbox = QHBoxLayout(w)
label = QLabel(f'Label {i}')
lineEdit = QLineEdit(f'LineEdit {i}')
button = QPushButton(f'Button {i}')
button.clicked.connect(lambda ch, lb=label, le=lineEdit: self.onClick(lb, le))
hbox.addWidget(label)
hbox.addWidget(lineEdit)
hbox.addWidget(button)
self.vbox.addWidget(w)
self.scroll = QScrollArea()
self.scroll.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
self.scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.scroll.setWidgetResizable(True)
self.scroll.setWidget(self.widget)
self.setCentralWidget(self.scroll)
def onClick(self, lb, le):
#print(lb.text(), le.text())
lb.setText(le.text())
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
main = MainWindow()
main.setWindowTitle('Title MainWindow')
main.resize(700, 400)
main.show()
sys.exit(app.exec_())
