0

これがサンプルコードです

import sys, time
from PyQt4 import QtCore, QtGui

class MyApp(QtGui.QWidget):

    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.setGeometry(300, 300, 280, 600)
        self.setWindowTitle('threads')
        self.layout = QtGui.QVBoxLayout(self)
        self.testButton = QtGui.QPushButton("test")
        self.connect(self.testButton, QtCore.SIGNAL("released()"), self.test)
        self.listwidget = QtGui.QListWidget(self)
        self.layout.addWidget(self.testButton)
        self.layout.addWidget(self.listwidget)

    def add(self, text):
        print "Add: ", text
        self.listwidget.addItems(text)
        self.listwidget.sortItems()

#    def addBatch(self, text="test", iters=6, delay=0.3):
#        for i in range(iters):
#            time.sleep(delay)
#            self.add(text + "  " + str(i))

    def test(self):
        self.listwidget.clear()
        #self.addBatch("_non_thread", iters=6, delay=0.3)
        self.workThread = WorkThread()
        self.connect(self.workThread, QtCore.SIGNAL("update(QString"), self.add)
        self.workThread.start()

class WorkThread(QtCore.QThread):

    def __init__(self):
        QtCore.QThread.__init__(self)

    def __del__(self):
        self.wait()

    def run(self):
        for i in range(6):
            time.sleep(0.3)
            self.emit(QtCore.SIGNAL('update(QString'), "from work thread " + str(i))
        return

app = QtGui.QApplication(sys.argv)
test = MyApp()
test.show()
app.exec_()

ここに、リストウィジェットとプッシュボタンを備えた基本的なGUIがあります。プッシュボタンを押すと、プログラムは少し待って、そのリストウィジェットに文字列を表示する必要があります。WorkThreadクラスは待機中の処理を実行し、待機後にシグナルを発行します。しかし、プログラムを実行すると、GUIが表示されるのは私だけで、リストウィジェットには何も表示されません。

誰かがこれの背後にある理由とこれを修正する方法を教えてもらえますか?

4

2 に答える 2

2

QListWidget.addItemsアイテムのリストが必要ですが、単一のQString. を使用する必要があります.addItem

また、いくつかの小さな修正があります。__del__スレッドに実装する必要はありません。__init__追加のことをしていない場合はスキップできます。また、新しいスタイルの信号と接続を使用する必要があります。

すべての修正を加えた結果は次のとおりです。

import sys, time
from PyQt4 import QtCore, QtGui


class MyApp(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.setGeometry(300, 300, 280, 600)
        self.setWindowTitle('threads')
        self.layout = QtGui.QVBoxLayout(self)
        self.testButton = QtGui.QPushButton("test")
        self.testButton.clicked.connect(self.test)
        self.listwidget = QtGui.QListWidget(self)
        self.layout.addWidget(self.testButton)
        self.layout.addWidget(self.listwidget)

    def add(self, text):
        print "Add: ", type(text)
        self.listwidget.addItem(text)
        self.listwidget.sortItems()

#    def addBatch(self, text="test", iters=6, delay=0.3):
#        for i in range(iters):
#            time.sleep(delay)
#            self.add(text + "  " + str(i))

    def test(self):
        self.listwidget.clear()
        #self.addBatch("_non_thread", iters=6, delay=0.3)
        self.workThread = WorkThread()
        self.workThread.update.connect(self.add)
        self.workThread.start()


class WorkThread(QtCore.QThread):
    update = QtCore.pyqtSignal(str)

    def run(self):
        for i in range(6):
            time.sleep(0.3)
            self.update.emit("from work thread " + str(i))

app = QtGui.QApplication(sys.argv)
test = MyApp()
test.show()
sys.exit(app.exec_())
于 2013-02-12T19:12:32.543 に答える
1

PyQtWiki には、バックグラウンド スレッドから UI にシグナルを送信する方法の非常に精巧な例が含まれています。QThreadどうやら、スレッドを実装する限り、特別な魔法は必要ありません。

released()しかし、信号を使用してボタンをメソッドに接続していることに気付きましたtest()。試しましたclicked()か?

于 2013-02-12T16:43:28.630 に答える