PyQt5 QTabWidget: как переключаться между вкладками, содержащимися в классах и в одном и том же окне? - PullRequest
0 голосов
/ 09 марта 2020

Я хотел бы переключать вкладки, содержащиеся в их собственных классах, при нажатии кнопки (следующая / предыдущая вкладки). Однако я не могу этого сделать. Если я использую 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 Ответ

2 голосов
/ 09 марта 2020

Не пытайтесь менять вкладки из 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)
...