Python TypeError:QWebEngineView(父:QWidget=None):参数1具有意外的类型';PySide2.qtwidts.QFrame';

Python TypeError:QWebEngineView(父:QWidget=None):参数1具有意外的类型';PySide2.qtwidts.QFrame';,python,pyqt5,Python,Pyqt5,我目前正在尝试使用升级的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, Q

我目前正在尝试使用升级的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语句中进行嵌入。

尽管与Qt的绑定几乎相同,但PyQt和PySide决不能一起使用。当尝试将使用绑定创建的小部件与使用其他绑定创建的小部件重新绑定时,大多数问题都会出现,就像在您的案例中一样

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

使用uic工具生成的文件时(
pyuic
用于PyQt,
pyside2 uic
用于PySide),必须使用相关绑定。如果使用了
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
使用上述导入语句,结果是
qtwidts.QMainWindow
将来自PyQt5,而
QMainWindow
将来自PySide2(对于这些子模块的所有其他类都是如此)。
即使忽略这两个模块永远不应该一起使用这一事实,从不同模块导入相同的类名也是一个严重的语义问题,这肯定会导致bug

通常最好使用一致的导入样式(至少在从同一主模块导入时)。以以下几行为例:

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中,它通常是显式的(参见),每个规则都有它的例外,并且在像QT这样的非常大的模块的情况下,它会变得非常不舒服,因为有一个不断增长的显式导入列表,也考虑到在生产过程中一些类可能会被闲置,但仍然是不必要的进口,因为它们从未从进口中移除


由于加载期间的性能差异通常可以忽略不计,因此使用子模块导入通常更可取(而不是显式或通配符导入):它避免了可能非常长的导入语句(如显式导入语句所示),它还可以从类所加载的子模块中更清楚地看到。

为什么同时使用PyQt和PySide?即使它们做几乎相同的事情,这些绑定也不应该一起使用。您可以使用PyQt或PySide。@MusicCamante那么我应该使用什么来实现我的目标呢?说到PyQt,我真的是个新手,而且我还在学习。正如前面所说的,你可以使用PyQt或PySide。它们几乎是一样的(除了许可证问题,还有一些细微的差别,通常只有在高级使用时才重要)。如果要使用PySide2,请删除与PyQt5相关的导入,否则将任何PySide2导入更改为PyQt5。需要记住的重要一点是,您还需要使用正确的uic工具从ui文件构建python代码:对于PySide,它是pyside2 uic,对于PyQt5,它是pyuic。@在您的情况下,最简单的选择是将pyside2更改为PyQt5,因为您使用uic。