Edit: Repost с новым кодом и ясным вопросом: в коде ниже вы можете добавить и сохранить должным образом, и вопрос: мне нужно сделать то же самое, но без представления данные в базу данных о смене строки, мне нужно иметь возможность добавлять новую контактную запись (мастер) и вставлять телефоны в таблицу (подробности), не отправляя с каждой записью, которую я вставляю и отправляю, только если нажать сохранитьмастера сборки форма/подробно с использованием PyQt и QtSql
----- -------- старый вопрос -------------------
Я хочу создать форму для отображения данных master/details с помощью QtSql и PyQt, поэтому ниже трески e - образец того, что я хочу сделать, Мне нужно уметь вставлять новые телефоны под контакт и сохранять его
Я прочитал книгу «Rapid GUI Programming with Python and Qt», но не нашел как это сделать, поэтому я разместил этот вопрос с полным рабочим примером, который мне нужно изменить для работы по желанию
Редактировать: На самом деле я не знаю, почему я получил голос ?, вопрос непонятен ?
import sys
from PySide.QtGui import *
from PySide.QtSql import *
class MainWidget(QWidget):
def __init__(self):
QWidget.__init__(self)
self.setWindowTitle("Address Book Example")
self.initUI()
db = QSqlDatabase.addDatabase("QSQLITE")
db.setDatabaseName("addressbook.db")
ok = db.open()
self.contacts_model = QSqlTableModel()
self.contacts_model.setTable('contacts')
self.contacts_model.setEditStrategy(QSqlTableModel.OnFieldChange)
self.contacts_model.select()
self.phones_model = QSqlRelationalTableModel()
self.phones_model.setTable('phones')
self.phones_model.setEditStrategy(QSqlTableModel.OnRowChange)
self.phones_model.setRelation(1, QSqlRelation('contacts', 'id', 'full_name'))
self.phones_model.select()
self.conatacts_mapper = QDataWidgetMapper()
self.conatacts_mapper.setModel(self.contacts_model)
self.conatacts_mapper.addMapping(self.txtFullName, 1)
self.conatacts_mapper.addMapping(self.txtAddress, 2)
self.conatacts_mapper.toFirst()
self.record_changed()
self.tblPhones.setModel(self.phones_model)
# self.tblPhones.setColumnHidden(0, True)
# self.tblPhones.setColumnHidden(1, True)
self.btnNext.clicked.connect(self.conatacts_mapper.toNext)
self.btnPrev.clicked.connect(self.conatacts_mapper.toPrevious)
self.btnAdd.clicked.connect(self.add_record)
self.btSave.clicked.connect(self.save)
self.btNew.clicked.connect(self.new_contact)
self.conatacts_mapper.currentIndexChanged.connect(self.record_changed)
def add_record(self):
if self.phones_model.rowCount() == 0:
index = self.conatacts_mapper.currentIndex()
self.conatacts_mapper.submit()
self.conatacts_mapper.setCurrentIndex(index)
self.prepare_sub()
row = self.phones_model.rowCount()
self.phones_model.insertRow(row)
index = self.phones_model.index(row, 1)
self.tblPhones.setCurrentIndex(index)
self.tblPhones.edit(index)
self.phones_model.setData(self.phones_model.index(self.phones_model.rowCount() - 1, 1),
self.contacts_model.record(self.conatacts_mapper.currentIndex()).value('id'))
def record_changed(self):
self.phones_model.setFilter("contact_id = {}".format(self.conatacts_mapper.currentIndex()+1))
def save(self):
self.contacts_model.submitAll()
self.phones_model.submitAll()
self.conatacts_mapper.submit()
def new_contact(self):
self.contacts_model.insertRow(self.contacts_model.rowCount())
self.conatacts_mapper.setCurrentIndex(self.contacts_model.rowCount() - 1)
def prepare_sub(self):
self.phones_model.setTable('phones')
self.phones_model.setRelation(1, QSqlRelation('contacts', 'id', 'full_name'))
self.phones_model.select()
self.phones_model.setFilter('contact_id=%s' % self.contacts_model.record(self.conatacts_mapper.currentIndex()).value('id'))
def initUI(self):
main_layout = QHBoxLayout()
right_layout = QVBoxLayout()
left_layout = QVBoxLayout()
main_layout.addLayout(right_layout)
main_layout.addLayout(left_layout)
name_label = QLabel("Full Name")
self.txtFullName = QLineEdit()
address_label = QLabel("Address")
self.txtAddress = QLineEdit()
phones_label = QLabel("Phone Numbers")
self.tblPhones = QTableView()
right_layout.addWidget(name_label)
right_layout.addWidget(self.txtFullName)
right_layout.addWidget(address_label)
right_layout.addWidget(self.txtAddress)
right_layout.addWidget(phones_label)
right_layout.addWidget(self.tblPhones)
self.btnPrev = QPushButton("Previous")
self.btnNext = QPushButton("Next")
self.btnAdd = QPushButton("Add")
self.btSave = QPushButton('Save')
self.btNew = QPushButton('New')
left_layout.addWidget(self.btNew)
left_layout.addWidget(self.btnPrev)
left_layout.addWidget(self.btnNext)
left_layout.addStretch(1)
left_layout.addWidget(self.btnAdd)
left_layout.addWidget(self.btSave)
self.setLayout(main_layout)
if __name__ == '__main__':
app = QApplication(sys.argv)
w = MainWidget()
w.show()
sys.exit(app.exec_())
Если вы плаваете указатель мыши над значком downvote, вы увидите всплывающую подсказку: * Этот вопрос не показывает никаких исследований; это неясно или не полезно *. Вероятно, поэтому кто-то отказался от вас. –
Спасибо, я уточню его –