PyQt5开发浏览器,标签页的标题设置为网页标题的问题
本帖最后由 MyModHeaven 于 2023-1-5 12:43 编辑问题是:多tab时,tab标题设置为网页标题
详细描述在图片中:
网上的我也找了,我看过的,凡是涉及到tab标题改为网页标题的文章,都是在重构creatWindow函数时改为在当前tab打开,而不是在新tab中打开。这和我的问题不一样!
而且网上的代码几乎清一色复制于这里:https://github.com/pythonguis/15 ... d/browser_tabbed.py
发现这个问题,我受到启发,就在GitHub上找开源项目,发现太简单的不涉及这个问题,成熟的项目文件又太多,我找不到相关部分的代码,比如这个:https://github.com/qutebrowser/qutebrowser
希望做过这个的老哥分享一下经验,谢谢!
设置tab标题部分的代码如下(函数的最后一行):
def create_tab(self, browser):
label = browser.page().title()
newtabIndex = self.tabWidget.addTab(browser, label)
self.tabWidget.setCurrentIndex(newtabIndex) # 新 tab 中打开网页后,将当前 tab 设置为新打开的 tab
# 绑定事件
browser.urlChanged.connect(lambda url=browser.url(): self.urlLine.setText(url.toString())) # 浏览器的网址改变时,更新 url
browser.urlChanged.connect(self.history) # 浏览器的网址改变时,更新工具栏按钮的状态
browser.loadFinished.connect(lambda i=newtabIndex: self.tabWidget.setTabText(i, browser.page().title()))# 将 tab 的标题改为当前网页的标题
全部的代码如下:
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'browser.ui'
#
# Created by: PyQt5 UI code generator 5.15.4
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.Do not edit this file unless you know what you are doing.
from os import path, chdir
dir = path.abspath(__file__)
chdir(path.dirname(dir))
import sys
from PyQt5 import QtCore, QtGui, QtWidgets, QtWebEngineWidgets
class WebEngineView(QtWebEngineWidgets.QWebEngineView):
def __init__(self, mainwindow):
super().__init__() # 调用父类的构造方法
self.mainwindow = mainwindow
# 重写createwindow(),在新窗口打开
def createWindow(self, QWebEnginePage_WebWindowType):
newWebview = WebEngineView(self.mainwindow)
self.mainwindow.create_tab(newWebview) # 打开新的tab页面
return newWebview
# class WebEngineView(QtWebEngineWidgets.QWebEngineView):
# def __init__(self, mainwindow):
# super().__init__() # 调用父类的构造方法
# # 重写createwindow(),在新窗口打开
# def createWindow(self, QWebEnginePage_WebWindowType):
# return ui.browser
class Ui_MainWindow(object):
def __init__(self, url):
self.url = url
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(800, 600)
MainWindow.setWindowTitle('彼岸图库')
self.toolBar = QtWidgets.QToolBar(MainWindow)
self.toolBar.setObjectName("toolBar")
# 设置工具栏中图标的大小
self.toolBar.setIconSize(QtCore.QSize(25, 25))
# 定义工具栏的按钮
# 为什么这些按钮不加self,就不显示呢???
self.backButton = QtWidgets.QPushButton()
self.backButton.setDisabled(True)
self.backButton.setIcon(QtGui.QIcon(QtGui.QPixmap('./icon/disabled_back.png')))
self.backButton.setToolTip('后退')
self.toolBar.addWidget(self.backButton)
self.fdButton = QtWidgets.QPushButton()
self.fdButton.setDisabled(True)
self.fdButton.setIcon(QtGui.QIcon(QtGui.QPixmap('./icon/disabled_fd.png')))
self.fdButton.setToolTip('前进')
self.toolBar.addWidget(self.fdButton)
self.reloadAction = QtWidgets.QAction(QtGui.QIcon('./icon/reload.png'), '刷新')
self.toolBar.addAction(self.reloadAction)
self.mainpageButton = QtWidgets.QPushButton()
self.mainpageButton.setDisabled(True)
self.mainpageButton.setIcon(QtGui.QIcon(QtGui.QPixmap('./icon/mainpage.png')))
self.mainpageButton.setToolTip('主页')
self.toolBar.addWidget(self.mainpageButton)
self.urlLine = QtWidgets.QLineEdit()
self.urlLine.setReadOnly(True) # 设置显示网址的line只读
self.urlLine.setText(self.url)
self.toolBar.addWidget(self.urlLine)
self.copyAction = QtWidgets.QAction(QtGui.QIcon('./icon/copy.png'), '复制网址')
self.toolBar.addAction(self.copyAction)
self.copyAction.triggered.connect(self.copyUrl)
MainWindow.addToolBar(QtCore.Qt.TopToolBarArea, self.toolBar)
self.tabWidget = QtWidgets.QTabWidget(MainWindow)
self.tabWidget.setMovable(True)
self.tabWidget.setTabsClosable(True)
# 绑定事件
self.tabWidget.tabCloseRequested.connect(self.closetab)
self.tabWidget.currentChanged.connect(self.currentTabChange) # 为了保证工具栏的按钮能且只能操作当前 tab 中的网页,每次切换 tab 都绑定一次
self.tabWidget.currentChanged.connect(lambda: self.urlLine.setText(self.tabWidget.currentWidget().url().toString())) # 当前 tab 改变时,更新 url
self.tabWidget.currentChanged.connect(self.history) # 更新工具栏按钮的状态
MainWindow.setCentralWidget(self.tabWidget)
# 第一个tab
mainpage = WebEngineView(self) # 将主窗口作为参数,传递给浏览器
mainpage.load(QtCore.QUrl(self.url))
self.create_tab(mainpage)
def closetab(self, i):
if self.tabWidget.count() == 1: # 如果只剩下一个 tab,则不关闭
return
self.tabWidget.removeTab(i)
def copyUrl(self):
app.clipboard().setText(self.urlLine.text())
def currentTabChange(self):
self.backButton.clicked.connect(self.tabWidget.currentWidget().back)
self.fdButton.clicked.connect(self.tabWidget.currentWidget().forward)
self.reloadAction.triggered.connect(self.tabWidget.currentWidget().reload)
self.mainpageButton.clicked.connect(lambda: self.tabWidget.currentWidget().load(QtCore.QUrl(self.url)))
def create_tab(self, browser):
label = browser.page().title()
newtabIndex = self.tabWidget.addTab(browser, label)
self.tabWidget.setCurrentIndex(newtabIndex) # 新 tab 中打开网页后,将当前 tab 设置为新打开的 tab
# 绑定事件
browser.urlChanged.connect(lambda url=browser.url(): self.urlLine.setText(url.toString())) # 浏览器的网址改变时,更新 url
browser.urlChanged.connect(self.history) # 浏览器的网址改变时,更新工具栏按钮的状态
browser.loadFinished.connect(lambda i=newtabIndex: self.tabWidget.setTabText(i, browser.page().title()))# 将 tab 的标题改为当前网页的标题
def reflashUrl(self):
currentWebview = self.tabWidget.currentWidget()
self.urlLine.setText(currentWebview.url().toString())
def history(self):
# 图标转换、按钮的边框等,以后用qss解决
history = self.tabWidget.currentWidget().history()
if history.canGoBack():
self.backButton.setEnabled(True)
self.backButton.setIcon((QtGui.QIcon(QtGui.QPixmap('./icon/back.png'))))
else:
self.backButton.setDisabled(True)
self.backButton.setIcon(QtGui.QIcon(QtGui.QPixmap('./icon/disabled_back.png')))
if history.canGoForward():
self.fdButton.setEnabled(True)
self.fdButton.setIcon((QtGui.QIcon(QtGui.QPixmap('./icon/fd.png'))))
else:
self.fdButton.setDisabled(True)
self.fdButton.setIcon((QtGui.QIcon(QtGui.QPixmap('./icon/disabled_fd.png'))))
if self.tabWidget.currentWidget().url().toString() == self.url:
self.mainpageButton.setDisabled(True)
self.mainpageButton.setIcon((QtGui.QIcon(QtGui.QPixmap('./icon/disabled_mainpage.png'))))
else:
self.mainpageButton.setEnabled(True)
self.mainpageButton.setIcon((QtGui.QIcon(QtGui.QPixmap('./icon/mainpage.png'))))
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
mainWindow = QtWidgets.QMainWindow() # 创建窗体对象
url = 'http://www.netbian.com/'
ui = Ui_MainWindow(url) # 创建 PyQt 设计的窗体对象
ui.setupUi(mainWindow) # 调用窗体的方法对对象进行初始化设置
mainWindow.show() # 显示窗体
sys.exit(app.exec_()) # 程序关闭时退出进程 本帖最后由 laiyou 于 2023-1-5 11:17 编辑
tab出来的标题百度收录后也是一样的吗
1:PyQt5 浏览器将标签标题改为网页相关的标题
https://blog.csdn.net/hyd_csdn/article/details/115410898
2:pyqt5 开发一个自定义浏览器将标签标题改为网页相关的标题
https://blog.csdn.net/qq_36551453/article/details/114393714
3:pyqt5 开发一个浏览器将标签标题改为网页相关的标题
https://blog.csdn.net/this_is_id/article/details/83011001 本帖最后由 MyModHeaven 于 2023-1-5 12:44 编辑
laiyou 发表于 2023-1-5 11:15
tab出来的标题百度收录后也是一样的吗
什么意思?这和百度收录有什么关系?可否详细说一下, Takitooru 发表于 2023-1-5 11:26
1:PyQt5 浏览器将标签标题改为网页相关的标题
https://blog.csdn.net/hyd_csdn/article/details/11541089 ...
这三个链接里面都是把需要新页面打开的链接在当前tab打开,和我的问题(需要在新页面打开的链接,在新建tab中打开)不一样。不知道还有其他的可以推荐的吗?谢谢!
页:
[1]