Este artigo detalha uma abordagem eficaz para gerenciar a transição de uma janela de autenticação para a intreface principal em uma aplicação PyQt5. A solução utiliza herança de classes e manipulação de eventos para garantir uma experiência de usuário fluida. O código a seguir demonstra a estrutura refatorada com nomes de variáveis e lógica alterados para maior clareza e manutenibilidade.
O arquivo de login, denominado LoginInterface.py, contém a classe da janela de login. Ele verifica as cerdenciais do usuário e, em caso de sucesso, instancia e exibe a janela principal.
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QMessageBox
from PyQt5.QtGui import QImage, QPixmap
from PyQt5.QtCore import QTimer
from ui_login import Ui_LoginWindow # Gerado a partir de um arquivo .ui
from janela_principal import JanelaPrincipal
from db_manager import GerenciadorBancoDados
class TelaAutenticacao(QMainWindow, Ui_LoginWindow):
def __init__(self):
super(TelaAutenticacao, self).__init__()
self.setupUi(self)
self.botao_acessar.clicked.connect(self.processar_login)
def processar_login(self):
usuario = self.campo_usuario.text()
senha = self.campo_senha.text()
if not usuario or not senha:
QMessageBox.warning(self, "Erro", "Usuário e senha são obrigatórios.")
return
db = GerenciadorBancoDados()
autenticacao = db.verificar_credenciais(usuario, senha)
if autenticacao:
self.tela_principal = JanelaPrincipal()
self.tela_principal.show()
self.close()
else:
QMessageBox.warning(self, "Erro", "Autenticação falhou. Verifique os dados.")
if __name__ == '__main__':
aplicativo = QApplication(sys.argv)
tela_login = TelaAutenticacao()
tela_login.show()
sys.exit(aplicativo.exec_())
O arquivo da janela principal, janela_principal.py, implementa a interface secundária com funcionalidades adicionais, como carregar e exibir vídeos processados.
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QFileDialog
from PyQt5.QtGui import QImage, QPixmap
from PyQt5.QtCore import QTimer
import cv2
from ui_principal import Ui_MainWindow # Gerado a partir de um arquivo .ui
from modulos.processador import ProcessadorMidia
class JanelaPrincipal(QMainWindow, Ui_MainWindow):
def __init__(self):
super(JanelaPrincipal, self).__init__()
self.setupUi(self)
self.botao_midia.clicked.connect(self.abrir_arquivo_video)
self.temporizador = QTimer(self)
self.captura = None
def abrir_arquivo_video(self):
caminho, _ = QFileDialog.getOpenFileName(self, "Escolha um vídeo", "./")
if caminho:
self.captura = cv2.VideoCapture(caminho)
self.temporizador.timeout.connect(self.atualizar_visualizacao)
self.temporizador.start(25) # Intervalo em milissegundos
def atualizar_visualizacao(self):
if self.captura and self.captura.isOpened():
sucesso, quadro = self.captura.read()
if sucesso:
processador = ProcessadorMidia()
quadro_tratado = processador.aplicar_filtro(quadro)
h, w, c = quadro_tratado.shape
q_img = QImage(quadro_tratado.data, w, h, c * w, QImage.Format_RGB888)
self.area_visualizacao.setPixmap(QPixmap.fromImage(q_img))
self.area_visualizacao.setScaledContents(True)
else:
self.temporizador.stop()
self.captura.release()
if __name__ == '__main__':
app = QApplication(sys.argv)
janela = JanelaPrincipal()
janela.show()
sys.exit(app.exec_())
A integração entre as janelas é feita através da instanciação direta da classe JanelaPrincipal dentro da lógica de autenticação. Isso elimina a necessidade de variáveis globais e simplifica o fluxo de controle. Assegure-se de que os módulos de interface gerados (ui_login.py e ui_principal.py) estejam corretamente importados e que as dependências como OpenCV e bibliotecas de banco de dados sejam instaladas.