ライセンスのために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_PyObject
のobject
を使用しようとしたが、物事は、信号間の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_()
このページをお読みください? https://wiki.qt.io/Differences_Between_PySide_and_PyQt。私は常に「新しいスタイルの」シグナル/スロット構文を使用し、スレッド間でPythonオブジェクトを渡すことができました。 –
はい、私はこのページを読んでいますが、PyQtとPySideの間のこのレベルの違いについては何も見ませんでした。 –
小さな例を投稿できますか? PySideは間違いなくあなたが望むことをすることができますが、コメントするには十分な情報がありません。自分のPySideプログラムで接続のタイプを決して宣言したことはありません。もし2つのオブジェクトが異なるQThreadsにあれば、それは何をすべきかを知っています。 –