Переключение страниц в PySide2

В моем приложении на данный момент окна с содержимым переключаются при помощи табов. Вопрос: как сделать переключение кнопками, а не табами?

Простой пример как сейчас реализована суть

UI_test.py

from PySide2 import QtCore, QtGui, QtWidgets
from PySide2.QtCore import Qt,QPointF
from PySide2.QtCharts import QtCharts

class Ui_Form(object):
    def setupUi(self, Form):
        self.tabWidget = QtWidgets.QTabWidget()
        self.tabWidget.setLayoutDirection(QtCore.Qt.LeftToRight)
        self.tabWidget.setMinimumSize(640, 480)
        self.tabWidget.setAutoFillBackground(True)
        self.tabWidget.setObjectName("tabWidget")

        self.tab1 = QtWidgets.QWidget()
        self.tab1.setObjectName("tab1")
        self.tabWidget.addTab(self.tab1, "tab1")

        self.tab2 = QtWidgets.QWidget()
        self.tab2.setObjectName("tab2")
        self.tabWidget.addTab(self.tab2, "tab2")

        self.grid_main = QtWidgets.QGridLayout(Form)
        self.grid_main.addWidget(self.tabWidget)
        Form.setLayout(self.grid_main)

app.py

from UI_test import Ui_Form
from PySide2 import QtWidgets, QtGui, QtCore
import qdarkgraystyle
import sys

class MyWindow(QtWidgets.QWidget):
    def __init__(self, parent = None):
        QtWidgets.QWidget.__init__(self, parent)
        self.ui = Ui_Form()
        self.ui.setupUi(self)


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    window = MyWindow()
    app.setStyleSheet(qdarkgraystyle.load_stylesheet())
    app.setStyle('Windows')
    window.show()
    sys.exit(app.exec_())

Как я хочу устроить: введите сюда описание изображения

Как видно, слева кнопки, которыми можно переключать контент в окне. Вот так я бы хотел реализовать вместо табов. Можно ли какой-нибудь базовый пример переключения контента кнопками? Спасибо


Ответы (1 шт):

Автор решения: gil9red

Для левой половины можно использовать QVBoxLayout+QPushButton, для правой половины QStackedWidget

При клике на кнопки переключаете страницу через setCurrentIndex или setCurrentWidget

Пример:

from PyQt5.QtWidgets import QApplication, QVBoxLayout, QHBoxLayout, QWidget, QPushButton, QLabel, QStackedWidget


class MainWindow(QWidget):
    def __init__(self):
        super().__init__()

        self.stacked_widget = QStackedWidget()
        self.stacked_widget.addWidget(QLabel('1234'))
        self.stacked_widget.addWidget(QLabel('ABCD'))
        self.stacked_widget.addWidget(QLabel('FOO_BAR'))

        self.button_123 = QPushButton('1234')
        self.button_123.clicked.connect(lambda: self.stacked_widget.setCurrentIndex(0))

        self.button_ABCD = QPushButton('ABCD')
        self.button_ABCD.clicked.connect(lambda: self.stacked_widget.setCurrentIndex(1))

        self.button_FOO_BAR = QPushButton('FOO_BAR')
        self.button_FOO_BAR.clicked.connect(lambda: self.stacked_widget.setCurrentIndex(2))

        layout_buttons = QVBoxLayout()
        layout_buttons.addWidget(self.button_123)
        layout_buttons.addWidget(self.button_ABCD)
        layout_buttons.addWidget(self.button_FOO_BAR)

        main_layout = QHBoxLayout(self)
        main_layout.addLayout(layout_buttons)
        main_layout.addWidget(self.stacked_widget)


if __name__ == '__main__':
    app = QApplication([])
    
    mw = MainWindow()
    mw.show()

    app.exec()

введите сюда описание изображения


Еще вариант, но для левой половины используется QListWidget:

from PyQt5.QtWidgets import QApplication, QHBoxLayout, QWidget, QLabel, QStackedWidget, QListWidget


class MainWindow(QWidget):
    def __init__(self):
        super().__init__()

        self.stacked_widget = QStackedWidget()
        self.stacked_widget.addWidget(QLabel('1234'))
        self.stacked_widget.addWidget(QLabel('ABCD'))
        self.stacked_widget.addWidget(QLabel('FOO_BAR'))

        self.control_list = QListWidget()
        self.control_list.addItems(['1234', 'ABCD', 'FOO_BAR'])
        self.control_list.setFixedWidth(80)
        self.control_list.clicked.connect(lambda index: self.stacked_widget.setCurrentIndex(index.row()))

        main_layout = QHBoxLayout(self)
        main_layout.addWidget(self.control_list)
        main_layout.addWidget(self.stacked_widget)


if __name__ == '__main__':
    app = QApplication([])

    mw = MainWindow()
    mw.show()

    app.exec()

введите сюда описание изображения

→ Ссылка