2015-12-10 4 views
-1

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_()) 
+0

Если вы плаваете указатель мыши над значком downvote, вы увидите всплывающую подсказку: * Этот вопрос не показывает никаких исследований; это неясно или не полезно *. Вероятно, поэтому кто-то отказался от вас. –

+0

Спасибо, я уточню его –

ответ

0

необходимо установить значение для столбца внешнего ключа «contact_id» в новой строке.

меня обновить свой код следующим образом:

1- Добавить новое поле для хранения контактов и идентификатор добавлен макет

id_label = QLabel("Id") 
    self.txtId = QLineEdit() 
    self.txtId.setReadOnly(True) 
    #.... 

    right_layout.addWidget(id_label) 
    right_layout.addWidget(self.txtId) 

2- Обновить отображение для заполнения txtId

self.conatacts_mapper.addMapping(self.txtId, 0) 

3- Обновить метод add_record для заполнения contact_id в модели телефона

def add_record(self): 
    indexModel = self.phones_model.rowCount() 
    self.phones_model.insertRow(indexModel) 
    self.phones_model.setData(self.phones_model.index(indexModel,1),self.txtId.text()) 
+0

Это было отмечено VLQ, но я не уверен ... Ни вопрос, ни это не имеют для меня никакого смысла, и я не вижу никакой связи между ними. На первый взгляд, поскольку нет никаких проблем, это похоже на случайное предположение. –

+0

На мой вопрос не ясно, я уже сделал, как вы говорите, и добавил код для просмотра телефонов при нажатии на какой-либо контакт, а также для сохранения новых телефонов, и все работает отлично, за исключением случаев, когда я добавляю новый контакт, я не могу добавить новые телефоны до тех пор, пока я закройте форму и откройте ее повторно, в противном случае мне придется привязать модель модели к модели контактов и заполнить ее данными и отправить данные. OnRowChange –

+0

это именно то, что я делаю, и работает, пока текущая запись контактов уже сохранена, но если я просто вставил новый контакт, модель телефона setData не работает до тех пор, пока я не повторю ее с данными и не установил отношение к модели контактов, что означает, что я должен сохранять каждую запись телефона и не могу сэкономить по требованию, если вы не сделали мой point Я могу представить полный код, чтобы показать вам –