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()

您不应尝试在 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)