Не обновляются данные в двух связанных QTableView, модели которых реализованы через QsqlRelationalTableModel
Проблема в обновлении таблицы "сотрудники", а именно столбца "организации", связанного с таблицей "организации". нашел примерное решение, однако не могу адаптировать это на питоновский лад, слаб в с++
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtSql import *
from PyQt5.QtCore import *
import sys, sqlite3
conn = sqlite3.connect('db')
cursor = conn.cursor()
class CreateTable():
def createTableStaff(self):
try:
cursor.execute("""
CREATE TABLE staff (
staff_id INTEGER PRIMARY KEY AUTOINCREMENT,
staff_name TEXT,
staff_surname TEXT,
staff_age INTEGER,
staff_pos TEXT,
staff_org INTEGER,
FOREIGN KEY (staff_org) REFERENCES org (org_id)
)
""")
except Exception as ex:
print(ex)
def createTableOrg(self):
try:
cursor.execute("""
CREATE TABLE org (
org_id INTEGER PRIMARY KEY AUTOINCREMENT,
org_name TEXT,
org_addr TEXT,
org_phone TEXT
)
""")
except Exception as ex:
print(ex)
table = CreateTable()
#table.createTableStaff()
#table.createTableOrg()
class Organization(QWidget):
def __init__(self, parent=None):
QWidget.__init__(self, parent)
self.btn_add_record = QPushButton('Добавить запись')
self.btn_del_record = QPushButton('Удалить запись')
self.srtm_org = QSqlRelationalTableModel()
self.srtm_org.setTable('org')
self.srtm_org.setHeaderData(1, Qt.Horizontal, 'Наименование')
self.srtm_org.setHeaderData(2, Qt.Horizontal, 'Адрес')
self.srtm_org.setHeaderData(3, Qt.Horizontal, 'Контакты')
self.table_org = QTableView()
self.table_org.setModel(self.srtm_org)
self.table_org.hideColumn(0)
self.table_org.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
self.srtm_org.select()
hbox_btn = QHBoxLayout()
hbox_btn.addWidget(self.btn_add_record)
hbox_btn.addWidget(self.btn_del_record)
vbox_main = QVBoxLayout()
vbox_main.addLayout(hbox_btn)
vbox_main.addWidget(self.table_org)
self.setLayout(vbox_main)
#Signals
self.btn_add_record.clicked.connect(self.on_add_record)
self.btn_del_record.clicked.connect(self.on_del_record)
self.srtm_org.dataChanged.connect(self.on_data_change)
def on_add_record(self):
self.srtm_org.insertRow(0)
pass
def on_del_record(self):
self.srtm_org.removeRow(self.table_org.currentIndex().row())
self.srtm_org.select()
def on_data_change(self):
self.srtm_org.submitAll()
self.table_org.update()
class Staff(QWidget):
def __init__(self, parent=None):
QWidget.__init__(self, parent)
self.btn_add_record = QPushButton('Добавить запись')
self.btn_del_record = QPushButton('Удалить запись')
self.srtm_staff = QSqlRelationalTableModel()
self.srtm_staff.setTable('staff')
self.srtm_staff.setHeaderData(1,Qt.Horizontal, 'Имя')
self.srtm_staff.setHeaderData(2,Qt.Horizontal, 'Фамилия')
self.srtm_staff.setHeaderData(3,Qt.Horizontal, 'Возраст')
self.srtm_staff.setHeaderData(4, Qt.Horizontal, 'Должность')
self.srtm_staff.setHeaderData(5, Qt.Horizontal, 'Организация')
self.srtm_staff.setRelation(5, QSqlRelation('org', 'org_id', 'org_name'))
self.srtm_staff.setJoinMode(QSqlRelationalTableModel.LeftJoin)
self.table_staff = QTableView()
self.table_staff.setModel(self.srtm_staff)
self.table_staff.hideColumn(0)
self.table_staff.setItemDelegateForColumn(5, QSqlRelationalDelegate(self.table_staff))
self.table_staff.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
self.srtm_staff.select()
hbox_btn = QHBoxLayout()
hbox_btn.addWidget(self.btn_add_record)
hbox_btn.addWidget(self.btn_del_record)
vbox_main = QVBoxLayout()
vbox_main.addLayout(hbox_btn)
vbox_main.addWidget(self.table_staff)
self.setLayout(vbox_main)
#Signals
self.btn_add_record.clicked.connect(self.on_add_record)
self.btn_del_record.clicked.connect(self.on_del_record)
self.srtm_staff.dataChanged.connect(self.on_data_change)
def on_add_record(self):
self.srtm_staff.insertRow(0)
pass
def on_del_record(self):
self.srtm_staff.removeRow(self.table_staff.currentIndex().row())
self.srtm_staff.select()
def on_data_change(self):
self.srtm_staff.submitAll()
self.table_staff.update()
class Org_and_Staff(QWidget):
def __init__(self, parent=None):
QWidget.__init__(self,parent)
lbl_staff =QLabel('Сотрудники')
lbl_staff.setAlignment(Qt.AlignCenter)
lbl_staff.setFont(QFont('Monospace',15))
lbl_org = QLabel('Организации')
lbl_org.setAlignment(Qt.AlignCenter)
lbl_org.setFont(QFont('Monospace', 15))
staff = Staff()
organization = Organization()
vbox_main = QVBoxLayout()
vbox_main.addWidget(lbl_org)
vbox_main.addWidget(organization)
vbox_main.addWidget(lbl_staff)
vbox_main.addWidget(staff)
self.setLayout(vbox_main)
if __name__ == "__main__":
app = QApplication(sys.argv)
app.setStyle('Fusion')
database = QSqlDatabase.addDatabase('QSQLITE')
database.setDatabaseName('db')
database.open()
tables = Org_and_Staff()
tables.resize(1000, 800)
tables.show()
sys.exit(app.exec_())
Ответы (1 шт):
Автор решения: Никита Солоницын
→ Ссылка
Чуть разобравшись, смог переделать
class UpdateRelModel():
def __init__(self, srtModel):
self.relColumnIndices = []
self.srtModel = srtModel
def setRelation(self, column, relation):
self.relColumnIndices.append(column)
self.srtModel.setRelation(column, relation)
def updateRelations(self):
for column in self.relColumnIndices:
self.srtModel.relationModel(column).select()
class Staff(QWidget):
def __init__(self, parent=None):
QWidget.__init__(self, parent)
self.btn_add_record = QPushButton('Добавить запись')
self.btn_del_record = QPushButton('Удалить запись')
self.srtm_staff = QSqlRelationalTableModel()
self.srtm_staff.setTable('staff')
self.srtm_staff.setHeaderData(1, Qt.Horizontal, 'Имя')
self.srtm_staff.setHeaderData(2, Qt.Horizontal, 'Фамилия')
self.srtm_staff.setHeaderData(3, Qt.Horizontal, 'Возраст')
self.srtm_staff.setHeaderData(4, Qt.Horizontal, 'Должность')
self.srtm_staff.setHeaderData(5, Qt.Horizontal, 'Организация')
self.srtm_staff.setJoinMode(QSqlRelationalTableModel.LeftJoin)
self.myRelModel = UpdateRelModel(self.srtm_staff)
self.myRelModel.setRelation(5, QSqlRelation('org', 'org_id', 'org_name'))
self.table_staff = QTableView()
self.table_staff.setModel(self.srtm_staff)
self.table_staff.hideColumn(0)
self.table_staff.setItemDelegateForColumn(5, QSqlRelationalDelegate(self.table_staff))
self.table_staff.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
self.srtm_staff.select()
hbox_btn = QHBoxLayout()
hbox_btn.addWidget(self.btn_add_record)
hbox_btn.addWidget(self.btn_del_record)
vbox_main = QVBoxLayout()
vbox_main.addLayout(hbox_btn)
vbox_main.addWidget(self.table_staff)
self.setLayout(vbox_main)
# Signals
self.btn_add_record.clicked.connect(self.on_add_record)
self.btn_del_record.clicked.connect(self.on_del_record)
self.srtm_staff.dataChanged.connect(self.on_data_change)
self.table_staff.clicked.connect(self.updateTable)
def on_add_record(self):
self.srtm_staff.insertRow(0)
pass
def on_del_record(self):
self.srtm_staff.removeRow(self.table_staff.currentIndex().row())
self.srtm_staff.select()
def updateTable(self):
self.myRelModel.updateRelations()
def on_data_change(self):
self.srtm_staff.submitAll()
#self.table_staff.update()
