Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python PYQT5-如何使用PyQT(MVC)调用另一个屏幕_Python_Python 3.x_Qt_Pyqt_Pyqt5 - Fatal编程技术网

Python PYQT5-如何使用PyQT(MVC)调用另一个屏幕

Python PYQT5-如何使用PyQT(MVC)调用另一个屏幕,python,python-3.x,qt,pyqt,pyqt5,Python,Python 3.x,Qt,Pyqt,Pyqt5,伙计们 我正在与QTDesigner和PyQT5合作,我已经使用QTDesi创建了两个屏幕。一个登录表单和一个主表单。我正在尝试在登录屏幕之后调用主屏幕。但它不起作用。我看过很多教程,但没有一本对我有用 下面是一些代码: 为了调用登录屏幕,我在Controller上使用了以下类: class LoginController(QtWidgets.QDialog, Ui_Dialog): def __init__(self, parent=None): QtWidgets.Q

伙计们

我正在与QTDesigner和PyQT5合作,我已经使用QTDesi创建了两个屏幕。一个登录表单和一个主表单。我正在尝试在登录屏幕之后调用主屏幕。但它不起作用。我看过很多教程,但没有一本对我有用

下面是一些代码:

为了调用登录屏幕,我在Controller上使用了以下类:

class LoginController(QtWidgets.QDialog, Ui_Dialog):
    def __init__(self, parent=None):
        QtWidgets.QMainWindow.__init__(self, parent=parent)
        super().__init__(parent)
        self.setupUi(self)
        self.txtLogo.setPixmap(QtGui.QPixmap('../gui/img/icons/aperam.png'))
        self.action_performed()

    def action_performed(self):
        self.pushButton.clicked.connect(self.valid_login)

    def valid_login(self):
        user = self.txtUser.text()
        password = self.txtPassword.text()
        if model.validate_login(user, password):
            self.close()
            main = HomeScreen()
然后,要调用主屏幕,我使用以下命令:

class HomeScreen(Ui_Model):
    def __init__(self):
        super(HomeScreen, self).__init__()
        self.ui = Ui_Model()
        self.main = QtWidgets.QMainWindow()
        self.login_home_screen()

    def login_home_screen(self):
        self.ui.setupUi(self.main)
        self.main.show()
        self.ui.actionNovo.triggered.connect(self.user_screen_show)
        self.main.close()
但这对我不起作用。它只显示一个黑屏,然后关闭

从系统开始,我调用LoginScreen的代码如下:

cd = LoginController()



if __name__ == "__main__":
    import sys
    ui = LoginController()
    cd.show()
    sys.exit(app.exec_())

你能帮我吗?我试过阅读很多教程和文章,但都不起作用。我想在登录成功后调用另一个表单


谢谢

您的代码存在各种问题

主屏幕也应该从QMainWindow继承,而不仅仅是从Ui_模型继承; 您应该避免混合QWidget/uic创建样式; 如果同时调用super,则不应调用基类uuu init uuu; 您创建了一个主屏幕实例main,但随后该函数返回,这意味着该实例将立即被垃圾收集; 正在创建两个LoginController实例,但您只需要一个; 主屏幕随后显示并关闭,这没有多大意义; 如果在我指的是“执行的操作”和“登录主屏幕”屏幕时只运行其他函数,通常不需要创建其他函数,尤其是如果它们只执行可以包含在uuu init_uu;中的小任务; 对于您的情况,最简单的解决方案是为登录屏幕创建自定义信号,并将其连接到主屏幕窗口的显示功能

请注意,我不知道用户屏幕显示的功能;如果用于再次显示登录,则应使用类似的系统再次显示对话框

class LoginController(QtWidgets.QDialog, Ui_Dialog):
    loginSuccessful = QtCore.pyqtSignal()

    def __init__(self, parent=None):
        super(LoginController, self).__init__(parent)
        self.setupUi(self)
        self.txtLogo.setPixmap(QtGui.QPixmap('../gui/img/icons/aperam.png'))
        self.pushButton.clicked.connect(self.valid_login)

    def valid_login(self):
        user = self.txtUser.text()
        password = self.txtPassword.text()
        if model.validate_login(user, password):
            # login is valid, emit the signal
            self.loginSuccessful.emit()
            self.hide()


class HomeScreen(QtWidgets.QMainWindow, Ui_Model):
    newLogin = QtCore.pyqtSignal()

    def __init__(self):
        super(HomeScreen, self).__init__()
        self.setupUi(self)
        self.actionNovo.triggered.connect(self.user_screen_show)

    def user_screen_show(self):
        self.newLogin.emit()
        self.hide()


if __name__ == "__main__":
    import sys
    cd = LoginController()
    cd.show()
    home = HomeScreen()
    cd.loginSuccessful.connect(home.show)
    home.newLogin.connect(cd.show)
    sys.exit(app.exec_())

您好,我已经按照您的建议包装了定制信号机,它工作得很好。就像你说的,我已经在代码中修复了07个bug。我假装在登录类中调用主屏幕,这可能是他不工作的原因。现在它的工作属性,我将使用相同的方法来改进系统的另一个屏幕。非常感谢你!在一个类中创建一个新的小部件实例并没有错,这只是一个类层次结构和编程逻辑的问题。由于垃圾收集,该对象是本地对象,并且由于它没有其他引用,因此在函数返回时会立即删除该对象,并且由于关闭调用,该对象不会工作。