1

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

これがスクリーンショットです:

電話帳のおもちゃアプリのスクリーンショット

私のテーブルは次のようになります。

電話帳のdbテーブルのスクリーンショット

サービスフィールドなしで一度は機能させることができましたが、追加したので、QSqlRelationalTableModelの概念を導入し、機能させることができませんでした。

それは何をすることになっていますか:

  • 大きな白い中央のテーブルにDBの人のリストを入力します(モデルとマッパーがセットアップされていて、DBに2つのエントリが含まれているにもかかわらず、失敗します)
  • 中央のテーブル行のいずれかをクリックして、下部のフォームに行データを入力します
  • 編集と保存を許可します。

DBはデータでいっぱいであり、Pythonシェルでのテストから読み取ることができます。

コードはエラーをスローしませんが、何も起こりません。ウィンドウは何も表示されずに表示されます。

ここで私の間違いを指摘できますか?

必要な追加情報を喜んで提供します

4

1 に答える 1

1

あなたが持っているコードではservice varchar(20))、スクリーンショットでは、サービスは別のテーブルです(そうあるべきです)。しかし、nom代わりnameにスクリーンショット ( QtSql.QSqlRelation("service", "id", "name")) に表示されます。

したがって、データベース スキーマを確認してコードで実現すれば、うまくいくはずです。

@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 int)")    

    query.exec_(u"create table service(id int primary key, name varchar(20))")  
    db.commit()
    return db  # don't forget to return it, as you use it in close

PS「編集」および「追加」ロジックをチェックしていません。

于 2012-12-13T16:52:43.203 に答える