2017-12-01 14 views
0

ライセンスのためにPyQtの代わりにPySideを使用することができます。シグナル/スロットでのカスタムオブジェクト(PyQt_PyObject like)の使用

信号/スロット機構を使用してスレッド間でカスタムオブジェクトを渡す必要があります。 PyQtはを使用すると、私は信号の引数としてPyQt_PyObjectタイプを使用することができますが、明らかに、このタイプはPySideに存在しません:

TypeError: Unknown type used to call meta function (that may be a signal): PyQt_PyObject 

私の代わりにPyQt_PyObjectobjectを使用しようとしたが、物事は、信号間のDirectConnectionタイプでのみ発生し、スロット:QueuedConnectionで

self.connect(dummyEmitter, 
      QtCore.SIGNAL("logMsgPlain(object)"), 
      self._logMsgPlain, 
      QtCore.Qt.DirectConnection) 

、私はエラーを取得する:

QObject::connect: Cannot queue arguments of type 'object' 
(Make sure 'object' is registered using qRegisterMetaType().) 

私は「物事happeを言いますn "はこれまでのところ動作しないためです。私は今DirectConnectionタイプのためにエラーが発生します:

QObject::startTimer: timers cannot be started from another thread 
QPixmap: It is not safe to use pixmaps outside the GUI thread 
etc ... 

どうすればいいですか? PyStideにPyQt_PyObject型のようなものがありますか?

EDIT: この小さなexempleは失敗します。今のところ

from PySide import QtCore, QtGui 
import sys 

class Object(QtCore.QObject): 
    ''' A dummy emitter that send a list to the thread ''' 
    def emitSignal(self): 
     someList = [0, 1, 2, 3] 
     self.emit(QtCore.SIGNAL("aSignal(object)"), someList) 

class Worker(QtCore.QObject): 
    def aSlot(self, value): 
     print "List: {}".format(value) 

if __name__ == "__main__": 
    app = QtGui.QApplication(sys.argv) 

    worker = Worker() 
    obj = Object() 

    thread = QtCore.QThread() 
    worker.moveToThread(thread) 
    QtCore.QObject.connect(obj, QtCore.SIGNAL("aSignal(object)"), worker.aSlot) 
    # The exemple will pass with the line below uncommented 
    # But obviously, I can't use a DirectConnection with a worker thread and the GUI thread 
    # QtCore.QObject.connect(obj, QtCore.SIGNAL("aSignal(object)"), worker.aSlot, QtCore.Qt.DirectConnection) 

    thread.start() 
    obj.emitSignal() 

    app.exec_() 
+1

このページをお読みください? https://wiki.qt.io/Differences_Between_PySide_and_PyQt。私は常に「新しいスタイルの」シグナル/スロット構文を使用し、スレッド間でPythonオブジェクトを渡すことができました。 –

+0

はい、私はこのページを読んでいますが、PyQtとPySideの間のこのレベルの違いについては何も見ませんでした。 –

+0

小さな例を投稿できますか? PySideは間違いなくあなたが望むことをすることができますが、コメントするには十分な情報がありません。自分のPySideプログラムで接続のタイプを決して宣言したことはありません。もし2つのオブジェクトが異なるQThreadsにあれば、それは何をすべきかを知っています。 –

答えて

0

を、私が見つけた唯一の解決策は、新しいスタイルのシグナル/スロット構文に切り替えることです:

from PySide import QtCore, QtGui 
import sys 

class Object(QtCore.QObject): 
    aSignal = QtCore.Signal(object) 
    def emitSignal(self): 
     someList = [0, 1, 2, 3] 
     self.aSignal.emit(someList) 

class Worker(QtCore.QObject): 
    def aSlot(self, value): 
     print "List: {}".format(value) 

if __name__ == "__main__": 
    app = QtGui.QApplication(sys.argv) 

    worker = Worker() 
    obj = Object() 

    thread = QtCore.QThread() 
    worker.moveToThread(thread) 
    obj.aSignal.connect(worker.aSlot) 

    thread.start() 
    obj.emitSignal() 

    app.exec_() 

しかし、私古いスタイルの構文で解決策があるかどうかを知ることに興味がありますが、今のところはそうではないようです。

+0

解決策は古いスタイルの構文を使用しないことです。これは醜い、不潔でエラーが発生しやすい構文です。 – ekhumoro

関連する問題