Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Базы данных
  • » PyQt4. QSqlTableModel + QSqlTableView. Меняешь данные в одной ячейке, меняются в нескольких. Почему??? [RSS Feed]

#1 Май 22, 2018 14:41:17

Pluto
Зарегистрирован: 2012-05-29
Сообщения: 177
Репутация: +  1  -
Профиль   Отправить e-mail  

PyQt4. QSqlTableModel + QSqlTableView. Меняешь данные в одной ячейке, меняются в нескольких. Почему???

 from PyQt4 import QtGui, QtSql, QtCore
import sys
class window(QtGui.QWidget):
    def __init__(self, parent = None):
        QtGui.QWidget.__init__(self)
        self.setWindowTitle("работа с БД")
        self.resize(500,600)
        # Создаём подключение к БД
        self.con = QtSql.QSqlDatabase.addDatabase("QSQLITE")
        self.con.setDatabaseName("base.sqlite")
        self.con.open()
        self.createTable()
        self.view1 = QtGui.QTableView()
        self.model1 = QtSql.QSqlTableModel(None, self.con)
        self.view1.setModel(self.model1)
        # создаём обработчик для сигнала смены строки (индекса строки)
        # Нужно для того, чтобы сделать согласованное изменение отображаемых данных в маппере
        self.view1.selectionModel().currentRowChanged.connect(self.row_changed)
        self.btn_fill = QtGui.QPushButton("Дополнить данными")
        self.btn_fill.clicked.connect(self.fillTable)
        self.model1.setTable("one")
        self.model1.select()
        self.layout_main = QtGui.QVBoxLayout()
        self.setLayout(self.layout_main)
        self.layout_main.addWidget(self.view1)
        self.layout_main_horiz1 = QtGui.QHBoxLayout()
        self.layout_main.addLayout(self.layout_main_horiz1)
        self.layout_main_horiz1.addWidget(self.btn_fill)
        # Контролы для редактирования данных
        self.le_id = QtGui.QLineEdit()
        self.layout_main.addWidget(self.le_id)
        self.le_name = QtGui.QLineEdit()
        self.layout_main.addWidget(self.le_name)
        self.spin = QtGui.QSpinBox()
        self.layout_main.addWidget(self.spin)
        self.date_edit = QtGui.QDateEdit()
        self.layout_main.addWidget(self.date_edit)
        # Маппер. 
        self.mapper = QtGui.QDataWidgetMapper()
        self.mapper.setModel(self.model1)
        self.mapper.addMapping(self.le_id, 0)
        self.mapper.addMapping(self.le_name, 1)
        self.mapper.addMapping(self.spin, 2)
        self.mapper.addMapping(self.date_edit, 3)
    # Здесь происходит смена индекса модели для маппера. Меняется выбранная строка в таблице, меняются и данные в контролах
    def row_changed(self):
        self.mapper.setCurrentModelIndex(self.view1.selectionModel().currentIndex())
        
        
    def createTable(self):
        query = QtSql.QSqlQuery(self.con)
        
        if not query.exec("CREATE TABLE IF NOT EXISTS one (idd TEXT, name TEXT, nomer INTEGER, dr DATE)"):
            print (self.query.lastError().text())
    def fillTable(self):
        data = [['1-1', "Василий", 1, '1965-02-17'],
                ['1-2', "Иннокентий", 1, '1968-03-15'],
                ['1-3', "Феофан", 1, '1989-07-11'],
                ['1-4', "Борис", 1, '1999-11-10']]
        query = QtSql.QSqlQuery(self.con)
        query.prepare('INSERT INTO one (idd, name, nomer, dr) VALUES (?, ?, ?, ?)')
        self.con.transaction()
        for block in data:
            for value in block:
                query.addBindValue(value)
            #print (query.executedQuery(), query.boundValues())
            query.exec_()
            if query.lastError(): print(query.lastError().text())
        self.con.commit()
        self.model1.select() 
        
    def closeEvent(self, event):
        self.con.close()
        
if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    window1 = window()
    window1.show()
    sys.exit(app.exec_())

После старта программы. Дважды ткните кнопку “Дополнить данными”.
Получится таблица из пары одинаковых наборов строк.

Теперь, если изменить в какой-нибудь ячейке, к примеру, любое имя на другое, то во втором наборе такое имя тоже изменится на новое!
Это с каких щей-то? Почему? Как это исправить?

Офлайн

#2 Май 22, 2018 23:00:59

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

PyQt4. QSqlTableModel + QSqlTableView. Меняешь данные в одной ячейке, меняются в нескольких. Почему???

Судя по всему, кьют первый столбец считает первичным ключом.

Офлайн

  • Начало
  • » Базы данных
  • » PyQt4. QSqlTableModel + QSqlTableView. Меняешь данные в одной ячейке, меняются в нескольких. Почему???[RSS Feed]

Board footer

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

Powered by DjangoBB

Lo-Fi Version