2017-03-14 7 views
0

を処理する方法を私たちは、単一の長命のセッションでのQtを使用するアプリケーションとSQLAlchemyのパイソンを開発しています。 dbから読み込んだオブジェクトの中には、長生きしているものもあり、Qtシグナルを送信して変更を通知します。これが機能するために、我々は、カスタムメタクラスで、二重継承を使用して@orm.reconstructorからQObjectの基本クラスを初期化:PyQtは信号とSQLAlchemyのは:適切にオブジェクトの有効期限

class LongLived(QObject, Base): 
    __metaclass__ = DeclarativeQObjectMeta 
    # ... column declarations ... 

    something_changed = pyqtSignal(object) 

    @orm.reconstructor 
    def init_on_load(self): 
     QObject.__init__(self) 

このアプローチの問題は、それが持っていた後、誰かがオブジェクトにアクセスするたびinit_on_loadが呼び出されるということです(つまり、すべてのコミット後に)期限切れです。これは、QObjectを再初期化します。このQObjectは、プロセス内のすべての信号接続を終了させるようです。

expire_on_commit=Falseを設定以外の)有効期限が切れてオブジェクトに接続PyQtは信号/スロットを維持するための適切な方法は何ですか? SQLAlchemyのとQt/PyQtは以来

答えて

0

は、オブジェクトのライフサイクルのその取り扱いには非常に特別なもの、それはおそらく、これら二つをミックスするのは良い考えではありません。あなたは明らかに_qobjectはるかの作成と保存を行うことができ

_qobject = None 
def validate_phone(target, value, oldvalue, initiator): 
    "Notify about phone number change" 
    if _qobject is None: 
     _qobject = YourQObjectImplementation() 

    _qobject.something_changed.emit(target, value, oldvalue) 
    return value 

# setup listener on UserContact.phone attribute, instructing 
# it to use the return value 
listen(UserContact.phone, 'set', validate_phone) 

はたぶん、あなたはQObjectの長寿命、1を維持することを考えると(SQLAlchemy exampleを使用して)属性変更を知らせるためにSQLAlchemyのイベントリスナーを使用することができます(あなたは順番にそのために他のSQLAlchemyのイベントを使用することができます)洗練された(セッションごと、アプリケーションごと、スレッドローカルなど)、あなたはすべての興味深い属性にリスナーを作成する必要があると思います。 私は既製のソリューションではありません承知だけど、便利、異なるアプローチであるかもしれません。

関連する問題