Russian Qt Forum
Ноябрь 25, 2024, 10:41 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: PyQT4 Как создать форму с контролами для редакт-я данных из полей строки БД.  (Прочитано 11097 раз)
Пытон
Гость
« Ответ #15 : Январь 14, 2013, 18:53 »

Эх, и как же я, болезный, состыкую-то обе модели в тандем...
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #16 : Январь 14, 2013, 19:07 »

Эх, и как же я, болезный, состыкую-то обе модели в тандем...
А в чем проблема?
Данные для комбобокса, будут браться из таблицы second (их будет 4), а текущий индекс будет браться из соответствующего поля таблицы thirst.
Пример Qt делает ровно тоже. Просто модель для second достается с помощью метода:
QSqlTableModel * QSqlRelationalTableModel::relationModel ( int column ) const [virtual]
Записан
Пытон
Гость
« Ответ #17 : Январь 14, 2013, 19:26 »

Моя не понимайт синтаксис С.  Обеспокоенный
Записан
Пытон
Гость
« Ответ #18 : Январь 15, 2013, 06:50 »

Код
Python
from PyQt4 import QtGui, QtCore, QtSql
import os.path
 
class mainform(QtGui.QWidget):
   def __init__(self):
       QtGui.QWidget.__init__(self)
       self.resize(600, 700)
       self.con = QtSql.QSqlDatabase.addDatabase("QSQLITE", "Base")
       self.con.setDatabaseName("./SQLiteBase/PyQt4DB.s3db")
 
       self.OpenOrCreateDB()
 
       self.mainLayout = QtGui.QVBoxLayout()
       self.setLayout(self.mainLayout)
 
       self.btnFill = QtGui.QPushButton("Заполнить БД некоторыми данными")
       self.mainLayout.addWidget(self.btnFill)
       self.btnFill.clicked.connect(self.Fill_View_With_Some_Values)
 
       #реляционная модель данных
       self.model = QtSql.QSqlRelationalTableModel(None, self.con) #создание
       self.model.setTable('thirst') #выбор таблицы для модели
       self.typeindex = self.model.fieldIndex("type") #объект содержит индекс столбца по его имени
       self.model.setRelation(self.typeindex, QtSql.QSqlRelation("second", "type", "text")) #указание связи
       self.model.select() #заполнение модели данными из БД
       # столбец 2(type) будет заполнен соответствующими значениями поля text из таблицы second
 
       #создание виджета таблицы (вида, отображения)
       self.view1 = QtGui.QTableView() # сам вид
       self.mainLayout.addWidget(self.view1) # добавляем его к контейнеру
       self.view1.setModel(self.model) # указываем какую модель использовать таблице
       self.view1.setItemDelegate(QtSql.QSqlRelationalDelegate(self.view1)) # создаём делегат
 
       #эта таблица служит лишь для того, чтобы показать, что разные таблицы могут использовать одну модель
       self.view2 = QtGui.QTableView()
       self.mainLayout.addWidget(self.view2)
       self.view2.setModel(self.model)
 
       #текстбокс для ввода товара
       self.txtBoxTovar = QtGui.QLineEdit()
       self.mainLayout.addWidget(self.txtBoxTovar)
 
       #Комбобокс для ввода типа товара
       self.comboBoxType = QtGui.QComboBox()      
       self.mainLayout.addWidget(self.comboBoxType)
 
       #кнопка для добавления строки в БД
       self.btnNew = QtGui.QPushButton("Новая запись")
       self.mainLayout.addWidget(self.btnNew)
 
 
       # создаём модель для комбобокса
       self.relModel = self.model.relationModel(self.typeindex) # модель для маппера
       self.comboBoxType.setModel(self.relModel)
       self.comboBoxType.setModelColumn(self.relModel.fieldIndex("text"))
       # создаём маппер (Он нужен для связывания полей таблицы БД и контролов)
       self.mapper = QtGui.QDataWidgetMapper() # сам маппер
       self.mapper.setModel(self.relModel)
       self.mapper.setItemDelegate(QtSql.QSqlRelationalDelegate(self)) #взял из примера, не понимаю на кой оно надо!
       self.mapper.addMapping(self.comboBoxType, self.typeindex)
 
 
       #self.mapper.addMapping(self.txtBoxTovar, 1)
 
 
 
       self.mapper.toFirst()      
 
 
   def Fill_View_With_Some_Values(self):
       query = QtSql.QSqlQuery(self.con)
       query.exec("INSERT INTO thirst (tovar, type) VALUES ('Potato', 1)")
       query.exec("INSERT INTO thirst (tovar, type) VALUES ('Apple', 2)")
       query.exec("INSERT INTO thirst (tovar, type) VALUES ('Juice', 3)")
       query.exec("INSERT INTO thirst (tovar, type) VALUES ('Nuts', 4)")
       self.model.select()
 
 
 
   def OpenOrCreateDB(self):
 
 
       ThisIsNewBase = False
       if not os.path.exists("./SQLiteBase/PyQt4DB.s3db"): ThisIsNewBase = True
 
 
       if not self.con.open():
           print ("БД не открылась!")
       else:
           print ("БД открыта")
           if ThisIsNewBase == True: self.Create_Structure_of_DB()
 
 
   def Create_Structure_of_DB(self):
       query = QtSql.QSqlQuery(self.con)
       query.exec("CREATE TABLE thirst ("
                  "id INTEGER PRIMARY KEY AUTOINCREMENT, "
                  "tovar VARCHAR(20) NOT NULL, "
                  "type INTEGER NOT NULL"
                  ")")
       query.exec("CREATE TABLE second ("
                  "type INTEGER, "
                  "text VARCHAR(50)"
                  ")")
       query.exec("INSERT INTO second VALUES(1, 'Бяка')")
       query.exec("INSERT INTO second VALUES(2, 'Кака')")
       query.exec("INSERT INTO second VALUES(3, 'Добро')")
       query.exec("INSERT INTO second VALUES(4, 'Благо')")
 
if __name__=="__main__":
   import sys
   app = QtGui.QApplication(sys.argv)
   form1 = mainform()
   form1.setWindowTitle("Работа с БД при помощи PyQt4")
   form1.show()
   sys.exit(app.exec_())

Переписал код. Теперь комбобокс правильно показывает мне только четыре значения из таблицы second, вот только отныне он живёт сам по себе и никак не согласовывается с таблицей thirst! Он просто показывает список из таблицы second.
Записан
Пытон
Гость
« Ответ #19 : Январь 15, 2013, 12:10 »

Маппер должен использовать model, а для комбобокса нужно создать свою модель:
self.relModel = self.model.relationModel(self.typeindex)
self.comboBoxType.setModel(self.relModel)
Записан
Nimbus
Гость
« Ответ #20 : Январь 20, 2013, 10:43 »

Пытон, привет собрат-питоновод. Я столкнулся с такой же проблемой. Поэтому приходится писать на PyQt4 своё собственное решение, чем сейчас и занимаюсь. Только я использую SQLAlchemy в качестве ORM. А также, взял подход обычной админки Django. Описываю модели в отдельном файлике в виде разных классов и накручиваю на них админские классы без реализации всякой бизнес-логики, лишь со списками какие поля и куда, связываю модели с этими классами, а дальше само разруливается (строятся формы списков и формы редактирования отдельных моделей) путём получения метаинформации из моделей. Соответственно нет никаких сырых SQL-запросов и вообще привязки к конкретной СУБД.
Могу потом как-нибудь поделиться с битбакета, если вынесу в отдельный пакет всё :-)
« Последнее редактирование: Январь 20, 2013, 10:49 от JC » Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.077 секунд. Запросов: 22.