PyQt/PySide二级窗口按钮与LineEdit无响应问题求助
问题原因与修复方案
核心问题
你的二级窗口按钮无响应,根源是两个关键错误:
- 主窗口打开二级窗口时,未使用自定义的
ChiffrerWindow类,而是直接创建原生QMainWindow并手动初始化UI,导致自定义类里的槽函数绑定代码完全没执行。 ChiffrerWindow类内部错误地重新实例化了Ui_ChiffrerWindow,并且错误地通过这个新实例绑定槽函数,而非绑定到已经加载到窗口上的实际控件。
修复步骤
1. 修改mainwindow.py
导入自定义的ChiffrerWindow类,直接实例化它来打开二级窗口:
from ui_mainwindow import Ui_MainWindow from chiffrerwindow import ChiffrerWindow from PyQt5 import QtWidgets class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): def __init__(self, app): super().__init__() self.setupUi(self) self.actionChiffrer.triggered.connect(self.ouvrirChiffrer) def ouvrirChiffrer(self): # 直接实例化自定义窗口类,而非手动创建原生QMainWindow self.window = ChiffrerWindow(self) self.window.show()
注:移除了
MainWindow对Ui_ChiffrerWindow的继承,这完全没必要,主窗口只需要继承自身的UI类即可。
2. 修改chiffrerwindow.py
删除多余的Ui_ChiffrerWindow实例化,直接通过self访问控件并绑定槽函数:
from ui_chiffrerwindow import Ui_ChiffrerWindow from PyQt5 import QtWidgets, QFileDialog class ChiffrerWindow(QtWidgets.QMainWindow, Ui_ChiffrerWindow): def __init__(self, parent=None): super().__init__(parent) self.setupUi(self) # 执行此方法后,所有UI控件已成为self的属性 # 直接绑定self上的控件与槽函数 self.pushButtonFileDirCrypt.clicked.connect(self.getFileToEncrypt) self.pushButtonPubKeyCrypt.clicked.connect(self.getPubKeyToEncrypt) def getFileToEncrypt(self): fname = QFileDialog.getOpenFileName(self,"Open File","", "All Files (*);; Word Documents (*.docx)") if fname[0]: self.lineEditFileDirCrypt.setText(fname[0]) def getPubKeyToEncrypt(self): print("You want to get the keys to encrypt the file")
说明:
setupUi(self)执行后,所有UI控件都直接挂载在self上,无需再通过额外的self.ui实例访问。- 添加
parent参数可让二级窗口依附于主窗口,关闭主窗口时二级窗口也会自动关闭,更符合桌面应用逻辑。
3. 确保main.py初始化正确
示例main.py代码:
import sys from PyQt5 import QtWidgets from mainwindow import MainWindow if __name__ == "__main__": app = QtWidgets.QApplication(sys.argv) window = MainWindow(app) window.show() sys.exit(app.exec_())
验证
修改后重新运行程序:
- 点击主窗口的
Chiffrer动作打开二级窗口 - 点击
pushButtonFileDirCrypt会弹出文件选择对话框,选择文件后路径会显示在输入框中 - 点击
pushButtonPubKeyCrypt会在控制台打印指定内容
内容的提问来源于stack exchange,提问作者Ralda00
相关产品推荐
相关产品推荐

