Переключение страниц в 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()


