TypeError: QWebEngineView(parent: QWidget = None): 参数 1 有意外类型'PySide2.QtWidgets.QFrame'

Posted

技术标签:

【中文标题】TypeError: QWebEngineView(parent: QWidget = None): 参数 1 有意外类型\'PySide2.QtWidgets.QFrame\'【英文标题】:TypeError: QWebEngineView(parent: QWidget = None): argument 1 has unexpected type 'PySide2.QtWidgets.QFrame'TypeError: QWebEngineView(parent: QWidget = None): 参数 1 有意外类型'PySide2.QtWidgets.QFrame' 【发布时间】:2021-01-01 16:32:22 【问题描述】:

我目前正在尝试使用提升的 QtWidget 在我的 PyQT5 脚本中嵌入 QtWebEngine,但我无法使其正常工作。

这是我的代码:

import sys
import os
import platform
from PySide2 import QtCore, QtGui, QtWidgets
from PySide2.QtCore import (QCoreApplication, QPropertyAnimation, QDate, QDateTime, QMetaObject, QObject, QPoint, QRect, QSize, QTime, QUrl, Qt, QEvent)
from PySide2.QtGui import (QBrush, QColor, QConicalGradient, QCursor, QFont, QFontDatabase, QIcon, QKeySequence, QLinearGradient, QPalette, QPainter, QPixmap, QRadialGradient)
from PySide2.QtWidgets import *
from PyQt5 import QtCore, QtWidgets, QtWebEngineWidgets, uic

# UI File
from harvester_ui import Window
from ui_functions import * 


class Window(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        self.ui = Window()
        self.ui.setupUi(self)


        self.setWindowFlag(QtCore.Qt.FramelessWindowHint)
        self.setAttribute(QtCore.Qt.WA_TranslucentBackground)
        
        self.ui.minimize.clicked.connect(lambda: self.showMinimized())
        self.ui.close.clicked.connect(app.exit)
        
        def moveWindow(w): 
            if w.buttons() == Qt.LeftButton:  
                self.move(self.pos() + w.globalPos() - self.clickPosition)
                self.clickPosition = w.globalPos()
                w.accept()

        self.ui.label.mouseMoveEvent = moveWindow

        self.show()

    def mousePressEvent(self, event):
        self.clickPosition = event.globalPos()

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    window = Window()
    sys.exit(app.exec_())

如果我尝试执行此代码,则会收到标题中显示的错误。

如果我用这些替换最后几行,它会正常工作,但它不会像我想要的那样运行,因为我的更改存储在类中。

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    path_ui = os.path.join(os.path.dirname(__file__), "window.ui")
    window = uic.loadUi(path_ui)
    window.browser.load(QtCore.QUrl("https://google.com/"))
    window.show()
    sys.exit(app.exec_())

我的目标是能够直接从我正在使用的类中嵌入浏览器实例,而不是在 if 语句中进行。

【问题讨论】:

你为什么同时使用 PyQt PySide?即使他们做几乎相同的事情,这些绑定也不应该永远一起使用。您可以使用 PyQt 或 PySide。 @musicamante 那我应该用什么来达到我的目标?说到 PyQt,我真的很陌生,我还在学习它。 如前所述,您使用 PyQt PySide。它们几乎相同(除了许可证问题,还有一些通常仅对高级使用很重要的细微差别)。如果要使用 PySide2,请删除与 PyQt5 相关的导入,否则将任何 PySide2 导入更改为 PyQt5。要记住的重要一点是,您还需要使用正确的 uic 工具从 ui 文件构建 python 代码:对于 PySide,它是 pyside2-uic,对于 PyQt5,它是 pyuic。 @dharmey 在您的情况下,最简单的选择是将 PySide2 更改为 PyQt5,因为您使用 uic。 【参考方案1】:

尽管与 Qt 的绑定几乎相同,但 PyQt 和 PySide 应该永远一起使用。当尝试将使用绑定创建的小部件重新设置为使用另一个绑定创建的小部件时,大多数问题都会出现,就像您的情况一样。

解决方案很简单:您可以使用 PyQt5 PySide2。

使用 uic 工具生成的文件(PyQt 为pyuic,PySide 为pyside2-uic)时,必须使用相关绑定。如果使用了pyuic(即 PyQt 工具),那么导入必须使用 PyQt5;如果文件是使用pyside2-uic 生成的,则必须使用 PySide2。

您在导入时也应该更加小心,因为不同“级别”的导入可能会导致混淆。

例如,在您的情况下,以下行将导致从 PySide 导入 QtWidgets.QMainWindow

from PySide2 import QtCore, QtGui, QtWidgets

以下使QMainWindow 也使用 PySide 版本:

from PySide2.QtWidgets import *

这将覆盖第一次导入,这将使QtWidgets.QMainWindow 改用 PyQt 版本:

from PyQt5 import QtCore, QtWidgets, QtWebEngineWidgets, uic

使用上述导入语句,结果是 QtWidgets.QMainWindow 将来自 PyQt5,而 QMainWindow 将来自 PySide2(对于每个子模块的 all 其他类也是如此)。 即使忽略这两个模块不应该一起使用的事实,从不同模块导入相同的类名也是一个严重的语义问题,肯定会导致错误。

使用连贯的 导入样式(至少在从同一个主模块导入时)通常是更可取的。例如,以下几行:

from PySide2 import QtCore, QtGui, QtWidgets
from PySide2.QtCore import (QCoreApplication, QPropertyAnimation, QDate, QDateTime, QMetaObject, QObject, QPoint, QRect, QSize, QTime, QUrl, Qt, QEvent)
from PySide2.QtGui import (QBrush, QColor, QConicalGradient, QCursor, QFont, QFontDatabase, QIcon, QKeySequence, QLinearGradient, QPalette, QPainter, QPixmap, QRadialGradient)
from PySide2.QtWidgets import *

它们是相关但不同的导入样式,但最重要的是显式导入(第二行和第三行)和最后一行的通配符导入使第一行几乎无用。 考虑到虽然在 python 中通常首选 explicit(参见Zen of Python),但每条规则都有其例外,对于像 Qt 这样非常大的模块,连续使用可能会变得非常不舒服不断增加的显式导入列表,同时考虑到在生产过程中某些类可能未被使用,但仍然不必要地导入,因为它们从未从导入中删除。

由于加载过程中的性能差异通常可以忽略不计,因此使用子模块导入通常是更可取的(而不是显式或通配符导入):它避免了可能非常长的导入语句(就像显式那样),而且它也更清楚从哪个子模块加载了一个类。

【讨论】:

以上是关于TypeError: QWebEngineView(parent: QWidget = None): 参数 1 有意外类型'PySide2.QtWidgets.QFrame'的主要内容,如果未能解决你的问题,请参考以下文章

QWebEngineView 无法运行

QWebEngineView:Mac OSX 上的异常行为

从 QWebEngineView 获取 PDF 文件的链接

QWebEngineView 在访问特定网站时崩溃

如何在 QWebEngineView 周围显示边框?

采用QWebEngineView引擎设计web浏览器