Найти - Пользователи
Полная версия: Просмотр и редактирование (новая запись) в базу данных с помощью QLineEdit and QComboBox
Начало » GUI » Просмотр и редактирование (новая запись) в базу данных с помощью QLineEdit and QComboBox
1
axinax
Как с помощью 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
vic57
https://evileg.com/ru/post/71/
что-то похожее
axinax
Мне бы на питоне
axinax
Вот как-то так получилось:
 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
Осталось прикрутить сигнал смены индекса в комбобоксе к мэйпперу, ну с этим я справлюсь.
vic57
для баз данный Qt - это клиентский гуй и возможность SQL запросы делать, не более. лучше работай с SqlQuery, SqlQueryModel. SqlTableModel лично я не использую - имхо сделана на “от@@бись”. в питоне полно модулей для работы с БД - sqlite3, MySqlDb.
основы
Rodegast
> Как с помощью QtSql сделать как на картинке

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

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

Да.

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

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

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

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

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

Мало ли кто что пишет. Если у тебя есть готовое решение на python-е, то переделывать его не надо.
doza_and
axinax
В принципе можно было использовать csv или xml.
Родной для питона формат pickle. Если надо чтобы файлы глазками читались то я бы рекомендовал yaml, json, cfg поскольку у вас форм много и обычным csv тут не обойтись. xml Содержит много рюшечек, которые вам не нужны, а при чтении и записи приводят к постоянной головной боли
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB