PySide6/Qt6在macOS下最大化窗口后点击按钮崩溃求助
PySide6.4最大化窗口后点击按钮触发段错误解决方案
问题现象
- PySide6.3版本下程序运行正常
- PySide6.4版本下,程序默认状态运行无问题,但先最大化窗口再点击按钮会触发段错误(segfault)
运行环境
- Python 3.9
- macOS Monterey
测试代码
import PySide6 as qt import PySide6.QtWidgets as qtw import PySide6.QtWebEngineWidgets as qtweb app = qtw.QApplication([]) def showWeb(): stack.setCurrentWidget(web) web.setUrl("https://en.wikipedia.org") button = qtw.QPushButton(qt.__version__) button.clicked.connect(showWeb) web = qtweb.QWebEngineView() stack = qtw.QStackedWidget() stack.layout().addWidget(qtw.QWidget()) stack.layout().addWidget(web) window = qtw.QWidget() window.setLayout(qtw.QVBoxLayout()) window.layout().addWidget(button) window.layout().addWidget(stack) window.resize(400, 400) window.show() app.exec()
终端错误信息
zsh: segmentation fault python3 segfault.py [... my command prompt ...] % [67231:259:1105/160207.214403:ERROR:mach_port_rendezvous.cc(310)] bootstrap_look_up org.chromium.Chromium.MachPortRendezvousServer.1: Permission denied (1100) [67231:259:1105/160207.214737:ERROR:child_thread_impl.cc(226)] Mach rendezvous failed, terminating process (parent died?)
解决方案
1. 使用QStackedWidget自带的addWidget方法(推荐)
原代码直接操作QStackedWidget的内部布局,会破坏其私有状态管理,窗口最大化后的尺寸重绘会和WebEngine进程产生冲突。修改为使用QStackedWidget专门的addWidget方法:
import PySide6 as qt import PySide6.QtWidgets as qtw import PySide6.QtWebEngineWidgets as qtweb app = qtw.QApplication([]) def showWeb(): stack.setCurrentWidget(web) web.setUrl("https://en.wikipedia.org") button = qtw.QPushButton(qt.__version__) button.clicked.connect(showWeb) web = qtweb.QWebEngineView() stack = qtw.QStackedWidget() # 替换原layout().addWidget为stack.addWidget stack.addWidget(qtw.QWidget()) stack.addWidget(web) window = qtw.QWidget() window.setLayout(qtw.QVBoxLayout()) window.layout().addWidget(button) window.layout().addWidget(stack) window.resize(400, 400) window.show() app.exec()
2. 延迟初始化WebEngineView
避免窗口初始化和尺寸变化时提前启动WebEngine渲染进程,改为点击按钮时再创建实例:
import PySide6 as qt import PySide6.QtWidgets as qtw import PySide6.QtWebEngineWidgets as qtweb app = qtw.QApplication([]) stack = qtw.QStackedWidget() stack.addWidget(qtw.QWidget()) def showWeb(): # 仅首次点击时创建WebView if stack.count() < 2: web = qtweb.QWebEngineView() stack.addWidget(web) web = stack.widget(1) stack.setCurrentWidget(web) web.setUrl("https://en.wikipedia.org") button = qtw.QPushButton(qt.__version__) button.clicked.connect(showWeb) window = qtw.QWidget() window.setLayout(qtw.QVBoxLayout()) window.layout().addWidget(button) window.layout().addWidget(stack) window.resize(400, 400) window.show() app.exec()
3. 调整PySide6版本
如果代码修改无效,可暂时降级到PySide6.3版本,或升级到PySide6.4.1及以上版本(官方可能已修复该macOS特定bug)。
内容的提问来源于stack exchange,提问作者Retired Writing Code for Fun
相关产品推荐
相关产品推荐

