关于pyqt5中的WebEngineView点击链接打开新页面问题

最近使用pyqt5制作了一个浏览器抓取截图的小工具,很感兴趣就拿来研究了以下,遇到一些坑记录以下:

代码在最后

1、首先是python的pip可执行文件在python的安装目录的Scripts这个子目录里面,使用的话只能是在CMD当中使用。在python中执行就会提示找不到,在PyDev console也是这样。

        如果CMD中提示不是内部或外部命令... 就需要配置环境变量到电脑中,就是在path中添加一条指向Python\Python38\Scripts的变量,之后重启CMD就可以了。

2、python版本问题,搜罗了好久

Note that for v5.11 and later the 32-bit Windows wheels do not contain
the WebEngine modules.

翻译:请注意,对于v5.11及更高版本,32位Windows轮盘不包含WebEngine模块。

解决:
【方法一】 指定安装5.10.1版本的pyqt5

pip install pyqt5==5.10.1

【方法二】 单独安装WebEngine,安装命令为:

pip install PyQtWebEngine

解决 No module named 'PyQt5.QtWebEngineWidgets'

 我使用的版本是,可以作为参考

 3、然后出现有的链接可以点进去,有的点击完没反应

原因:这是因为网页中部分链接是在新标签页中打开的,而这中js请求在QtWebEngineView中会调用creatwiondow这个方法

 只要重写这个方法,实现自己的逻辑就可以了,我看到了常见做法是添加tab页面,还有一种是直接在本窗口新建tab,代码如下:

# -*- coding: utf-8 -*-
# @Author: liyl
# @Date  :  2020/08/01

import sys

from PyQt5 import QtCore
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWebEngineWidgets import QWebEngineView


# 创建主窗口
from main import WebEngineView


class MainWindow(QMainWindow):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        # 设置窗口标题
        self.setWindowTitle('浏览器')
        # 设置窗口大小900*600
        self.resize(1300, 700)
        self.show()

        # 当前view加载地址

        self.webview = WebEngineView(self)
        self.webview.setUrl(QUrl("http://www.baidu.com"))
        self.setCentralWidget(self.webview)

        # 使用QToolBar创建导航栏,并使用QAction创建按钮
        # 添加导航栏
        navigation_bar = QToolBar('Navigation')
        # 设定图标的大小
        navigation_bar.setIconSize(QSize(16, 16))
        # 添加导航栏到窗口中
        self.addToolBar(navigation_bar)

        # 添加URL地址栏
        self.urlbar = QLineEdit()
        # 让地址栏能响应回车按键信号
        self.urlbar.returnPressed.connect(self.navigate_to_url)
        navigation_bar.addSeparator()
        navigation_bar.addWidget(self.urlbar)

        # 让浏览器相应url地址的变化
        self.webview.urlChanged.connect(self.renew_urlbar)

    # 显示地址
    def navigate_to_url(self):
        q = QUrl(self.urlbar.text())
        if q.scheme() == '':
            q.setScheme('http')

        self.webview.setUrl(q)

    # 响应输入的地址
    def renew_urlbar(self, q):
        # 将当前网页的链接更新到地址栏
        self.urlbar.setText(q.toString())
        self.urlbar.setCursorPosition(0)

# 第一种,是直接在本窗口新建tab的方式。 (不推荐使用这种方式)
# 注:这种方式有个问题,因为新建的tab覆盖了原来的tab,所以,原来tab的所有信息都找不到了,如浏览,账号,密码等。
class WebEngineView(QWebEngineView):
  # 重写createwindow()
  def createWindow(self, QWebEnginePage_WebWindowType):
    return self

# 第二种,就是新建窗口
# class WebEngineView(QWebEngineView):
#     windowList = []
#
#     # 重写createwindow()
#     def createWindow(self, QWebEnginePage_WebWindowType):
#         new_webview = WebEngineView()
#         new_window = MainWindow()
#         new_window.setCentralWidget(new_webview)
#         # new_window.show()
#         self.windowList.append(new_window)  # 注:没有这句会崩溃!!!
#         return new_webview

# 程序入口
if __name__ == "__main__":
    app = QApplication(sys.argv)
    # 创建主窗口
    browser = MainWindow()
    browser.show()
    # 运行应用,并监听事件
    sys.exit(app.exec_())

参考原文链接:

QT:QWebEngineView里面的页面链接点击无反应的解决方法

QWebEngineView点击链接不起作用

利用Python和PyQt5实现简易浏览器

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用cv2和PyQt5来实现这个功能。具体的实现步骤如下: 1.使用cv2库打开摄像头并读取视频帧。 2.使用QTimer来定时更新显示视频帧的label。 3.使用Qt的信号与槽机制将定时器的timeout信号连接到更新label的槽函数。 4.在槽函数,将读取到的视频帧转换为Qt的QImage格式,并在label显示。 下面是一个示例代码: ```python import cv2 from PyQt5.QtCore import QTimer from PyQt5.QtGui import QImage, QPixmap from PyQt5.QtWidgets import QLabel, QMainWindow, QApplication, QPushButton class MainWindow(QMainWindow): def __init__(self): super().__init__() # 创建一个label用于显示视频帧 self.label = QLabel(self) self.label.resize(640, 480) self.label.move(20, 60) # 创建一个按钮用于打开摄像头 self.button = QPushButton('Open Camera', self) self.button.resize(100, 30) self.button.move(20, 20) self.button.clicked.connect(self.start_camera) # 创建一个定时器,用于定时更新label的视频帧 self.timer = QTimer() self.timer.timeout.connect(self.update_frame) def start_camera(self): # 打开摄像头 self.cap = cv2.VideoCapture(0) self.cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640) self.cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480) # 启动定时器 self.timer.start(30) def update_frame(self): # 读取视频帧 ret, frame = self.cap.read() # 将视频帧转换为QImage格式 image = QImage(frame, frame.shape[1], frame.shape[0], QImage.Format_RGB888).rgbSwapped() # 在label显示视频帧 self.label.setPixmap(QPixmap.fromImage(image)) def closeEvent(self, event): # 关闭窗口时释放摄像头资源 if hasattr(self, 'cap'): self.cap.release() event.accept() if __name__ == '__main__': app = QApplication([]) window = MainWindow() window.show() app.exec_() ``` 运行程序后,点击“Open Camera”按钮即可打开摄像头并在label显示视频帧。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值