当前位置: 首页 > news >正文

Pyside6使用QtWebEngine实现GUI嵌入网页内容

        Pyside6是由Qt官方维护和开发的一个用于创建跨平台桌面应用程序的Python绑定库。QtWebEngine是Qt提供的一个模块,它基于Chromium项目,允许开发者在他们的应用程序中嵌入网页内容。通过结合Pyside6和QtWebEngine,开发者可以轻松地创建具有现代网页浏览功能的桌面应用程序。本文,我将向大家介绍QtWebEngine的使用方法。

PyQt5 Vs Pyside6

        谈到Qt,大家最熟悉的莫过于C++中的Qt了,当然,今天我们在Python中常用的两个Qt库其本身也是C++中Qt的API,运行时需要调用自身的一些dll文件。这里我给大家介绍一下PyQt5与PySide6这两个库的区别。

对比项​​PyQt5​​PySide6​
​开发公司​Riverbank ComputingQt 官方 (The Qt Company)
​许可证​GPL 或商业许可证LGPL 或商业许可证
​Python 绑定​由 Riverbank 维护由 Qt 官方维护
​Qt 版本支持​Qt 5Qt 6
​API 兼容性​与 Qt5 完全兼容与 Qt6 完全兼容
​模块命名​PyQt5.QtCorePyQt5.QtWidgetsPySide6.QtCorePySide6.QtWidgets
​信号与槽语法​pyqtSignalpyqtSlotSignalSlot
​多线程支持​支持支持
​文档与社区​文档丰富,社区活跃官方文档完善,社区逐渐增长
​商业支持​需购买商业许可证可直接闭源商用
​安装方式​pip install PyQt5pip install PySide6
​性能​相近相近
​与 C++ Qt 兼容性​
​未来维护​仍活跃,但主要支持 Qt5Qt 官方维护,未来更倾向 Qt6

        总而言之,Pyside6的LGPL证书允许闭源(LGPL指不修改其dll文件中的底层代码基础上允许闭源),且对于Qt6的支持更先进,大家熟知的Spyder IDE就是基于Pyqt5开发,目前正在逐步完善支持Pyside6。

Spyder部分源码 

Pyside 获取方式

pip install PySide6

 QtWebEngine

        QtWebEngine是Qt提供的一个模块,它基于Chromium项目,允许开发者在他们的应用程序中需通过浏览器便可嵌入网页内容,通过结合Pyside6和QtWebEngine,开发者可以轻松地创建具有现代网页浏览功能的桌面应用程序。

        这里我们以嵌入东方财经网的股票指数为例:

思路分析

A股目前最常用的13个股指分别是:

        {'上证指数':'000001','深证成指':'399001','创业板指':'399006',
        '科创50':'000688','中证A50':'930050','中证A500':'000510','沪深300':'000300',
        '中证500':'399905','中证800':'000906','中证1000':'000852','中证2000':'932000',
        '上证50':'000016','北证50':'899050'}

这些股指在东方财富网中,除了中证2000与中证A50外Url都是固定的格式:

"https://quote.eastmoney.com/zs指数股票代码.html#fullScreenChart"

 中证2000与中证A50的Url略有不同:

"https://quote.eastmoney.com/zz/2.指数股票代码.html#fullScreenChart"

https://quote.eastmoney.com/zs000001.html#fullScreenCharthttps://quote.eastmoney.com/zs000001.html#fullScreenChart

东方财富网上证指数 

 接下来,我们要做的便是根据给定的股指名称将其转换为Url

indexName_to_code={'上证指数':'000001','深证成指':'399001','创业板指':'399006',
        '科创50':'000688','中证A50':'930050','中证A500':'000510','沪深300':'000300',
        '中证500':'399905','中证800':'000906','中证1000':'000852','中证2000':'932000',
        '上证50':'000016','北证50':'899050'}
        
if indexName=='中证A50' or indexName=='中证2000':
    url=f"https://quote.eastmoney.com/zz/2.{indexName_to_code[indexName]}.html#fullScreenChart"
else:
    url=f"https://quote.eastmoney.com/zs{indexName_to_code[indexName]}.html#fullScr

Webbrowser类定义

        接着我们来使用QTwebengine来自定义一个Webbrowser类:

import sys
import os
from PySide6.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget
from PySide6.QtWebEngineWidgets import QWebEngineView
from PySide6.QtCore import QUrl

class WebBrowser(QMainWindow):
    def __init__(self,indexName):
        super().__init__()
        self.indexName=indexName
        indexName_to_code={'上证指数':'000001','深证成指':'399001','创业板指':'399006',
        '科创50':'000688','中证A50':'930050','中证A500':'000510','沪深300':'000300',
        '中证500':'399905','中证800':'000906','中证1000':'000852','中证2000':'932000',
        '上证50':'000016','北证50':'899050'}
        
        if indexName=='中证A50' or indexName=='中证2000':
            self.url=f"https://quote.eastmoney.com/zz/2.{indexName_to_code[self.indexName]}.html#fullScreenChart"
        else:
            self.url=f"https://quote.eastmoney.com/zs{indexName_to_code[self.indexName]}.html#fullScreenChart"
        self.setup_ui()
    def setup_ui(self):
        self.setWindowTitle(self.indexName)
        self.resize(1024,768)
        central_widget = QWidget()
        self.setCentralWidget(central_widget)
        layout=QVBoxLayout(central_widget)
        layout.setContentsMargins(0, 0, 0, 0)
        try:
            self.webview=QWebEngineView()
            layout.addWidget(self.webview)
            self.webview.setUrl(QUrl(self.url))
        except Exception:#如果没有GPU的话就#强制使用CPU渲染
            os.environ["QT_QUICK_BACKEND"] = "software"  
            os.environ["QTWEBENGINE_CHROMIUM_FLAGS"] = "--disable-gpu --disable-software-rasterizer"
            self.webview=QWebEngineView()
            layout.addWidget(self.webview)
            self.webview.setUrl(QUrl(self.url))
    
    def closeEvent(self, event):
        # 彻底释放资源
        self.webview.stop()
        self.webview.page().profile().clearHttpCache()
        self.webview.setPage(None)
        self.webview.deleteLater()
        QApplication.processEvents()  
        event.accept()

接着,我们需要按照规范的格式来启动Qt程序

def open_kline_window(index_name):
    if not QApplication.instance():
        qt_app=QApplication(sys.argv)
    # 创建并显示K线窗口
    current_qt_window=WebBrowser(index_name)
    current_qt_window.show()
    qt_app.exec()

完整代码

import sys
import os
from PySide6.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget
from PySide6.QtWebEngineWidgets import QWebEngineView
from PySide6.QtCore import QUrl

class WebBrowser(QMainWindow):
    def __init__(self,indexName):
        super().__init__()
        self.indexName=indexName
        indexName_to_code={'上证指数':'000001','深证成指':'399001','创业板指':'399006',
        '科创50':'000688','中证A50':'930050','中证A500':'000510','沪深300':'000300',
        '中证500':'399905','中证800':'000906','中证1000':'000852','中证2000':'932000',
        '上证50':'000016','北证50':'899050'}
        
        if indexName=='中证A50' or indexName=='中证2000':
            self.url=f"https://quote.eastmoney.com/zz/2.{indexName_to_code[self.indexName]}.html#fullScreenChart"
        else:
            self.url=f"https://quote.eastmoney.com/zs{indexName_to_code[self.indexName]}.html#fullScreenChart"
        self.setup_ui()
    def setup_ui(self):
        self.setWindowTitle(self.indexName)
        self.resize(1024,768)
        central_widget = QWidget()
        self.setCentralWidget(central_widget)
        layout=QVBoxLayout(central_widget)
        layout.setContentsMargins(0, 0, 0, 0)
        try:
            self.webview=QWebEngineView()
            layout.addWidget(self.webview)
            self.webview.setUrl(QUrl(self.url))
        except Exception:#如果没有GPU的话就#强制使用CPU渲染
            os.environ["QT_QUICK_BACKEND"] = "software"  
            os.environ["QTWEBENGINE_CHROMIUM_FLAGS"] = "--disable-gpu --disable-software-rasterizer"
            self.webview=QWebEngineView()
            layout.addWidget(self.webview)
            self.webview.setUrl(QUrl(self.url))
    
    def closeEvent(self, event):
        # 彻底释放资源
        self.webview.stop()
        self.webview.page().profile().clearHttpCache()
        self.webview.setPage(None)
        self.webview.deleteLater()
        QApplication.processEvents()  
        event.accept()

def open_kline_window(index_name):
    if not QApplication.instance():
        qt_app=QApplication(sys.argv)
    # 创建并显示K线窗口
    current_qt_window=WebBrowser(index_name)
    current_qt_window.show()
    qt_app.exec()
open_kline_window('上证指数')

运行结果

相关文章:

  • 【愚公系列】《Python网络爬虫从入门到精通》047-验证码识别(第三方验证码识别)
  • DeepSeek 助力 Vue3 开发:打造丝滑的日历(Calendar),日历_基础功能示例(CalendarView01_01)
  • 【ESP32-C6】Base on esptool commands to enable Flash Encryption and Secure Boot
  • 5G中的DU和CU的作用
  • 【C++篇】C++模板初阶:从泛型编程到函数模板与类模板的全面解析
  • 【closerAI ComfyUI】nunchaku加持下,FLUX四重控制万物迁移秒出图,晋升生产力工具,开源界福音!收藏学习
  • 如何打通虚拟化-容器环境并保障流量安全?SmartX VCCI 方案升级!
  • Google A2A协议,是为了战略性占领标准?
  • 【端到端】端到端自动驾驶依赖Occupancy进行运动规划?还是可以具有生成局部地图来规划?
  • 在新一代人工智能技术引领下的,相互联系、层层递进的明厨亮灶开源了
  • 加载js/mjs模块时服务器返回的 MIME 类型不对导致模块被拒绝执行
  • DataFrame操作(扩充)
  • 【数据结构】红黑树超详解 ---一篇通关红黑树原理(含源码解析+动态构建红黑树)
  • 用python实现了一个推箱子游戏的环境,后面准备以此为基础实现强化学习。
  • Linux 第二讲 --- 基础指令(二)
  • MySQL--基础知识点--81.1--存储过程 vs 存储函数
  • GPT - GPT(Generative Pre-trained Transformer)模型框架
  • 安宝特案例 | Fundació Puigvert 医院应用AR技术开创尿石症治疗新纪元
  • 【AI+Java学习】AI时代Spring AI学习路径
  • 【前端分享】JavaScript异步编程详解!
  • php做网站如何/怎么样拓展客户资源
  • 新疆生产建设兵团教育局网站/如何制作自己的网站教程
  • 动态网站开发教程 表单程序/淘宝关键词优化
  • 青海青海西宁网站建设/好看的网页设计作品
  • 商城网站建设协议/东莞精准网络营销推广
  • 潮州网站开发/湖南seo推广软件