Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » GUI
  • » Динамическое добавление в scrollArea comboBox [RSS Feed]

#1 Фев. 8, 2012 21:18:56

5koleso
От:
Зарегистрирован: 2012-01-20
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Динамическое добавление в scrollArea comboBox

Друзья, подскажите пожалуйста как решить проблему.
Создал в Qt4 Designer форму и нужно на неё добавить заранее неизвестное
кол-во comboBox с полями lineEdit. Пытался разными способами помещать сиё
посредством кнопки в scrollArea, но ScrollBar не появляется, а виджеты,
по мере добавления становятся мельче, пока вообще не исчезают.

# -*- coding: utf-8 -*-

from PyQt4 import QtCore, QtGui

try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
_fromUtf8 = lambda s: s

class Ui_Dialog(object):
def setupUi(self, Dialog):
Dialog.setObjectName(_fromUtf8("Dialog"))
Dialog.resize(593, 592)
Dialog.setWindowTitle(QtGui.QApplication.translate("Dialog", "Dialog", None, QtGui.QApplication.UnicodeUTF8))

self.centralwidget = QtGui.QWidget(Dialog)
self.centralwidget.setGeometry(QtCore.QRect(30, 50, 501, 481))
self.centralwidget.setObjectName(_fromUtf8("centralwidget"))

self.verticalLayoutWidget = QtGui.QWidget(self.centralwidget)
self.verticalLayoutWidget.setGeometry(QtCore.QRect(20, 20, 451, 421))
self.verticalLayoutWidget.setObjectName(_fromUtf8("verticalLayoutWidget"))

self.mainLayout = QtGui.QVBoxLayout(self.verticalLayoutWidget)
self.mainLayout.setMargin(0)
self.mainLayout.setObjectName(_fromUtf8("mainLayout"))
self.addButton = QtGui.QPushButton(self.verticalLayoutWidget)
self.addButton.setText(QtGui.QApplication.translate("Dialog", u"Добавить вагон", None, QtGui.QApplication.UnicodeUTF8))
self.addButton.setObjectName(_fromUtf8("addButton"))
self.mainLayout.addWidget(self.addButton)

self.addButton.clicked.connect(self.addWidget)

self.scrollArea = QtGui.QScrollArea(self.verticalLayoutWidget)
self.scrollArea.setWidgetResizable(True)
self.scrollArea.setObjectName(_fromUtf8("scrollArea"))
self.scrollWidget = QtGui.QWidget()
self.scrollWidget.setGeometry(QtCore.QRect(0, 0, 447, 384))
self.scrollWidget.setObjectName(_fromUtf8("scrollWidget"))
self.formLayoutWidget = QtGui.QWidget(self.scrollWidget)
self.formLayoutWidget.setGeometry(QtCore.QRect(20, 10, 401, 351))
self.formLayoutWidget.setObjectName(_fromUtf8("formLayoutWidget"))
self.scrollLayout = QtGui.QFormLayout(self.formLayoutWidget)
self.scrollLayout.setMargin(0)
self.scrollLayout.setObjectName(_fromUtf8("scrollLayout"))
self.scrollArea.setWidget(self.scrollWidget)
self.mainLayout.addWidget(self.scrollArea)

self.retranslateUi(Dialog)
QtCore.QMetaObject.connectSlotsByName(Dialog)

def retranslateUi(self, Dialog):
pass

def addWidget(self):
self.scrollLayout.addRow(Test())

class Test(QtGui.QWidget):
def __init__( self, parent=None):
super(Test, self).__init__(parent)

self.horizontalLayoutWidget = QtGui.QWidget()#Form)
self.horizontalLayoutWidget.setGeometry(QtCore.QRect(20, 60, 451, 71))
self.horizontalLayoutWidget.setObjectName(_fromUtf8("horizontalLayoutWidget"))
self.horizontalLayout = QtGui.QHBoxLayout(self.horizontalLayoutWidget)
self.horizontalLayout.setMargin(0)
self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
self.lineEdit_2 = QtGui.QLineEdit(self.horizontalLayoutWidget)
self.lineEdit_2.setObjectName(_fromUtf8("lineEdit_2"))
self.lineEdit_2.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
self.horizontalLayout.addWidget(self.lineEdit_2)
spacerItem = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Minimum)
self.horizontalLayout.addItem(spacerItem)
self.comboBox = QtGui.QComboBox(self.horizontalLayoutWidget)
self.comboBox.setMinimumSize(QtCore.QSize(200, 0))
self.comboBox.setObjectName(_fromUtf8("comboBox"))

self.comboBox.addItem(_fromUtf8(""))
self.comboBox.setItemText(0, QtGui.QApplication.translate("MainWindow", "Крытый вагон", None, QtGui.QApplication.UnicodeUTF8))
self.comboBox.addItem(_fromUtf8(""))
self.comboBox.setItemText(1, QtGui.QApplication.translate("MainWindow", "Платформа", None, QtGui.QApplication.UnicodeUTF8))

self.horizontalLayout.addWidget(self.comboBox)
spacerItem1 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Minimum)
self.horizontalLayout.addItem(spacerItem1)
self.lineEdit = QtGui.QLineEdit(self.horizontalLayoutWidget)
self.lineEdit.setObjectName(_fromUtf8("lineEdit"))
self.lineEdit.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
self.horizontalLayout.addWidget(self.lineEdit)

self.setLayout(self.horizontalLayout)


if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
Dialog = QtGui.QDialog()
ui = Ui_Dialog()
ui.setupUi(Dialog)
Dialog.show()
sys.exit(app.exec_())
Если не затруднит, внесите поправку в приведённый пример, потому как
сам справится с вышеописанной проблемой не смог.
И самое главное, как потом считать информацию из данных виджетов, если их имена не известны (т.е. если добавил в scrollArea 40 шт. comboBox с полями lineEdit, как прочитать, допустим из 35-го?)
Спасибо.



Офлайн

#2 Фев. 9, 2012 04:04:33

dartNNN
От:
Зарегистрирован: 2009-12-08
Сообщения: 199
Репутация: +  0  -
Профиль   Отправить e-mail  

Динамическое добавление в scrollArea comboBox

Так вы же создаете QDialog, а он не меняет размеров. Используйте QWidget, он будет расширяться. Плюс к этому можно посмотреть на QSizePolicy - для большего контроля над поведением QWidget (если будете удалять виджеты с окна, то оно с политикой по умолчанию не уменьшится).
Созданные виджеты лучше хранить вручную в массиве, т.е. добавляете виджет в окно и в массив и из массива к нему обращаетесь.



Офлайн

#3 Фев. 9, 2012 12:59:04

5koleso
От:
Зарегистрирован: 2012-01-20
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Динамическое добавление в scrollArea comboBox

Спасибо за помощь!
Для тех, кто так же как и я, будет искать решение данной проблемы…
Получилось следующим образом:

self.scrollLayout.setObjectName(_fromUtf8("scrollLayout"))
self.scrollWidget.setLayout(self.scrollLayout) # !!! ТУТ ДОБАВИТЬ ИНСТРУКЦИЮ
self.scrollArea.setWidget(self.scrollWidget)
“Созданные виджеты лучше хранить вручную в массиве” Вы это имели ввиду:
 def addWidget(self):
print "*** Items ***"
for obj in self.scrollWidget.children():
if isinstance(obj, Test):
print "%s | %s | %s" % (obj.lineEdit.text(),
obj.comboBox.currentText(),
obj.lineEdit_2.text())
self.scrollLayout.addWidget(Test())
Как Вы думаете, это приемлемое решение?



Офлайн

  • Начало
  • » GUI
  • » Динамическое добавление в scrollArea comboBox[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version