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

PyQt5设置QHeaderView列宽模式导致弹窗无法打开的问题

问题解决:PyQt5弹窗因QTableWidget列宽设置无法打开

问题原因

你的代码里有两个关键问题,直接导致弹窗初始化失败:

  • 错误覆盖键盘事件方法:把QShortcut对象直接赋值给self.keyPressEvent,覆盖了QWidget原生的键盘事件处理逻辑,引发内部事件混乱。
  • 列索引越界报错:执行self.table.selectColumn(1)时,表格还没设置列数(setHorizontalHeaderLabels是后面才执行的),此时表格列数为0,索引1根本不存在,触发的报错直接中断了弹窗的初始化流程。

修复后的代码

from PyQt5.QtWidgets import *   
import sys
from PyQt5.QtGui import QKeySequence

class MainWindow(QStackedWidget):
    class CustomRemovePopup(QWidget):
        def __init__(self, parent:'MainWindow', e=None) -> None:
            super().__init__()
            self.p = parent
            self.setWindowTitle("Remove A Card From Study Set")
            self.setGeometry(200, 200, 400, 400)
            self.layou = QBoxLayout(QBoxLayout.TopToBottom)
            self.layou.setObjectName("Remove Cards From Study Set")
            self.setLayout(self.layou)
            
            # 修复快捷键:用信号绑定替代覆盖事件方法
            self.enter_shortcut = QShortcut(QKeySequence("Return"), self)
            self.enter_shortcut.activated.connect(self.on_enter_pressed)
            
            self.table = QTableWidget()
            self.table.setEditTriggers(QTableWidget.NoEditTriggers)
            # 先设置表头生成列,再执行列选择
            self.table.setHorizontalHeaderLabels(["Term","Definition"])
            self.table.selectColumn(1)
            
            header = self.table.horizontalHeader()
            header.setSectionResizeMode(0, QHeaderView.ResizeMode.ResizeToContents)
            header.setSectionResizeMode(1, QHeaderView.ResizeMode.ResizeToContents)
            
            self.layou.addWidget(self.table)
        
        def on_enter_pressed(self):
            # 这里添加回车键触发的业务逻辑
            pass

    def showCustomPopup(self, e=None):
        self.customPopup = self.CustomRemovePopup(parent=self)
        self.customPopup.show()

    def __init__(self):
        super().__init__() 
        self.setWindowTitle("Testing")
        self.wid = QWidget()
        self.layout = QBoxLayout(QBoxLayout.TopToBottom)
        self.wid.setLayout(self.layout)
        self.btn = QPushButton("Click Me")
        self.btn.clicked.connect(self.showCustomPopup)
        self.layout.addWidget(self.btn)
        self.addWidget(self.wid)
        self.setCurrentWidget(self.wid)

if __name__ =="__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

关键修复点

  • 移除对self.keyPressEvent的错误赋值,改用QShortcut的activated信号绑定自定义槽函数处理回车键逻辑。
  • 调整代码顺序:先调用setHorizontalHeaderLabels生成表格列,再执行selectColumn(1),避免索引越界。

内容的提问来源于stack exchange,提问作者user19926715

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 20:03:13