PyQt5 QTabWidget:如何在类中包含的选项卡和同一窗口中的选项卡之间切换



我想在按下按钮时切换包含在自己类中的选项卡(下一个/上一个选项卡(。然而,我似乎做不到。如果我使用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()

您不应该尝试从TabContactTabPeronsalDetails中更改选项卡。这应该在Tab中进行。为了让Tab访问TabContactTabPeronsalDetails中的导航按钮,您需要使这些按钮成为实例变量,即

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)

最新更新