Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » GUI
  • » Просмотр и редактирование (новая запись) в базу данных с помощью QLineEdit and QComboBox [RSS Feed]

#1 Фев. 18, 2017 00:43:14

axinax
Зарегистрирован: 2017-01-06
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Просмотр и редактирование (новая запись) в базу данных с помощью QLineEdit and QComboBox

Как с помощью QtSql сделать как на картинке

на форуме нашел как вставляют ComboBox в TableView, но мне желательно отдельным виджетом.
Нужно ли создавать свой класс делегата на основе QItemDelegate?
И как правильно переписать эту строку:
QtCore.QObject.connect(self.tableView.selectionModel(), QtCore.SIGNAL('currentRowChanged(QtCore.QModelIndex(),QtCore.QModelIndex())'),self.mapper, QtCore.SLOT('setCurrentModelIndex(QtCore.QModelIndex()'))
Как я понял selectionModel посылает сигнал при изменении выделения в таблице в QDataWidgetMapper, которая должна изменить текущий индекс комбобокса.
В идеале мне вообще таблица не нужна. Просто несколько комбобоксов и текстедитов. В одном из комбобоксов выбирается существующая запись из базыданных. Если такой записи нет, то данные вводятся в виджеты и создается новая запись в БД. Что-то подобное я уже прикрутил без использования QtSql. Но хотелось бы попробовать через модель и QDataWidgetMapper

Офлайн

#2 Фев. 18, 2017 00:51:11

vic57
Зарегистрирован: 2015-07-07
Сообщения: 893
Репутация: +  126  -
Профиль   Отправить e-mail  

Просмотр и редактирование (новая запись) в базу данных с помощью QLineEdit and QComboBox

https://evileg.com/ru/post/71/
что-то похожее

Офлайн

#3 Фев. 18, 2017 01:14:07

axinax
Зарегистрирован: 2017-01-06
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Просмотр и редактирование (новая запись) в базу данных с помощью QLineEdit and QComboBox

Мне бы на питоне

Офлайн

#4 Фев. 18, 2017 01:58:30

axinax
Зарегистрирован: 2017-01-06
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Просмотр и редактирование (новая запись) в базу данных с помощью QLineEdit and QComboBox

Вот как-то так получилось:

 class FirstWindDialog(QtGui.QWidget, FORM_CLASS):
    def __init__(self):
        """Constructor."""
        QtGui.QTabWidget.__init__(self)
        self.setupUi(self)
        self.db=self.dbOpen()
        self.model=QtSql.QSqlTableModel()
        self.model.setTable("project")
        self.model.select()
        #self.tableView.setModel(self.model)
        self.comboBox.setModel(self.model)
        self.comboBox.setModelColumn(6)
        self.mapper=QtGui.QDataWidgetMapper()
        self.mapper.setModel(self.model)
        #self.mapper.setItemDelegate(QtGui.QItemDelegate(self.model))
        self.mapper.addMapping(self.comboBox,self.model.fieldIndex("conclus_num"))
        self.mapper.addMapping(self.lineEdit, self.model.fieldIndex("proj_comp"))
        self.mapper.toLast()
        self.comboBox.setCurrentIndex(self.mapper.currentIndex())
        #QtCore.QObject.connect(self.tableView.selectionModel(), QtCore.SIGNAL('currentRowChanged(QtCore.QModelIndex(),QtCore.QModelIndex())'),self.model, QtCore.SLOT('setCurrentModelIndex(QtCore.QModelIndex()'))
    def dbOpen(self):
        db = QtSql.QSqlDatabase.addDatabase("QSQLITE")
        db.setDatabaseName('/home/alex/Yandex.Disk/coding/expert/expert1.sqlite')
        db.open()
        return db
Осталось прикрутить сигнал смены индекса в комбобоксе к мэйпперу, ну с этим я справлюсь.

Офлайн

#5 Фев. 18, 2017 02:57:42

vic57
Зарегистрирован: 2015-07-07
Сообщения: 893
Репутация: +  126  -
Профиль   Отправить e-mail  

Просмотр и редактирование (новая запись) в базу данных с помощью QLineEdit and QComboBox

для баз данный Qt - это клиентский гуй и возможность SQL запросы делать, не более. лучше работай с SqlQuery, SqlQueryModel. SqlTableModel лично я не использую - имхо сделана на “от@@бись”. в питоне полно модулей для работы с БД - sqlite3, MySqlDb.
основы

Отредактировано vic57 (Фев. 18, 2017 03:04:15)

Офлайн

#6 Фев. 18, 2017 11:12:27

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2682
Репутация: +  182  -
Профиль   Отправить e-mail  

Просмотр и редактирование (новая запись) в базу данных с помощью QLineEdit and QComboBox

> Как с помощью QtSql сделать как на картинке

QtSql тебе нафиг не нужен.

> Нужно ли создавать свой класс делегата на основе QItemDelegate?

Да.

> В идеале мне вообще таблица не нужна. Просто несколько комбобоксов и текстедитов.

ИХМО тебе как раз details не нужен. Всё редактируется в таблице.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#7 Фев. 18, 2017 17:37:17

axinax
Зарегистрирован: 2017-01-06
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Просмотр и редактирование (новая запись) в базу данных с помощью QLineEdit and QComboBox

Rodegast
ИХМО тебе как раз details не нужен. Всё редактируется в таблице.
Мне база данных нужна для того чтобы … Да в принципе она мне сильно то и не нужна. Только для того чтобы сохранять какие-либо данные для отчета. В принципе можно было использовать csv или xml. Чтобы не сохранять в переменных данные с разных форм, пока они не понадабятся. Поэтому TableView и не нужен (не удобно - столбцов может быть много все данные не будут видны. Еще БД нужна для выполнения пространственных запросов в автоматическом (через тригеры) и ручном режиме.
Я уже сделал конект с базой на основе sqlite3, точнее pyspatilite, но на одной из веток кто-то из уважаемых форумчан высказал мысль, что если используешь Qt то и с БД надо общаться через Qt. Поэтому и решил попробовать.
В принципе способ взаимодействия и представления через Model и Mapper мне понравился. Тот фрагмент кода, что я привел, заполняет комбобокс данными из одного столбца, в lineEdit записывается данные из последней строи из одного из столбцов, в комбобокс currentIndex тоже соответствует последней записи. Вполне возможно что этот способ прожорлив
Rodegast
> Нужно ли создавать свой класс делегата на основе QItemDelegate?

Да.
Пока для того что я сделал - не нужно. Наверно, для вставки новой записи средствами Модели он и понадобится
Кстати, нет не надо делегата для редактирования (вставки новой) записи в БД

Отредактировано axinax (Фев. 18, 2017 20:16:03)

Офлайн

#8 Фев. 20, 2017 09:48:16

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2682
Репутация: +  182  -
Профиль   Отправить e-mail  

Просмотр и редактирование (новая запись) в базу данных с помощью QLineEdit and QComboBox

> Мне база данных нужна для того чтобы …

Вот с этого и стоило начинать. Делигат нужен для отрисовки / редактирования ячеек таблицы. Если таблицы нет, то и делигат не нужен.

> на одной из веток кто-то из уважаемых форумчан высказал мысль, что если используешь Qt то и с БД надо общаться через Qt.

Мало ли кто что пишет. Если у тебя есть готовое решение на python-е, то переделывать его не надо.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#9 Фев. 21, 2017 06:28:23

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Просмотр и редактирование (новая запись) в базу данных с помощью QLineEdit and QComboBox

axinax
В принципе можно было использовать csv или xml.
Родной для питона формат pickle. Если надо чтобы файлы глазками читались то я бы рекомендовал yaml, json, cfg поскольку у вас форм много и обычным csv тут не обойтись. xml Содержит много рюшечек, которые вам не нужны, а при чтении и записи приводят к постоянной головной боли



Отредактировано doza_and (Фев. 21, 2017 06:29:06)

Офлайн

  • Начало
  • » GUI
  • » Просмотр и редактирование (новая запись) в базу данных с помощью QLineEdit and QComboBox[RSS Feed]

Board footer

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

Powered by DjangoBB

Lo-Fi Version