с использованием PyQt, я пытаюсь создать интерфейс, для которого я могу добавить или удалить виджет динамически. Я хочу определить отдельный класс для виджета, который будет добавлен или удален. Кажется, я не могу получить виджет, который я создаю для отображения внутри основного интерфейса. Вот код, я использую:динамическое добавление и удаление виджетов в PyQt
from PyQt4 import QtGui, QtCore
import sys
class Main(QtGui.QMainWindow):
def __init__(self, parent = None):
super(Main, self).__init__(parent)
# central widget
self.centralWidget = QtGui.QWidget(self)
# main layout
self.vLayout = QtGui.QVBoxLayout(self.centralWidget)
# main button
self.pButton_add = QtGui.QPushButton(self.centralWidget)
self.pButton_add.setText('button to add other widgets')
# scroll area
self.scrollArea = QtGui.QScrollArea(self.centralWidget)
self.scrollArea.setWidgetResizable(True)
# scroll area widget contents
self.scrollAreaWidgetContents = QtGui.QWidget(self.scrollArea)
# scroll area widget contents - layout
self.formLayout = QtGui.QFormLayout(self.scrollAreaWidgetContents)
self.scrollArea.setWidget(self.scrollAreaWidgetContents)
# add all main to the main vLayout
self.vLayout.addWidget(self.pButton_add)
self.vLayout.addWidget(self.scrollArea)
# set central widget
self.setCentralWidget(self.centralWidget)
# connections
self.pButton_add.clicked.connect(self.addWidget)
def addWidget(self):
z = Test(self.scrollAreaWidgetContents)
count = self.formLayout.rowCount()
self.formLayout.setWidget(count, QtGui.QFormLayout.LabelRole, z)
class Test(QtGui.QWidget):
def __init__(self, parent):
super(Test, self).__init__(parent)
self.pushButton = QtGui.QPushButton(self)
app = QtGui.QApplication(sys.argv)
myWidget = Main()
myWidget.show()
app.exec_()
вещь, когда я использую следующий код внутри моего метода «addWidget», это точно делает то, что я хочу, чтобы это сделать, но метод класса не похоже, работают.
z = QtGui.QPushButton(self.scrollAreaWidgetContents)
count = self.formLayout.rowCount())
self.formLayout.setWidget(count, QtGui.QFormLayout.LabelRole, z)
Интересно, почему z = Test() не дает никаких результатов? Есть идеи? Благодаря!
Спасибо за подробный ответ! Причина, по которой я использовал макет формы, заключалась в том, что я хотел, чтобы виджеты начали появляться в верхней части области прокрутки и заполняли пустые места оттуда, вместо того, чтобы появляться в середине и перестраиваться, когда создаются новые виджеты. Хотя я уверен, что есть другие способы сделать это, formlayout показалось мне простым решением. Еще раз спасибо! – boundless
@ Безграничный: Ах, я вижу. Мой подход к этому будет обернуть 'scrollLayout' в другой' QVBoxLayout' с добавлением строки «1» ниже. Это должно держать вещи наверху. – Avaris
еще одна вещь, которая мне нравится formlayout для, это упрощает иметь два виджета рядом друг с другом, а также держать вещи наверху. Хотя, возможно, в этот момент я должен просто использовать сетку. Еще раз спасибо за подсказку! – boundless