4

PyQtの非メインスレッドからシグナルを送信しようとしていますが、何が間違っているのかわかりません!そして、私がプログラムを実行すると、このエラーで失敗します:

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

これが私のコードです:

 class Sender(QtCore.QThread):
        def __init__(self,q):
            super(Sender,self).__init__()
            self.q=q
        def run(self):

            while True:
                pass
                try: line = q.get_nowait()
             # or q.get(timeout=.1)
                except Empty: 
                    pass
                else: 
                   self.emit(QtCore.SIGNAL('tri()')) 
 class Workspace(QMainWindow, Ui_MainWindow):
    """ This class is for managing the whole GUI `Workspace'.
        Currently a Workspace is similar to a MainWindow
    """

    def __init__(self):  
try:
            from Queue import Queue, Empty
        except ImportError:
            while True:
    #from queue import Queue, Empty  # python 3.x
                print "error"

        ON_POSIX = 'posix' in sys.builtin_module_names

        def enqueue_output(out, queue):
            for line in iter(out.readline, b''):
                queue.put(line)
            out.close()

        p= Popen(["java -Xmx256m -jar bin/HelloWorld.jar"],cwd=r'/home/karen/sphinx4-1.0beta5-src/sphinx4-1.0beta5/',stdout=PIPE, shell=True, bufsize= 4024)
        q = Queue()
        t = threading.Thread(target=enqueue_output, args=(p.stdout, q)) 
          t.daemon = True # thread dies with the program
        t.start()
        self.sender= Sender(q)
         self.connect(self.sender, QtCore.SIGNAL('tri()'), self.__action_About)
        self.sender.start()

スレッドにパラメーターを送信する方法が間違っていると思います...スレッドにパラメーターを送信する方法を知る必要があります。私の場合qは、ワーカースレッドに送信する必要があります。

4

2 に答える 2

1

「QTextCursor」がqRegisterMetaType()を使用して登録されていることを確認してください。

qRegisterMetaType関数を使ってみましたか?

公式マニュアルによると

このクラスは、QVariantおよびキューに入れられたシグナルとスロット接続でタイプをマーシャルするためのヘルパーとして使用されます。型名を型に関連付けて、実行時に動的に作成および破棄できるようにします。Q_DECLARE_METATYPE()を使用して新しい型を宣言し、QVariantおよびその他のテンプレートベースの関数で使用できるようにします。qRegisterMetaType()を呼び出して、キューに入れられた信号やスロット接続などの非テンプレートベースの関数でタイプを使用できるようにします

于 2012-12-03T08:55:09.767 に答える