【问题标题】:PyQt5 QTabWidget: How to switch between tabs contained in classes and in the same window?PyQt5 QTabWidget:如何在类和同一窗口中包含的选项卡之间切换?
【发布时间】: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()

【问题讨论】:

    标签: python pyqt pyqt5 qtabwidget


    【解决方案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。这很有意义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-11
    • 1970-01-01
    • 2015-10-16
    相关资源
    最近更新 更多