PyQt5 QTabWidget:如何在 类 和 window 中包含的选项卡之间切换?
PyQt5 QTabWidget: How to switch between tabs contained in classes and in the same window?
我想在按下按钮时切换自己 类 中包含的标签(next/prior 标签)。但是,我似乎做不到。如果我使用 self.tabs.show(),我会打开一个新的 window。但是,我只希望它在相同的 window 中切换。你能帮助我吗?下面的示例代码。
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()
您不应尝试在 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)
我想在按下按钮时切换自己 类 中包含的标签(next/prior 标签)。但是,我似乎做不到。如果我使用 self.tabs.show(),我会打开一个新的 window。但是,我只希望它在相同的 window 中切换。你能帮助我吗?下面的示例代码。
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()
您不应尝试在 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)