You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 13:50:26