@@ -19,25 +19,34 @@ def __init__(self):
19
19
self .toolbar = QToolBar ("Navegação" )
20
20
self .addToolBar (self .toolbar )
21
21
22
+ # --- Suporte a Guias ---
23
+ self .tabs = QTabWidget () # Primeiro, inicialize o QTabWidget
24
+ self .tabs .setDocumentMode (True ) # Modo de documento (aparência mais moderna)
25
+ self .tabs .tabBarDoubleClicked .connect (self .tab_open_doubleclick ) # Abrir nova aba ao clicar duas vezes
26
+ self .tabs .currentChanged .connect (self .current_tab_changed ) # Mudar URL na barra quando a aba muda
27
+
28
+ self .setCentralWidget (self .tabs )
29
+
30
+ # Agora que self.tabs existe e tem uma guia, podemos conectar os botões
22
31
# Botões da barra de navegação
23
32
back_btn = QAction ("⬅️ Voltar" , self )
24
33
back_btn .setStatusTip ("Voltar para a página anterior" )
25
- back_btn .triggered .connect (self .current_browser ().back )
34
+ back_btn .triggered .connect (lambda : self .current_browser ().back ()) # Conecta a uma lambda para chamar no clique
26
35
self .toolbar .addAction (back_btn )
27
36
28
37
forward_btn = QAction ("➡️ Avançar" , self )
29
38
forward_btn .setStatusTip ("Avançar para a próxima página" )
30
- forward_btn .triggered .connect (self .current_browser ().forward )
39
+ forward_btn .triggered .connect (lambda : self .current_browser ().forward ()) # Conecta a uma lambda
31
40
self .toolbar .addAction (forward_btn )
32
41
33
42
reload_btn = QAction ("🔄 Recarregar" , self )
34
43
reload_btn .setStatusTip ("Recarregar a página atual" )
35
- reload_btn .triggered .connect (self .current_browser ().reload )
44
+ reload_btn .triggered .connect (lambda : self .current_browser ().reload ()) # Conecta a uma lambda
36
45
self .toolbar .addAction (reload_btn )
37
46
38
47
home_btn = QAction ("🏠 Início" , self )
39
48
home_btn .setStatusTip ("Ir para a página inicial" )
40
- home_btn .triggered .connect (self .navigate_home )
49
+ home_btn .triggered .connect (self .navigate_home ) # Essa já estava OK
41
50
self .toolbar .addAction (home_btn )
42
51
43
52
self .url_bar = QLineEdit ()
@@ -50,13 +59,6 @@ def __init__(self):
50
59
new_tab_btn .triggered .connect (self .add_new_tab )
51
60
self .toolbar .addAction (new_tab_btn )
52
61
53
- # --- Suporte a Guias ---
54
- self .tabs = QTabWidget ()
55
- self .tabs .setDocumentMode (True ) # Modo de documento (aparência mais moderna)
56
- self .tabs .tabBarDoubleClicked .connect (self .tab_open_doubleclick ) # Abrir nova aba ao clicar duas vezes
57
- self .tabs .currentChanged .connect (self .current_tab_changed ) # Mudar URL na barra quando a aba muda
58
-
59
- self .setCentralWidget (self .tabs )
60
62
61
63
self .add_new_tab (QUrl ("https://www.google.com" ), "Página Inicial" ) # Adiciona a primeira guia
62
64
@@ -65,7 +67,10 @@ def __init__(self):
65
67
66
68
def current_browser (self ):
67
69
"""Retorna a instância do navegador da guia atual."""
68
- return self .tabs .currentWidget ()
70
+ # Garante que sempre haja um widget antes de tentar acessá-lo
71
+ if self .tabs .count () > 0 :
72
+ return self .tabs .currentWidget ()
73
+ return None # Retorna None se não houver abas (embora sempre teremos uma)
69
74
70
75
def add_new_tab (self , qurl = None , label = "Nova Guia" ):
71
76
"""Adiciona uma nova guia ao navegador."""
@@ -79,68 +84,80 @@ def add_new_tab(self, qurl=None, label="Nova Guia"):
79
84
self .tabs .setCurrentIndex (i )
80
85
81
86
# Atualiza a URL na barra quando a página muda
82
- browser .urlChanged .connect (lambda qurl , browser = browser : self .update_urlbar (qurl , browser ))
87
+ browser .urlChanged .connect (lambda qurl_obj , browser = browser : self .update_urlbar (qurl_obj , browser ))
83
88
browser .loadStarted .connect (lambda : self .update_buttons_state ()) # Atualiza estado dos botões
84
89
browser .loadFinished .connect (lambda success : self .update_buttons_state ()) # Atualiza estado dos botões
85
90
91
+ # Conectar o título da guia para ser o título da página
92
+ browser .titleChanged .connect (lambda title , browser = browser : self .tabs .setTabText (self .tabs .indexOf (browser ), title ))
93
+
94
+
86
95
def tab_open_doubleclick (self , index ):
87
96
"""Abre uma nova guia ao dar clique duplo na barra de abas."""
88
97
if index == - 1 : # Clicou em uma área vazia
89
98
self .add_new_tab ()
90
99
91
100
def current_tab_changed (self , index ):
92
101
"""Atualiza a barra de URL quando a guia ativa muda."""
93
- qurl = self .current_browser ().url ()
94
- self .update_urlbar (qurl , self .current_browser ())
95
- self .update_buttons_state () # Garante que os botões refletem a guia atual
102
+ browser = self .current_browser ()
103
+ if browser :
104
+ qurl = browser .url ()
105
+ self .update_urlbar (qurl , browser )
106
+ self .update_buttons_state () # Garante que os botões refletem a guia atual
96
107
97
108
def navigate_home (self ):
98
109
"""Volta para a página inicial."""
99
- self .current_browser ().setUrl (QUrl ("https://www.google.com" ))
110
+ browser = self .current_browser ()
111
+ if browser :
112
+ browser .setUrl (QUrl ("https://www.google.com" ))
100
113
101
114
def navigate_to_url (self ):
102
115
"""
103
116
Navega para a URL digitada, adiciona HTTPS por padrão
104
117
ou faz uma pesquisa no Google.
105
118
"""
106
119
url = self .url_bar .text ()
120
+ browser = self .current_browser ()
121
+ if not browser : # Se não houver navegador ativo, não faz nada
122
+ return
107
123
108
124
# 1. Adiciona https:// se não houver protocolo
109
125
if not url .startswith ("http://" ) and not url .startswith ("https://" ):
110
126
# Verifica se parece um domínio (contém pelo menos um ponto)
111
- if "." in url and not " " in url :
127
+ if "." in url and not " " in url : # Garante que não é uma frase com espaços
112
128
url = "https://" + url # Tenta HTTPS por padrão
113
129
else :
114
130
# 2. Se não parecer uma URL, faz uma pesquisa no Google
115
131
search_query = QUrl .toPercentEncoding (url )
116
132
url = f"https://www.google.com/search?q={ search_query } "
117
133
118
- self . current_browser () .setUrl (QUrl (url ))
134
+ browser .setUrl (QUrl (url ))
119
135
self .update_buttons_state () # Atualiza o estado dos botões após a navegação
120
136
121
137
def update_urlbar (self , q , browser = None ):
122
138
"""Atualiza a barra de URL com a URL da guia atual."""
123
- if browser != self .current_browser ():
124
- # Impede que URLs de guias em segundo plano atualizem a barra principal
125
- return
126
-
127
- self .url_bar .setText (q .toString ())
128
- self .url_bar .setCursorPosition (0 ) # Volta o cursor para o início
139
+ # Apenas atualiza se o navegador passado for o navegador atual ou se não houver um navegador específico
140
+ if browser is None or browser == self .current_browser ():
141
+ self .url_bar .setText (q .toString ())
142
+ self .url_bar .setCursorPosition (0 ) # Volta o cursor para o início
129
143
130
144
def update_buttons_state (self ):
131
145
"""Atualiza o estado (habilitado/desabilitado) dos botões de navegação."""
132
146
browser = self .current_browser ()
133
- if browser :
134
- # Encontra as ações na toolbar para atualizá-las
135
- for action in self .toolbar .actions ():
136
- if action .text () == "⬅️ Voltar" :
137
- action .setEnabled (browser .url () != QUrl ("https://www.google.com" ) and browser .canGoBack ())
138
- elif action .text () == "➡️ Avançar" :
139
- action .setEnabled (browser .canGoForward ())
140
- else :
141
- # Desabilita todos os botões se não houver navegador ativo
142
- for action in self .toolbar .actions ():
143
- action .setEnabled (False )
147
+ # Itera sobre as ações da toolbar para encontrar os botões e atualizar seus estados
148
+ for action in self .toolbar .actions ():
149
+ if action .text () == "⬅️ Voltar" :
150
+ # Habilita "Voltar" se houver um navegador e puder voltar, e não estiver na página inicial
151
+ action .setEnabled (browser is not None and browser .canGoBack () and browser .url () != QUrl ("https://www.google.com" ))
152
+ elif action .text () == "➡️ Avançar" :
153
+ action .setEnabled (browser is not None and browser .canGoForward ())
154
+ elif action .text () == "🔄 Recarregar" :
155
+ action .setEnabled (browser is not None ) # Recarregar sempre que houver um navegador
156
+ elif action .text () == "🏠 Início" :
157
+ action .setEnabled (browser is not None ) # Home sempre que houver um navegador
158
+ elif action .text () == "➕ Nova Guia" :
159
+ action .setEnabled (True ) # Nova guia sempre habilitada
160
+
144
161
145
162
# Função principal para rodar o aplicativo
146
163
if __name__ == "__main__" :
0 commit comments