python - Python 中 PyQt 中的问题 - WebBrowser 项目
问题描述
下面的代码是一个 WebBrowser 代码。问题是当我想切换功能“SwitchTab”中发生的选项卡时。我已经检查过在函数“SwitchTab”中,我的“Tab_Content”变量是空的——因为它打印“None”——这就是问题所在。我不知道为什么那会是空的。(我已将代表问题的代码部分加粗)提前致谢...
PS:我正在使用 Python3.8 和 PyCharm4.5.4 以及 PyQt5
import sys
import os
import json
from PyQt5.QtWidgets import (QApplication, QWidget, QVBoxLayout,
QHBoxLayout, QPushButton, QLabel,
QLineEdit, QTabBar, QFrame, QStackedLayout, QTabWidget)
from PyQt5.QtGui import QIcon, QWindow, QImage
from PyQt5.QtCore import *
from PyQt5.QtWebEngineWidgets import *
class AddressBar(QLineEdit):
def __init__(self):
super().__init__()
def mousePressEvent(self, e):
self.selectAll()
class App(QFrame):
def __init__(self):
super().__init__()
self.CreateApp()
self.setWindowTitle("Web Browser")
self.setBaseSize(500 , 500)
def CreateApp(self):
self.layout = QVBoxLayout()
self.layout.setSpacing(0)
self.layout.setContentsMargins(0,0,0,0)
*#Creating Tabs*
self.TabBar = QTabBar(movable=True, tabsClosable=True)
self.TabBar.tabCloseRequested.connect(self.TabClose)
**self.TabBar.tabBarClicked.connect(self.SwitchTab)**
self.TabBar.setCurrentIndex(0)
*#Tabs List*
self.TabCount = 0
self.Tabs = []
*#Creating the AddressBar*
self.ToolBar = QWidget()
self.ToolBarLayout = QHBoxLayout()
self.AddressBar = AddressBar()
self.ToolBar.setLayout(self.ToolBarLayout)
self.ToolBarLayout.addWidget(self.AddressBar)
*#NewTab Button*
self.AddTabButton = QPushButton("+")
self.AddTabButton.clicked.connect(self.AddTab)
self.ToolBarLayout.addWidget(self.AddTabButton)
*#Main View*
self.Container = QWidget()
self.Container.layout = QStackedLayout()
self.Container.setLayout(self.Container.layout)
self.layout.addWidget(self.TabBar)
self.layout.addWidget(self.ToolBar)
self.layout.addWidget(self.Container)
self.setLayout(self.layout)
self.AddTab()
self.show()
def TabClose(self, i):
self.TabBar.removeTab(i)
print(self.TabCount)
print(self.Tabs)
def AddTab(self):
i = self.TabCount
self.Tabs.append(QWidget())
self.Tabs[i].layout = QVBoxLayout()
self.Tabs[i].setObjectName("Tab " + str(i))
*#Generate WebView*
self.Tabs[i].content = QWebEngineView()
self.Tabs[i].content.load(QUrl.fromUserInput("http://google.com"))
*#Add WebView to Tabs layout*
self.Tabs[i].layout.addWidget(self.Tabs[i].content)
*#Set top level tab [] to layout*
self.Tabs[i].setLayout(self.Tabs[i].layout)
*#Add tab to top level StackedWidget*
self.Container.layout.addWidget(self.Tabs[i])
self.Container.layout.setCurrentWidget(self.Tabs[i])
*#Set the tab at top of screen*
self.TabBar.addTab("New Tab - " + str(i))
self.TabBar.setTabData(i, "tab" + str(i))
self.TabBar.setCurrentIndex(i)
self.TabCount += 1
**def SwitchTab(self, i):
Tab_Data = self.TabBar.tabData(i)
print("tab: ", Tab_Data)
Tab_Content = self.findChild(QWidget, Tab_Data)
print(Tab_Content)
self.Container.layout.setCurrentWidget(Tab_Content)**
if __name__ == "__main__":
app = QApplication(sys.argv)
window = App()
sys.exit(app.exec_())
解决方案
因为findChild方法将objectName放入其中,而不是您设置的 tabData。在这种情况下,解决方案很简单。只需使用相同的参数设置 objectName 和 tabData。
self.TabBar.setTabData(i, "Tab " + str(i))
self.Tabs[i].setObjectName("Tab " + str(i))
推荐阅读
- jenkins - gradle.properties 不从命令行获取值
- regex - 对 if 条件/正则表达式进行 SED 操作
- mysql - InnoDB 事务和 MyISAM 示例
- python - Django Rest Framework 序列化程序没有得到 CharField
- reactjs - handleSubmit 没有运行 React - Redux Form - handleSubmit
- apache-kafka - Kafka + Streams 作为 CQRS 应用程序中的事件存储 - 命令模型一致性
- maven - 如何为不同子模块的可分发程序集中提供的库配置 MVN POM 文件
- typescript - 续集多对多关系TypeError:无法读取未定义的属性“名称”
- powershell - 在 Powershell 中合并输出
- javascript - Flask:服务器发送的事件(SSE)流功能在处理输入时停止