<p>有几个问题</p>
<h3>1。你的线程实际上没有运行</h3>
<p>您需要调用<code>QThread.start()</code>来实际运行<code>QThread.run()</code>。也就是说,你可能不想这样设计你的应用程序。没有理由为每个图片下载创建几十个或数百个不同的线程。如果创建一个工作线程来下载队列中的所有映像,效率会高得多。示例见下文。在</p>
<h3>2。不能在辅助线程</h3>中创建qpixmap或GUI项
<p>不能在主线程之外创建<code>QPixmap</code>。您既不能创建<code>QListWidgetItem</code>,也不能创建任何GUI元素;它们只能在主线程中创建(并安全地操作)。您可以使用其他类似的元素(比如<code>QImage</code>),但实际上,您只需要将下载的文件路径传递回主线程;主线程可以处理<code>QPixmap</code>和项创建。在</p>
<pre><code>class DownloadWorker(QObject):
data_downloaded = Signal(object)
@QtCore.Slot(str)
def download_image(self, name):
image_location = capture_image.take_photo(name)
self.data_downloaded.emit(image_location)
class MainWindow(QMainWindow, Ui_MainWindow):
request_download = QtCore.Signal(str)
def __init__(self, ...)
...
self.worker = DownloadWorker()
self.thread = QThread(self)
self.request_download.connect(self.worker.download_image)
self.worker.data_downloaded.connect(self.on_photo_ready)
self.worker.moveToThread(self.thread)
self.thread.start()
self.timer = QTimer(self)
self.timer.timeout.connect(self.take_photo)
self.timer.start(5000)
def take_photo(self):
import time
photo_name = str(time.time()) +'.jpg'
self.request_download.emit(photo_name)
@QtCore.Slot(str)
def on_photo_ready(self, filepath):
item = QListWidgetItem(QIcon(filepath))
self.listWidget.addItem(item)
</code></pre>