2

いくつかの対策を開始した後、QLCDNumbers を更新するにはどうすればよいでしょうか。次のように信号を QLCDNumbers に接続するための GUI スレッドを作成しました。

class BtDialog(QtGui.QDialog, Dlg):
  def __init__(self):
    QtGui.QDialog.__init__(self)
    self.setupUi(self)
    self.thread = WorkerThread()

    #Configure slots
    self.connect(self.startButton, QtCore.SIGNAL("clicked()"), self.onStart)
    self.connect(self.stopButton, QtCore.SIGNAL("clicked()"), self.onStop)

    #QLCDNumber Slot
    self.connect(self.thread, self.thread.voltage, self.lcdVoltage.display)

 def onStart(self):
    self.thread.start()

 def onStop(self):
     self.emit(self.thread.voltage, 0) #Trying to refresh
     abort()

ここでは、ワーカー スレッドを開始するボタンとプロセスを停止するボタンの 2 つのボタンを接続します。プロセスを停止するときに、「0」を表示して QLCDNumber を更新したいのですが、うまくいきません。ワーカー スレッドでは、次のようにシグナルを初期化します。

def __init__(self, parent = None):
    QtCore.QThread.__init__(self, parent)
    self.voltage = QtCore.SIGNAL("voltage")

そして、プロセスが実行されると、私はシグナルを発します

self.emit(self.voltage, volt_act)

測定後。それはこれまでのところうまくいきます。しかし、ワーカープロセスを再度開始したいときに停止した後、シグナルは QLCDNumber に再度送信されません。そのためには、GUI を再起動する必要があります。QLCDNumber をリフレッシュしたいという私の 2 つの問題を修正するにはどうすればよいですか?

4

1 に答える 1

1

投稿したコードから問題がどこにあるのかわかりませんが、これは修正に役立つはずです。また、新しいスタイルのシグナル/スロット接続詳細な参照 (モーダル ダイアログ、タイマーなど)のドキュメントをチェックアウトしてください:

#!/usr/bin/env python
#-*- coding:utf-8 -*-
import time

from PyQt4 import QtGui, QtCore

class MyThread(QtCore.QThread):
    countChange = QtCore.pyqtSignal(int)
    countReset  = QtCore.pyqtSignal(int)

    def __init__(self, parent=None):
        super(MyThread, self).__init__(parent)
        self.stopped = QtCore.QEvent(QtCore.QEvent.User)

    def start(self):
        self.stopped.setAccepted(False)
        self.count = 0

        super(MyThread, self).start()

    def run(self):
        while not self.stopped.isAccepted():
            self.count += 1
            self.countChange.emit(self.count)
            time.sleep(1)

        self.countReset.emit(0)

    def stop(self):
        self.stopped.setAccepted(True)

class MyWindow(QtGui.QDialog):
    def __init__(self, parent=None):
        super(MyWindow, self).__init__(parent)

        self.lcdNumber = QtGui.QLCDNumber(self)

        self.pushButtonStart = QtGui.QPushButton(self)
        self.pushButtonStart.setText("Start")
        self.pushButtonStart.clicked.connect(self.on_pushButtonStart_clicked)

        self.pushButtonStop = QtGui.QPushButton(self)
        self.pushButtonStop.setText("Stop")
        self.pushButtonStop.clicked.connect(self.on_pushButtonStop_clicked)

        self.pushButtonDone = QtGui.QPushButton(self)
        self.pushButtonDone.setText("Done")
        self.pushButtonDone.clicked.connect(self.on_pushButtonDone_clicked)

        self.layoutHorizontal = QtGui.QHBoxLayout(self)
        self.layoutHorizontal.addWidget(self.lcdNumber)
        self.layoutHorizontal.addWidget(self.pushButtonStart)
        self.layoutHorizontal.addWidget(self.pushButtonStop)
        self.layoutHorizontal.addWidget(self.pushButtonDone)

        self.thread = MyThread(self)
        self.thread.countChange.connect(self.lcdNumber.display)
        self.thread.countReset.connect(self.lcdNumber.display)

    @QtCore.pyqtSlot()
    def on_pushButtonStart_clicked(self):
        self.thread.start()

    @QtCore.pyqtSlot()
    def on_pushButtonStop_clicked(self):
        self.thread.stop()

    @QtCore.pyqtSlot()
    def on_pushButtonDone_clicked(self):
        sys.exit()

if __name__ == "__main__":
    import sys

    app = QtGui.QApplication(sys.argv)
    app.setApplicationName('MyWindow')

    main = MyWindow()
    main.exec_()

    sys.exit(app.exec_())
于 2013-03-18T21:53:01.353 に答える