Форум сайта python.su
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_())
Офлайн
Судя по всему, кьют первый столбец считает первичным ключом.
Офлайн