2

PySide (Python Qt バインディング) を使用しています。

シグナル/スロットメカニズムを介してメイン GUI スレッドを更新する (QTableWidget を更新する) クラス QThread のワーカースレッドがあります。

私のワーカースレッドには、次のものがあります。

self.emit(SIGNAL("alterTable(object"), params)

私のGUIスレッドには次のものがあります:

self.connect(self.worker, SIGNAL("alterTable(object)"), self.updateMainTable, Qt.AutoConnection)

いくつかの同様のワーカー スレッドが実行され、すべてが同じスロット ( self.updateMainTable) に接続されているため、AutoConnection (したがって QueuedConnection) を使用する必要があります。作品を使用してQt.DirectConnectionいますが、安全ではありません(またはそう言われました)。

しかし、AutoConnection を使用しようとすると、次のエラーが発生します。

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

qRegisterMetaType()私は、PySide でを使用する方法を見つけようとして何年にもわたって Google で検索しましたが、役に立ちませんでした。私がオンラインで見つけたすべてのリソースは、C++ 構文/ドキュメントを指しています。

違いがある場合、問題のオブジェクトはdictほとんどの場合です。

4

2 に答える 2

1

私は自分で答えを見つけたと思いますが、正確な答えではありませんが、実行可能な解決策です。

すべてのシグナルを新しいスタイルの構文に切り替えました。誰かが疑問に思っている場合に備えて、ワーカー クラスでカスタム シグナルを定義することでそれを行いました。だから私のコードは次のようになります

class Worker(QThread):

    alterTable = Signal(dict)

    def __init__(self, parent=None):
        ....
        self.alterTable.emit(parameters)


class GUI(QMainWindow):

    def __init__(self, parent=None):
        WorkerModule.Worker().alterTable.connect(self.myMethod)

何らかの理由で、Signal は QThread クラス内になければなりません。それ以外の場合、Qt は "Signal has no attribute connect" エラーについて不平を言います。これは非常に奇妙です。

于 2012-11-09T05:43:39.957 に答える