山野万里__ 2024-01-12 17:58 采纳率: 50%
浏览 50

在使用PyQt在主窗口中加载其他窗口出现问题。

在使用PyQt在主窗口中加载其他窗口出现问题。
以下是我的程序,报错如下:
MainWindow.setCentralWidget(self.centralwidget)
AttributeError: 'ChildrenForm' object has no attribute 'setCentralWidget'
报错是在class ChildrenForm中,调用的QWidget没有'setCentralWidget'方法,而QMainWindow类中才有,可是我写的这个类就是加载的其他窗口,请问有什么办法可以解决吗?

# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import QApplication,QMainWindow,QWidget,QFileDialog
from QtWindow2 import Ui_MainWindow
from ChildrenForm2 import Ui_ChildrenForm

class MainForm(QMainWindow,Ui_MainWindow):
    def __init__(self):
        super(MainForm,self).__init__()
        self.setupUi(self)

        # self.child = ChildrenForm() 生成子窗口实例self.child
        self.child = ChildrenForm()

        # 菜单的点击事件,当点击关闭菜单时连接槽函数 close()
        self.fileCloseAction.triggered.connect(self.close)
        # 菜单的点击事件,当点击打开菜单时连接槽函数 openMsg()
        self.fileOpenAction_2.triggered.connect(self.openMsg)

        # 单击actionTst,子窗口就会显示在主窗口的MaingridLayout中
        self.addWinaction.triggered.connect(self.childShow)

    def childShow(self):
        # 添加子窗口
        self.MaingridLayout.addWidget(self.child)
        self.child.show()

    def openMsg(self):
        file,ok = QFileDialog.getOpenFileName(self,"打开","C:/","All Files(*);;Text Files(*.txt)")
        # 在状态栏显示文件地址
        self.statusbar.showMessage(file)
class ChildrenForm(QWidget, Ui_ChildrenForm):
    def __init__(self):
        super(ChildrenForm, self).__init__()
        self.setupUi(self)



if __name__ == '__main__':
    app = QApplication(sys.argv)
    win = MainForm()
    win.show()
    sys.exit(app.exec())

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2024-01-12 20:26
    关注

    【以下回答由 GPT 生成】

    在PyQt中,setCentralWidget方法是QMainWindow类的特有方法,而QWidget类没有该方法。如果想要在子窗口中加载一个中心控件,可以考虑将子窗口设置为QMainWindow类型,然后再在子窗口中加载其他控件。

    以下是修改后的代码示例:

    import sys
    from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QFileDialog
    from QtWindow2 import Ui_MainWindow
    from ChildrenForm2 import Ui_ChildrenForm
    
    class MainForm(QMainWindow, Ui_MainWindow):
        def __init__(self):
            super(MainForm, self).__init__()
            self.setupUi(self)
    
            # 生成子窗口实例self.child
            self.child = ChildrenForm()
            self.setCentralWidget(self.child)
    
            # 关闭菜单的点击事件连接槽函数 close()
            self.fileCloseAction.triggered.connect(self.close)
            # 打开菜单的点击事件连接槽函数 openMsg()
            self.fileOpenAction_2.triggered.connect(self.openMsg)
    
        def openMsg(self):
            file,ok = QFileDialog.getOpenFileName(self, "打开", "C:/", "All Files(*);;Text Files(*.txt)")
            # 在状态栏显示文件地址
            self.statusbar.showMessage(file)
    
    class ChildrenForm(QMainWindow, Ui_ChildrenForm):
        def __init__(self):
            super(ChildrenForm, self).__init__()
            self.setupUi(self)
    
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        win = MainForm()
        win.show()
        sys.exit(app.exec())
    

    在修改后的代码中,将ChildrenForm修改为QMainWindow类型,并在MainForm的构造函数中使用setCentralWidget方法将子窗口设置为中心控件。这样就可以在主窗口中加载子窗口并显示出来了。



    【相关推荐】



    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 1月12日