Python中如何将基于Chromium引擎的CEF嵌入PyQT窗口显示?
PyQt5 自带的 webkit/webengine 好像默认不支持 javascript。。开发 PyQt 程序的话,因为有一部分系统是以前网页版操作的,就像是不是能内嵌个浏览器引擎之类的,那就直接能用了。。
还有请教一下,PyQT 用 Table Widget 操作本地 Sqlite3 数据库性能怎么样,有这方面经验的吗。。列( Column )在 10 个以内,每个界面显示和操作的是 1000 条数据( Row ),Sqlite3 总共数据条数是 10 万以内。。
Python中如何将基于Chromium引擎的CEF嵌入PyQT窗口显示?
9 回复
NW.js 欢迎你,直接网页版就可以了
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget
from PyQt5.QtCore import QTimer
import cefpython3 as cef
class CefWidget(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.browser = None
self.embed_browser()
def embed_browser(self):
# 设置CEF窗口句柄
window_info = cef.WindowInfo()
window_info.SetAsChild(int(self.winId()))
# 创建浏览器实例
self.browser = cef.CreateBrowserSync(
window_info,
url="https://www.baidu.com" # 初始加载页面
)
def closeEvent(self, event):
# 关闭时清理CEF资源
if self.browser:
self.browser.CloseBrowser()
self.browser = None
cef.Shutdown()
event.accept()
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("PyQt5 + CEF 嵌入式浏览器")
self.setGeometry(100, 100, 1024, 768)
# 创建主布局
central_widget = QWidget()
self.setCentralWidget(central_widget)
layout = QVBoxLayout(central_widget)
layout.setContentsMargins(0, 0, 0, 0)
# 添加CEF部件
self.cef_widget = CefWidget()
layout.addWidget(self.cef_widget)
# 初始化CEF
self.init_cef()
def init_cef(self):
# CEF初始化设置
settings = {
"multi_threaded_message_loop": False,
"external_message_pump": True,
"windowless_rendering_enabled": False
}
cef.Initialize(settings=settings)
# 定时器处理CEF消息循环
self.timer = QTimer()
self.timer.timeout.connect(self.cef_message_loop)
self.timer.start(10)
def cef_message_loop(self):
cef.MessageLoopWork()
def closeEvent(self, event):
# 停止定时器
self.timer.stop()
super().closeEvent(event)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())
核心要点:
- 窗口句柄传递:通过
SetAsChild(int(self.winId()))将PyQt窗口句柄传递给CEF - 消息循环集成:使用QTimer定时调用
cef.MessageLoopWork()处理CEF事件 - 资源管理:在关闭时正确清理CEF浏览器实例并调用
cef.Shutdown()
依赖安装:
pip install PyQt5 cefpython3
注意: CEFPython3需要对应版本的CEF二进制文件,首次运行会自动下载。
一句话建议:确保CEF消息循环与PyQt事件循环正确集成是关键。
pyqt 的支持 js 啊
PyQt5 的 webengine 默认已经开启 java scrpit 支持了的
你看一下是不是程序里面自己关掉了。
Qt 的 webengine 讲道理也是基于 Chromium 内核的。
table widget 支持只加载需要显示的数据,具体需要自己开发实现。
我搞过简单的 C++ CEF 项目,应该是可以实现的。最简单的话,就直接把 CEF 窗口嵌进主窗口里面。复杂点的弄离屏渲染,然后画到窗口上。
实测 pyqt5 的 webengine 默认支持 javascript
这个数据量 QTableWidget 控件还是刚得住的


