开源项目 qtbindings 中 qwebview 控件,控制打开链接的属性,Python 代码,请大家看看如何转成 Ruby 中可用的代码

rubysir · 2016年02月20日 · 最后由 rei 回复于 2016年03月01日 · 3170 次阅读

qtbindings 中的 qwebview 控件,target="_blank"的链接的点击均没有效果。 如下代码可用设置在当前窗口打开链接(详见:http://www.clanfei.com/2013/12/1733.html

import sys
from PyQt4.Qt import *
from PyQt4.QtWebKit import *

class WebView(QWebView):
    def __init__(self):
        super(WebView, self).__init__()
        self.load(QUrl('http://www.qq.com'))
        self.page().setLinkDelegationPolicy(QWebPage.DelegateAllLinks)
        self.page().linkClicked.connect(self.linkClicked)
        self.show()

    def linkClicked(self, url):
        self.load(url)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    webView = WebView()
    sys.exit(app.exec_())

但是 python 代码,我不懂;更搞不清楚 qt。 请哪位帮忙看看,如何转成 ruby 代码。 多谢!

Ruby 这边没有 QtWebView 的绑定看起来还是有 QtWebView 的,没用过,帮不上忙。

既然没有相关知识储备,又不愿意去学习对应知识,那么为什么要选择 Qt 来解决这个问题?上述代码,只要具备一些对应知识,应该还是比较容易理解的,按我个人理解注释下。。。

# 下述三行向当前名字空间导入一些名字,比如 QWebView,类似 Ruby 的 require 功能
import sys
from PyQt4.Qt import *
from PyQt4.QtWebKit import *

# 定义 QWebView 子类
class WebView(QWebView):
    def __init__(self): 
        # 初始化父类
        super(WebView, self).__init__()

        # 调用 QWebView 的 load 方法,载入页面
        self.load(QUrl('http://www.qq.com'))

        # 调用 QWebPage 的 setLinkDelegationPolicy 方法,设置链接点击策略
        self.page().setLinkDelegationPolicy(QWebPage.DelegateAllLinks)

        # 将 QWebPage 对象的 linkClicked 的信号与当前对象的 linkClicked 槽关联起来,
        # 也就是当页面中链接被点击时,调用 self.linkClicked 方法,而此方法会在当前页面载入对应的 url
        self.page().linkClicked.connect(self.linkClicked) 

        # 绘制控件,这时候你就才能在显示器上看到 QWebView
        self.show() 

    def linkClicked(self, url):
        self.load(url)

# 此处判断是否以 python xxxx.py 方法运行,是的话才会继续执行
if __name__ == '__main__':
    # 前两行创建必要的对象,最后一行进入事件循环,开始整个交互过程
    app = QApplication(sys.argv)
    webView = WebView()
    sys.exit(app.exec_())

多谢两位指教! watraludru 说的对! 没有计算机相关背景,每个概念要真弄懂还真不容易。

以前也关注过 Qt & Ruby,但一直没有好的绑定就放弃了。

如果一定要写客户端软件我会用 http://electron.atom.io/

需要 登录 后方可回复, 如果你还没有账号请 注册新账号