我有一个使用 PyQt-5.5.1 的工作脚本,我现在想将其移植到新的 PyQt 版本(5.7)。调整大部分内容都很好,但我遇到了两个主要问题:(1)执行(模拟)鼠标点击,(2)访问(比如说:打印)当前显示的网页的 html 源代码分别是 QWebView 或 QWebEngineView。
例如,我可以在 PyQt-5.5.1 中使用 QWebView 执行以下操作:
QTest.mouseClick(self.wvTest, Qt.LeftButton, QPoint(x, y))
和
frame = self.wvTest.page().mainFrame()
print(frame.toHtml().encode('utf-8'))
我知道有关移植到 QWebEngineView 但无法将 C++ 表示法转换为工作 Python 代码的文档以及此页面。
我怎样才能使它适应 PyQt-5.7 中的 QWebEngineView?以下是 PyQt-5.5.1 的完整工作片段,对于新的 PyQt 版本失败:
- 对于 Button1:完全没有鼠标点击反应。
- 对于 Button2:
AttributeError: 'QWebEnginePage' object has no attribute 'mainFrame'
,当我删除 mainframe(): 时TypeError: toHtml(self, Callable[..., None]): not enough arguments
。
导入系统 从 PyQt5.QtWidgets 导入 QWidget、QPushButton、QApplication 从 PyQt5.QtCore 导入 QRect、Qt、QUrl、QPoint、QEvent 从 PyQt5.QtTest 导入 QTest 从 PyQt5.Qt 导入 PYQT_VERSION_STR如果 PYQT_VERSION_STR=='5.5.1':从 PyQt5 导入 QtWebKitWidgets 否则:从 PyQt5 导入 QtWebEngineWidgets
class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.button1 = QPushButton('Button1', self) self.button1.clicked.connect(self.buttonOne) self.button1.setGeometry(QRect(10, 10, 90, 20)) self.button2 = QPushButton('Button2', self) self.button2.clicked.connect(self.buttonTwo) self.button2.setGeometry(QRect(110, 10, 90, 20)) if PYQT_VERSION_STR=='5.5.1': self.wvTest = QtWebKitWidgets.QWebView(self) else: self.wvTest = QtWebEngineWidgets.QWebEngineView(self) self.wvTest.setGeometry(QRect(10, 40, 430, 550)) self.wvTest.setUrl(QUrl('http://www.startpage.com')) self.wvTest.setObjectName('wvTest') self.setGeometry(300, 300, 450, 600) self.setWindowTitle('WebView minimalistic') self.show() def buttonOne(self): qp = QPoint(38, 314) QTest.mouseClick(self.wvTest, Qt.LeftButton, pos=qp) # or: QTest.mouseMove(self.wvTest, pos=self.qp) print('Button1 pressed.') def buttonTwo(self): frame = self.wvTest.page().mainFrame() print(frame.toHtml().encode('utf-8')) if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())