Qt的问题如何打开它们之间调用的2个窗口

Posted

技术标签:

【中文标题】Qt的问题如何打开它们之间调用的2个窗口【英文标题】:Problems with Qt How to open 2 windows that are called between them 【发布时间】:2017-04-24 03:15:38 【问题描述】:

Qt 的问题 如何打开它们之间调用的 2 个窗口

大家好,我是 Qt 新手,我遇到的问题如下:

当我使用按钮调用时,我有一个Login.py 窗口打开一个新的Panel_administrator.py 窗口,并且该窗口有一个可以调用Login.py 的按钮

简而言之:

Login.py---->通话 -----> Panel_Administrador.py

Panel_Administrador.py ----> 通话 ----> Login.py

给我以下错误:

Traceback(最近一次调用最后一次): ..................... ImportError: 无法导入名称'panel_administrador'

我的代码:

import sys
import time

from PyQt5 import uic
from PyQt5.QtWidgets import QApplication, QWidget

import Con_pos
from Registro import Registro
from Panel_Administrador import panel_administrador


class Login(QWidget):

    def __init__(self, parent=None):
        QWidget.__init__(self, parent= parent)
        uic.loadUi("UI/Login.ui", self)
        self.registro.clicked.connect(self.view_Registro)
        self.ingresar.clicked.connect(self.autenticar)

    def autenticar(self):
        pid = self.getPID()
        con = Con_pos.con_pos()
        user = self.in_login.text()
        password = self.in_pass.text()
        fecha = time.strftime("%X") + " " + time.strftime("%x")
        if user != "" and password != "":
            consulta = ''' SELECT "id_usuario" FROM "usuarios"."Usuario" WHERE "id_usuario" = '%s' ; ''' %(user)
            c_user = con.consulta(consulta)
            consulta = ''' SELECT "pass" FROM "usuarios"."Usuario" WHERE "id_usuario" = '%s' ;''' %(user)
            c_pass = con.consulta(consulta)
            if c_user != None or not c_pass:
                c_pass = c_pass[0][0]
                if c_pass == password:
                    consulta = ''' INSERT INTO "usuarios"."sesion" VALUES ('%s', '%s', %s); '''%(user ,fecha, pid)
                    con.insertar(consulta)
                    print("Ingresando al sistema...")
                    if self.administrador(user):
                        self.admi = panel_administrador()
                        self.admi.show()
                else:
                    print("Usuario o password incorrecto")

    def administrador(self, user):
        ad = ''' SELECT "id_rol" FROM "usuarios"."Rol" WHERE "rol" = 'administrador'; '''
        consulta = ''' SELECT "id_usuario_Usuario" FROM "usuarios"."Usuario_Rol" WHERE "id_rol_Rol" = %s and "id_usuario_Usuario" = '%s' ''' %(ad, user)
        con_res = Con_pos.con_pos().consulta(consulta)
        print(con_res)
        if con_res or con_res != None:
            return True
        else:
            return False;

    def getPID(self):
        con = Con_pos.con_pos()
        func = "pg_backend_pid"
        pid = con.call_proc(func)
        pid = pid[0][0]
        return pid

    def view_Registro(self):
        self.reg = Registro()
        self.reg.show()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    login = Login()
    login.show()
    sys.exit(app.exec())

Panel_Administrador.py

import sys

from PyQt5 import uic
from PyQt5.QtWidgets import QApplication, QWidget

from Designar import designar
from Funciones import funciones
from Login import Login
from Admi_Users import admin_user
from Rol import rol


class panel_administrador(QWidget):

    def __init__(self):
        QWidget.__init__(self)
        uic.loadUi("UI/Panel_Administrador.ui", self)
        self.btn_funciones.clicked.connect(self.view_funciones)
        self.btn_roles.clicked.connect(self.view_roles)
        self.btn_usuarios.clicked.connect(self.view_usuario)
        self.btn_designar.clicked.connect(self.view_designar)
        self.btn_login.clicked.connect(self.view_login)

    def view_funciones(self):
        self.f = funciones()
        self.f.show()

    def view_roles(self):
        self.r = rol()
        self.r.show()

    def view_usuario(self):
        self.u = admin_user()
        self.u.show()

    def view_designar(self):
        self.d = designar()
        self.d.show()

    def view_login(self):
        self.l = Login()
        self.l.show()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    pa = panel_administrador()
    pa.show()
    sys.exit(app.exec())

【问题讨论】:

请阅读:***.com/questions/744373/… 还有这个:***.com/help/mcve 您的代码无法播放,因为有无法定义的类。 【参考方案1】:

发生的问题称为循环导入,它会生成递归循环。解决方案是更好地构建代码。在这种情况下,我将展示如何执行此操作的示例,我将创建 2 个名为管理面板和登录的类,每个类都包含一个按钮,对象是调用另一个窗口,反之亦然。创建另一个我将调用 main.py 的文件,我将在其中建立按钮之间的连接。

文件具有以下结构:

├── Login.py
├── main.py
└── Panel_Administrador.py

Login.py

from PyQt5.QtWidgets import QWidget, QPushButton, QVBoxLayout

class Login(QWidget):
    def __init__(self, parent=None):
        QWidget.__init__(self, parent= parent)
        self.setWindowTitle("Login")
        lay = QVBoxLayout(self)
        self.btn = QPushButton("LLamar a Panel Administrador")
        lay.addWidget(self.btn)
        self.btn.clicked.connect(self.hide)

Panel_Administrador.py

from PyQt5.QtWidgets import QWidget, QPushButton, QVBoxLayout

class panel_administrador(QWidget):
    def __init__(self, parent=None):
        QWidget.__init__(self, parent=parent)
        self.setWindowTitle("Panel de Administración")
        lay = QVBoxLayout(self)
        self.btn = QPushButton("Llamar a Login")
        lay.addWidget(self.btn)
        self.btn.clicked.connect(self.hide)

ma​​in.py

from PyQt5.QtWidgets import QApplication
import sys

from Panel_Administrador import panel_administrador
from Login import Login

if __name__ == "__main__":
    app = QApplication(sys.argv)
    p = panel_administrador()
    l = Login()
    l.btn.clicked.connect(p.show)
    p.btn.clicked.connect(l.show)
    p.show()

    sys.exit(app.exec())

【讨论】:

以上是关于Qt的问题如何打开它们之间调用的2个窗口的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 pyqt5 和 qt 设计器从主对话框窗口打开第二个窗口

来自另一个类的 Qt 方法调用?

如何使用qt上的按钮打开同一窗口的其他选项卡?

Qt在窗口之间传递焦点

QT按钮如何打开本地视频

Qt:如何关闭用 exec() 打开的对话框窗口?