PyQt5调用下一窗口隐藏当前窗口报无hide属性错误
报错根因
你遇到的核心报错如下:
Error due to 'Ui_Login_Dialog' object has no attribute 'hide'
触发原因可以归纳为两点:
- pyuic自动生成的
Ui_Login_Dialog、Ui_Registration这类Ui_*命名的类,是纯界面布局逻辑类,没有继承任何Qt窗口组件类,本身不具备hide()、show()、close()这类Qt窗口原生方法,只有把布局通过setupUi()挂载到真实的QDialog/QMainWindow/QWidget实例上之后,才能通过真实窗口实例操作窗口状态。 - 代码中直接写
MainWindow.hide()属于用类名直接调用实例方法,没有指向实际运行的登录窗口实例;如果代码中误把Ui_Login_Dialog的实例对象赋值给了MainWindow变量,就会刚好触发你看到的「找不到hide属性」报错。
修复方案
修正后的参考代码
def openwindow(self): try: # 实例化注册页的真实QDialog窗口载体 self.reg_window = QtWidgets.QDialog() self.reg_ui = Registration.Ui_Registration() self.reg_ui.setupUi(self.reg_window) # 隐藏当前已打开的登录窗口实例,不要操作Ui布局类、不要直接用类名调用 self.hide() # 展示注册窗口,操作的是真实QDialog实例,不是Ui布局对象 self.reg_window.show() except Exception as e: print("Error!", f"Error due to {str(e)}")
关键注意事项
- 所有窗口的显示、隐藏、关闭操作,只能作用在继承自QWidget/QDialog/QMainWindow的真实窗口实例上,禁止对
Ui_*布局类实例调用这类窗口方法。 - 不要直接用窗口类名(比如代码里写的
MainWindow)调用实例方法,必须指向实际运行的窗口对象。如果openwindow方法是写在登录窗口的自定义业务类中,类内部的self就指代当前显示的登录窗口实例,直接调用self.hide()即可。 - 新窗口的实例属性建议加业务前缀命名(比如
self.reg_window指代注册窗口),不要用self.window这类通用名,避免属性覆盖导致的对象引用错误。
内容的提问来源于stack exchange,提问作者naratik
相关产品推荐
相关产品推荐

