QtWebKit 中的 JavaScript 和异步方法

Posted

技术标签:

【中文标题】QtWebKit 中的 JavaScript 和异步方法【英文标题】:JavaScript and async methods in QtWebKit 【发布时间】:2015-03-30 09:48:33 【问题描述】:

我正在开发基于以下内容的桌面软件:

Python:PySide (WebKit) javascript:AngularJS

现在,我需要实现异步功能:

从 FTP(Python 部分)上传图片时,我需要在 UI (html+JS) 上显示一些上传器

需要关于优雅解决方案的建议。

非常简单的解决方案

    在 Python 字典中保存一些标志 通过计时器在JS中请求此标志的值:)

但是,我需要对时间进行硬编码,一旦我进行了长时间的操作,例如从 FTP 下载文件,这对我来说是个问题

解决方案代码:

templateManager.js

function _loadNewTemplates() 
        var deferred = $.Deferred();

        asyncManager.run($.proxy( _loadNewTemplatesCallback, null, deferred ), "get_new_templates_list" );

        return deferred;
    

    function _loadNewTemplatesCallback ( deferred, response ) 
        template.newList = response.result;
        deferred.resolve();
    

app_maager.py

    @QtCore.Slot(int, result=str)
    def get_new_templates_list(self, id):
       thread.start_new_thread(get_new_templates_list,
                                    (id,))

utils.py

def get_new_templates_list(id):
   config.set_response(id, json.dumps('result': _get_new_templates_list(), 'error': None, MyEncoder))


def _get_new_templates_list():
    request = 'category': PRODUCT_CODE
    response = requests.post(URL,
                             data=request,
                             headers=HEADERS)
    return json.loads(response.text)

config.py

def set_response(id, request):
    '''
    Put pair (id, request) to the internal dictionary
    :param id - int, request id:
    :param request - string, request string:
    :return:
    '''
    global _async_request
    _async_request[id] = request

def get_response(id):
    '''
    Returns request or empty string if request does not exist
    :param id - int
    :return - string, request string:
    '''
    global _async_request
    if _async_request.has_key(id):
        return _async_request.pop(id)
    else:
        return ''

【问题讨论】:

问题中没有任何部分表明您尝试编写代码 - 请参阅 ***.com/help/how-to-ask 有什么更新吗?我有兴趣解决同样的问题 【参考方案1】:

你可以这样做:

    使用stat/stat.ST_SIZE检索文件大小, 决定chunk 的大小, 使用正确的范围调用PySide.QtGui.QProgressBar.setRange(),对于二进制文件,0 到块数(文件大小/ftp 传输块大小)或文本文件的行数。 将回调传递给ftplib.FTP.storbinary()ftplib.FTP.storlines(),以便传输的每个块/行都会相应地增加您的进度条PySide.QtGui.QProgressBar.setValue()

【讨论】:

谢谢。我对没有进展的简单 loader.gif 很好,我正在寻找以异步模式在 JS 和 Python 之间进行通信的最佳灵活解决方案。因为我认为(也许我错了)我上面的方法没有我需要的那么好。

以上是关于QtWebKit 中的 JavaScript 和异步方法的主要内容,如果未能解决你的问题,请参考以下文章

使用 QtWebKit 在内存中渲染多个网页会在第二页中断,为啥?

简化 C 中的二进制和异或

从 PyQt4 QtWebkit 中的网页访问图像

PyQt4.QtWebKit:加载停止时 QWebPage QWebView 设置超时

QtWebKit c++ 连接:无法将 QWebView 转换为 SOCKET

PySide 和 QtWebKit:找不到模块