关于pyqt Qwebkit+html+js 的总结

在通过pyqt的Qwebkit+html+js开发桌面程序的时候,很头疼的就是怎么样通过js来调用python代码,

js是通过Object对象来调用python代码的,需要声明一个Qobject 的子类,里面的方法使用pyqtSignature装饰器修饰

self.page().mainFrame().javaScriptWindowObjectCleared.connect(setAddtojs) ##js调用python

def setAddtojs():

        self.page().mainFrame().addToJavaScriptWindowObject(QString('mOBJ'), mOBJ)

这样 mOBJ就成了window的一个属性, window.mOBJ.func,func是我们声明Qobject子类的对象里的方法


还有我们在页面里使用ajax获取数据的时候,不能正常获取数据,这就要对webview进行设置,

    webview.settings().setAttribute(QWebSettings.LocalContentCanAccessRemoteUrls, True)

下面两句是利用html5的本地存储功能来帮助我们存储程序运行中要保存的数据

    webview.settings().setAttribute(QWebSettings.LocalStorageEnabled, True) #开始本地存储

    webview.settings().setLocalStoragePath("html/") #存储的路径

如何存储cookie呢,并且利用cookie

   webview.page().networkAccessManager().setCookieJar(QNetworkCookieJar(self))

for cookie in app.mcookiejar.allCookies():

            print cookie.name()

name是setCooke(name, val)中的name,在请求时候,可以将cookie放在header中发出请求


设置窗体无边框, setWindowFlags(Qt.FramelessWindowHint)

在设置成无边框了,就无法拖动了,实现拖动就是通过 js 计算出鼠标移动的距离,然后设置窗体的moveTo方法,实现拖动


学习osc 客户端 ,源码在http://git.oschina.net/fantsme/oschina-for-pc


下面是我总结的简单的例子

from PyQt4.QtCore import *

from PyQt4.QtGui import *

from PyQt4.QtWebKit import *


class BrowserScreen(QWebView):

    def __init__(self):

        QWebView.__init__(self)

        self.resize(800, 600)

        self.setUrl(QUrl('views/window.html'))

        self.show()

        ''''

            以下是对webview的属性设置,第一个是设置访问远程url,当使用ajax请求的时候,这个就派上用上

        '''

        self.webview.settings().setAttribute(QWebSettings.LocalContentCanAccessRemoteUrls, True)

        self.webview.settings().setAttribute(QWebSettings.LocalStorageEnabled, True)

        self.webview.settings().setLocalStoragePath("html/")

        self.webview.page().networkAccessManager().setCookieJar(QNetworkCookieJar(self))

        mOBJ = AdamOBJ()

        # self.page().mainFrame().evaluateJavaScript(QString('alert("hello wolrd")')) ##python调用js

        self.page().mainFrame().javaScriptWindowObjectCleared.connect(lambda: self.page().mainFrame().addToJavaScriptWindowObject(QString('mOBJ'), mOBJ)) ##js调用python


class AdamOBJ(QObject):

   @pyqtSignature("QString")

   def echo(self, strVal):

       print strVal


if __name__ == '__main__':

    import sys

    app = QApplication(sys.argv)

    browser = BrowserScreen()

    sys.exit(app.exec_())



在html页面里面要这样调用

window.mOBJ.echo("hello world")


你可能感兴趣的:(关于pyqt Qwebkit+html+js 的总结)