2

私は次のコードを持っています:

class Functions(QObject):

    mysig = Signal(filename)

    def __init__(self, parent=None):
        super(Functions, self).__init__(parent)
        self.result = None

    def showDialog(self, filename):
        self.mysig.emit(filename)

    def grabResult(self):

        while not self.result:
            time.sleep(5)

        return result #this is the question

    def setResult(self, result):
        self.result = result

コードの他の部分にはこれがあります:

class Dialog(QDialog):

    anotherSig = Signal(str)
    fun = Functions()

    def __init__(self, parent=None, filename=filename):
        self.filename = filename
        #Here it displays a picture based on the filename parameter

    def okButtonClicked(self):
        text = self.lineedit.text()
        fun.setResult(text)
        #Tried also this:
        self.anotherSig.emit(text)

Functions()クラスはワーカーから呼び出されますQThread(ここには示されていません)。

私の質問はこれだと思います。Functionsユーザーがテキストを入力して[OK]ボタンをクリックしたことをクラスに伝えるにはどうすればよいですか?そのSignalを接続しようとanotherSigしましたが、接続しようとすると、QtはQPixmapを別のスレッドから設定しても安全ではないと文句を言い、機能しません。

ここで使用している方法は「機能」しますが、信頼性が低いと感じています。さらに、Functionsクラス内の関連するすべてのメソッドが存在する場合にのみ機能します@classmethod。このように、何らかの理由で機能しません。setResultは呼び出されますが(確認のためにステートメントを追加しました)printgrabResultそれでも。として表示self.resultされNoneます。

4

2 に答える 2

0

このコードは機能していません。これは、他のスレッドでオフになっているオブジェクトの属性でshowDialogあるオブジェクトのインスタンス化でへの呼び出しが行われているためです。Functions結果を設定するfuninDialogは、別のインスタンス化です。

結果を元のオブジェクトに戻すには、結果を取得したいオブジェクトの関数にオブジェクトをFunctions接続する必要があると思います。anotherSigDialogsetResultFunctions

このようなことをします(ボイラープレートを少し使わずにこれをテストするのは難しいです)。

class Functions(QObject):

    mysig = Signal(filename,Functions)

    def __init__(self, parent=None):
        super(Functions, self).__init__(parent)
        self.result = None

    def showDialog(self, filename):
        self.mysig.emit(filename,self)

    def grabResult(self):

        while not self.result:
            time.sleep(5)

        return result #this is the question

    @QtCore.Slot(str)
    def setResult(self, result):
        self.result = result

def connection_fun(filename,fun):
    d = Dialog(filename)
    # what ever else you do in here
    d.anotherSig.connect(fun.setResult))
于 2012-12-04T05:33:44.143 に答える
0

を使用するtime.sleepと、アプリケーションがフリーズします。クラスを待機させる方法の 1 つは、QEventLoop次のように使用することです。

loop = QEventLoop()
myDialog.mySignal.connect(loop.quit)
loop.exec_() 
于 2012-12-23T22:06:49.363 に答える