PySideの学習に使用するおもちゃの電話帳アプリケーションを入手しました。
import sys
import os
from PySide import QtCore, QtGui, QtSql
import phonebook_ui
CURRENT_FILE = os.path.abspath(__file__)
CURRENT_DIR = os.path.dirname(CURRENT_FILE)
DB_PATH = os.path.join(CURRENT_DIR, 'db.sqlite')
class PhoneBook(QtGui.QMainWindow, phonebook_ui.Ui_MainWindow):
def __init__(self):
super(PhoneBook, self).__init__()
self.setupUi(self)
self.db = self.create_connection()
# this is where the two tables should me linked automatically
self.model = QtSql.QSqlRelationalTableModel(self)
self.model.setTable('person')
self.model.setEditStrategy(QtSql.QSqlRelationalTableModel.OnManualSubmit)
foreign_key = self.model.fieldIndex('service')
self.model.setRelation(foreign_key,
QtSql.QSqlRelation("service", "id", "nom"))
self.model.select()
self.relation_model = self.model.relationModel(foreign_key)
self.edit_service.setModel(self.relation_model)
self.edit_service.setModelColumn(self.relation_model.fieldIndex("name"))
self.listing.setModel(self.model)
self.listing.setColumnHidden(0, True)
self.listing.setSelectionMode(QtGui.QAbstractItemView.SelectionMode.SingleSelection)
# this is where the model data should be automatically injected in the
# central table
self.mapper = QtGui.QDataWidgetMapper(self)
self.mapper.setModel(self.model)
self.mapper.setItemDelegate(QtSql.QSqlRelationalDelegate(self))
self.mapper.addMapping(self.edit_name, self.model.fieldIndex('name'))
self.mapper.addMapping(self.edit_phone, self.model.fieldIndex('phone'))
self.mapper.addMapping(self.edit_service, foreign_key)
self.listing.selectionChanged = self.on_selection_changed
def on_selection_changed(self, selected, deselected):
range = selected[0]
index = range.indexes()[0]
self.mapper.setCurrentIndex(index.row())
@classmethod
def create_connection(cls, bdd=DB_PATH):
db = QtSql.QSqlDatabase.addDatabase("QSQLITE")
db.setDatabaseName(bdd)
db.open()
query = QtSql.QSqlQuery()
query.exec_(u"create table person(id int primary key, name varchar(20), "
u"phone varchar(20), service varchar(20))")
db.commit()
return db
def close(self):
super(PhoneBook, self).close()
self.db.close()
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
phonebook = PhoneBook()
phonebook.show()
sys.exit(app.exec_())
これがスクリーンショットです:
私のテーブルは次のようになります。
サービスフィールドなしで一度は機能させることができましたが、追加したので、QSqlRelationalTableModelの概念を導入し、機能させることができませんでした。
それは何をすることになっていますか:
- 大きな白い中央のテーブルにDBの人のリストを入力します(モデルとマッパーがセットアップされていて、DBに2つのエントリが含まれているにもかかわらず、失敗します)
- 中央のテーブル行のいずれかをクリックして、下部のフォームに行データを入力します
- 編集と保存を許可します。
DBはデータでいっぱいであり、Pythonシェルでのテストから読み取ることができます。
コードはエラーをスローしませんが、何も起こりません。ウィンドウは何も表示されずに表示されます。
ここで私の間違いを指摘できますか?
必要な追加情報を喜んで提供します