PyQt5 有错误 'MainWindow' 没有属性 'exec_'

Posted

技术标签:

【中文标题】PyQt5 有错误 \'MainWindow\' 没有属性 \'exec_\'【英文标题】:PyQt5 has error 'MainWindow' has no attribute 'exec_'PyQt5 有错误 'MainWindow' 没有属性 'exec_' 【发布时间】:2021-03-09 23:00:17 【问题描述】:

我刚开始在课堂项目中使用 PyQT,但遇到了一些问题。

我想启动 MainWindow 并有 2 个按钮来启动 2 个单独的对话框(对话框和子对话框);但是我收到以下错误:

        sys.exit(mainwindowa.exec_())
AttributeError: 'MainWindow' object has no attribute 'exec_'

这是我的代码。我已经尝试过如何编写 exec_ 函数,就像在 MainWindow 类中编写它一样,但我得到了同样的错误,我很困惑该怎么做

from PyQt5.QtWidgets import (QApplication, QComboBox, QDialog,
                             QDialogButtonBox, QFormLayout, QGridLayout, QGroupBox, QHBoxLayout,
                             QLabel, QLineEdit, QMenu, QMenuBar, QPushButton, QSpinBox, QTextEdit,
                             QVBoxLayout, QMainWindow)

import sys


class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()

        self.setWindowTitle("My App")
        layout = QVBoxLayout()
        self.mainwindowapp = QPushButton('Dialog')
        self.subwindowapp = QPushButton('CustomDialog')
        layout.addWidget(self.mainwindowapp)
        layout.addWidget(self.subwindowapp)
        self.setLayout(layout)
        self.show()
        self.mainwindowapp.clicked.connect(self.button_clicked)

    def button_clicked(self):

        run = Dialog()
        run()
class Dialog(QDialog):

    def __init__(self):
        super(Dialog, self).__init__()
        

        mainLayout = QVBoxLayout()
        mainLayout.addWidget(self.formGroupBox)
        mainLayout.addWidget(buttonBox)
        self.setLayout(mainLayout)

class CustomDialog(QDialog):
    def __init__(self):
        super().__init__(CustomDialog, self)

       

        self.layout = QVBoxLayout()
        self.layout.addWidget(QLabel('e'))
        
        self.setLayout(self.layout)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    mainwindowa = MainWindow()
    sys.exit(mainwindowa.exec_())

【问题讨论】:

【参考方案1】:

你得出了一个错误的结论,你认为如果 QDialog 类有一个 exec_() 方法,那么 QMainWindow 等其他小部件也会有,这是不正确的。 QDialog 创建一个其他小部件没有的内部事件循环,因此在您的情况下使用 show() 方法并使用 QApplication 的 exec_() 方法:

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

【讨论】:

好的,谢谢您的回答!它对我有用,感谢您的所有帮助!

以上是关于PyQt5 有错误 'MainWindow' 没有属性 'exec_'的主要内容,如果未能解决你的问题,请参考以下文章

Python PyQt5 对话框元素仅显示 exec_ 而没有显示

必须在 QWidget Pyqt5 之前构造 QApp

PyQt5 - 即使使用 QThread,MainWindow 中的 QMovie 也无法播放

[pyqt5][python][原创]pyqt5登陆界面跳转并关闭子窗口全部退出

如何在 PyQt5 / PySide2 中从一个类访问属性到另一个类

PyQt5 窗口间切换