PyQt5 QTabWidget:如何在类和同一窗口中包含的选项卡之间切换?
Posted
技术标签:
【中文标题】PyQt5 QTabWidget:如何在类和同一窗口中包含的选项卡之间切换?【英文标题】:PyQt5 QTabWidget: How to switch between tabs contained in classes and in the same window? 【发布时间】:2020-03-09 09:08:29 【问题描述】:我想在按下按钮时切换它们自己的类中包含的选项卡(下一个/上一个选项卡)。但是,我似乎无法做到。如果我使用 self.tabs.show() 我会打开一个新窗口。但是,我只想让它在同一个窗口中切换。你能帮助我吗?示例代码如下。
from PyQt5.QtWidgets import QPushButton, QTabWidget, QApplication, QDialog, QVBoxLayout, QWidget
import sys
class Tab(QDialog):
def __init__(self):
super().__init__()
vbox = QVBoxLayout()
self.tabWidget = QTabWidget()
self.tabWidget.addTab(TabContact(), "Contact Details")
self.tabWidget.addTab(TabPeronsalDetails(), "Personal Details")
vbox.addWidget(self.tabWidget)
self.setLayout(vbox)
class TabContact(QWidget):
def __init__(self):
super().__init__()
pushButton = QPushButton("Go to next")
pushButton.clicked.connect(self.nextTab)
vbox = QVBoxLayout()
vbox.addWidget(pushButton)
self.setLayout(vbox)
def nextTab(self):
self.tabs = Tab()
self.tabs.tabWidget.setCurrentIndex(0)
class TabPeronsalDetails(QWidget):
def __init__(self):
super().__init__()
pushButton_2 = QPushButton("Go to prior")
pushButton_2.clicked.connect(self.priorTab)
vbox = QVBoxLayout()
vbox.addWidget(pushButton_2)
self.setLayout(vbox)
def priorTab(self):
self.tabs = Tab()
self.tabs.tabWidget.setCurrentIndex(0)
if __name__ == "__main__":
app = QApplication(sys.argv)
tabdialog = Tab()
tabdialog.show()
app.exec()
【问题讨论】:
【参考方案1】:您不应尝试从TabContact
或TabPeronsalDetails
中更改标签。这应该在Tab
内完成。为了让Tab
能够访问TabContact
和TabPeronsalDetails
中的导航按钮,您需要将这些按钮设为实例变量,即
class TabContact(QWidget):
def __init__(self):
super().__init__()
self.pushButton = QPushButton("Go to next")
vbox = QVBoxLayout()
vbox.addWidget(self.pushButton)
self.setLayout(vbox)
class TabPeronsalDetails(QWidget):
def __init__(self):
super().__init__()
self.pushButton_2 = QPushButton("Go to prior")
vbox = QVBoxLayout()
vbox.addWidget(self.pushButton_2)
self.setLayout(vbox)
在Tab
中,您可以通过以下操作将适当的插槽连接到按钮的clicked
信号
class Tab(QDialog):
def __init__(self):
super().__init__()
vbox = QVBoxLayout()
self.tabWidget = QTabWidget()
contact = TabContact()
personal_details = TabPeronsalDetails()
self.tabWidget.addTab(contact, "Contact Details")
self.tabWidget.addTab(personal_details, "Personal Details")
vbox.addWidget(self.tabWidget)
self.setLayout(vbox)
# connect slots to signals
contact.pushButton.clicked.connect(self.next_tab)
personal_details.pushButton_2.clicked.connect(self.prev_tab)
def next_tab(self):
cur_index = self.tabWidget.currentIndex()
if cur_index < len(self.tabWidget)-1:
self.tabWidget.setCurrentIndex(cur_index+1)
def prev_tab(self):
cur_index = self.tabWidget.currentIndex()
if cur_index > 0:
self.tabWidget.setCurrentIndex(cur_index-1)
【讨论】:
非常感谢 Heike。这很有意义。以上是关于PyQt5 QTabWidget:如何在类和同一窗口中包含的选项卡之间切换?的主要内容,如果未能解决你的问题,请参考以下文章
PyQt5 - QTabWidget 内容是不是可以扩展到主窗口边缘,即使没有内容?
PyQt5 QTabWidget 显示 currentWidget() "NoneType"