MyModHeaven 发表于 2023-1-5 10:48

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:15

本帖最后由 laiyou 于 2023-1-5 11:17 编辑

tab出来的标题百度收录后也是一样的吗

Takitooru 发表于 2023-1-5 11:26

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:37

本帖最后由 MyModHeaven 于 2023-1-5 12:44 编辑

laiyou 发表于 2023-1-5 11:15
tab出来的标题百度收录后也是一样的吗
什么意思?这和百度收录有什么关系?可否详细说一下,

MyModHeaven 发表于 2023-1-5 12:41

Takitooru 发表于 2023-1-5 11:26
1:PyQt5 浏览器将标签标题改为网页相关的标题
https://blog.csdn.net/hyd_csdn/article/details/11541089 ...

这三个链接里面都是把需要新页面打开的链接在当前tab打开,和我的问题(需要在新页面打开的链接,在新建tab中打开)不一样。不知道还有其他的可以推荐的吗?谢谢!
页: [1]
查看完整版本: PyQt5开发浏览器,标签页的标题设置为网页标题的问题