吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1202|回复: 4
收起左侧

[求助] PyQt5开发浏览器,标签页的标题设置为网页标题的问题

  [复制链接]
MyModHeaven 发表于 2023-1-5 10:48
30吾爱币
本帖最后由 MyModHeaven 于 2023-1-5 12:43 编辑

问题是:多tab时,tab标题设置为网页标题
详细描述在图片中:
Snipaste_2023-01-05_10-32-32.png

网上的我也找了,我看过的,凡是涉及到tab标题改为网页标题的文章,都是在重构creatWindow函数时改为在当前tab打开,而不是在新tab中打开。这和我的问题不一样!

而且网上的代码几乎清一色复制于这里:https://github.com/pythonguis/15 ... d/browser_tabbed.py

发现这个问题,我受到启发,就在GitHub上找开源项目,发现太简单的不涉及这个问题,成熟的项目文件又太多,我找不到相关部分的代码,比如这个:https://github.com/qutebrowser/qutebrowser

希望做过这个的老哥分享一下经验,谢谢!

设置tab标题部分的代码如下(函数的最后一行):

[Python] 纯文本查看 复制代码
    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 的标题改为当前网页的标题


全部的代码如下:

[Python] 纯文本查看 复制代码
# -*- 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中打开)不一样。不知道还有其他的可以推荐的吗?谢谢!
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 02:19

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表