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
相关产品推荐
相关产品推荐

