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】:

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

【讨论】:

非常感谢 Heike。这很有意义。

以上是关于PyQt5 QTabWidget:如何在类和同一窗口中包含的选项卡之间切换?的主要内容,如果未能解决你的问题,请参考以下文章

PyQt5 组件之QTabWidget

PyQt5 - QTabWidget 内容是不是可以扩展到主窗口边缘,即使没有内容?

PyQt5 QTabWidget 显示 currentWidget() "NoneType"

PyQt5 动态将 QFormLayouts 添加到 QTabWidget 的选项卡中

PyQt5:QTabWidget中的可关闭选项卡?

qtabwidget切换tab如何修改