在通过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")