且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

PyQt4中QWebView的多线程

更新时间:2023-02-15 15:40:58

看看这样的事情是否有效.这个bookie 类所做的就是将loadFinished 被调用的次数存入变量count 中,并返回列表中对应的项参数.在创建grabber 对象时,它通过QSignalMapper 将其映射到一个数字,因此您可以通过调用mapper.mapping(id-of-grabber-object).在修改您的代码之前,您可以继续尝试此代码,看看它是否适合您:

See if something like this works. What this bookie class does is store the number of times loadFinished is called into the variable count, and returns the corresponding item in the list params. When creating the grabber objects, it maps it to a number through QSignalMapper, so you may retrieve the sender of the signal by calling mapper.mapping(id-of-grabber-object). You can go ahead and try this code to see if it works for you before modifying yours:

#!/usr/bin/env python
from PyQt4.QtCore import pyqtSlot, QObject, QSignalMapper, QTimer
from PyQt4.QtGui import QApplication
from PyQt4.QtWebKit import QWebView


class bookie(QObject):
    def __init__(self, parent=None):
        super(bookie, self).__init__(parent)

        self.count  = 0
        self.url    = 'http://some website.com/search?param={0}'
        self.params = range(100) # instead of [1,2,3,4,5,6,7,8,9,10,11,12] and so on...

        Grabber = QWebView # This would be your Grabber class

        self.mapper = QSignalMapper(self)
        self.mapper.mapped.connect(self.on_mapper_mapped)

        for grabberNumber in range(10): # Create 10 Grabber instances
            grabber = Grabber()
            grabber.loadFinished.connect(self.mapper.map)

            self.mapper.setMapping(grabber, grabberNumber)

            grabber.loadFinished.emit(True) # Initialize the grabber by emitting loadFinished

    def on_mapper_mapped(self, gNumber):
        self.count += 1
        if self.count < len(self.params):
            gParam  = self.params[self.count]   
            grabber = self.mapper.mapping(gNumber)
            #grabber.load(QUrl(self.url.format(gParam)))

            # Next 2 lines for testing purposes, remove & uncomment the previous line

            print "GRABBER:", gNumber, "PARAMETER:", gParam
            QTimer.singleShot(1, lambda:grabber.loadFinished.emit(True)) 

if __name__ == "__main__":
    import  sys

    app = QApplication(sys.argv)
    main = bookie()