Как сделать бесшовный переход в PyQt6?

У меня есть фронт главного окна собранный в Qt Designer.
В нём есть четыре кнопки.

Я бы хотел сделать "бесшовный" переход при нажатии на кнопки, т.е., при нажатии на кнопку, чтобы перерисовывалось текущее окно с моей логикой, либо отрисовывалось другое окно собранное в Qt Designer на месте текущего, без анимации закрытия текущего окна.

Возможно, что проще сделать просто наложение нового окна на текущее. Подскажите как это лучше сделать с минимальным примером.

from PyQt6 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(911, 677)
        MainWindow.setMaximumSize(QtCore.QSize(911, 677))
        self.centralwidget = QtWidgets.QWidget(parent=MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.btc_btn = QtWidgets.QPushButton(parent=self.centralwidget)
        self.btc_btn.setGeometry(QtCore.QRect(0, 0, 93, 28))
        self.btc_btn.setObjectName("btc_btn")
        self.eth_btn = QtWidgets.QPushButton(parent=self.centralwidget)
        self.eth_btn.setGeometry(QtCore.QRect(110, 0, 93, 28))
        self.eth_btn.setObjectName("eth_btn")
        self.ton_btn = QtWidgets.QPushButton(parent=self.centralwidget)
        self.ton_btn.setGeometry(QtCore.QRect(220, 0, 93, 28))
        self.ton_btn.setObjectName("ton_btn")
        self.settings_btn = QtWidgets.QPushButton(parent=self.centralwidget)
        self.settings_btn.setGeometry(QtCore.QRect(340, 0, 93, 28))
        self.settings_btn.setObjectName("settings_btn")
        self.version_label_m = QtWidgets.QLabel(parent=self.centralwidget)
        self.version_label_m.setGeometry(QtCore.QRect(861, 657, 41, 31))
        self.version_label_m.setText("")
        self.version_label_m.setObjectName("version_label_m")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(parent=MainWindow)
        self.menubar.setEnabled(False)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 911, 26))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(parent=MainWindow)
        self.statusbar.setEnabled(False)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "src.wllt"))
        self.btc_btn.setText(_translate("MainWindow", "Bitcoin"))
        self.eth_btn.setText(_translate("MainWindow", "Ethereum"))
        self.ton_btn.setText(_translate("MainWindow", "TON"))
        self.settings_btn.setText(_translate("MainWindow", "Settings"))

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

Автор решения: S. Nick

Класс QStackedWidget предоставляет стек виджетов, в котором одновременно виден только один виджет.

'''
from PyQt6 import QtCore, QtGui, QtWidgets
'''
from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(911, 677)
#?       MainWindow.setMaximumSize(QtCore.QSize(911, 677))

        self.centralwidget = QtWidgets.QWidget(parent=MainWindow)
        self.centralwidget.setObjectName("centralwidget")
       
        self.version_label_m = QtWidgets.QLabel(
            parent=self.centralwidget, alignment=QtCore.Qt.AlignCenter)
        self.version_label_m.setGeometry(QtCore.QRect(861, 557, 41, 31))
        self.version_label_m.setText("")
        self.version_label_m.setObjectName("version_label_m")
# +++
        self.layout = QtWidgets.QVBoxLayout(self.centralwidget)   # +++     
        self.layout.addWidget(self.version_label_m)               # +++
                                                                  # и т.д.
        
        MainWindow.setCentralWidget(self.centralwidget)
        ''' # ? если это вам надо
        self.menubar = QtWidgets.QMenuBar(parent=MainWindow)
        self.menubar.setEnabled(False)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 911, 26))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(parent=MainWindow)
        self.statusbar.setEnabled(False)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)
        '''
        
        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "src.wllt"))
        self.version_label_m.setText(_translate("MainWindow", "page1 Bitcoin"))

    
class Button(QtWidgets.QPushButton):
    pass   


class Page1Bitcoin(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
    
    
class Page4Settings(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()

        self.label = QtWidgets.QLabel(self)
        self.label.setStyleSheet("border-image:url(cat.jpg);")
        self.label.setAlignment(QtCore.Qt.AlignCenter)
        newfont = QtGui.QFont("Consolas", 120, QtGui.QFont.Bold)
        self.label.setFont(newfont)

        layout = QtWidgets.QVBoxLayout(self)
        layout.setContentsMargins(0, 0, 0, 0)
        layout.addWidget(self.label)        
        
        timer = QtCore.QTimer(self)
        timer.timeout.connect(self.showTime)        
        timer.start(1000)
        
    def showTime(self):
        time = QtCore.QTime.currentTime()
        text = time.toString('hh:mm')        
        if (time.second() % 2) == 0:
            text = text[:2] + ' ' + text[3:]        
        self.label.setText(text)
        
        
class MainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()

        self.centralWidget = QtWidgets.QWidget()
        self.setCentralWidget(self.centralWidget)
        
        self.page1 = Page1Bitcoin()
        self.page1.setStyleSheet('background-color: #D98C00; font: 15pt \"Ubuntu\";')

        self.page2 = QtWidgets.QLabel("page2", alignment=QtCore.Qt.AlignCenter)
        self.page3 = QtWidgets.QLabel("page3", alignment=QtCore.Qt.AlignCenter)

        self.page4 = Page4Settings()

        options = ["Bitcoin", "Ethereum", "TON", "Settings"]
# !!! +++
        self.stackedwidget = QtWidgets.QStackedWidget()            # !!! +++
        
        hlay = QtWidgets.QHBoxLayout()        
        group = QtWidgets.QButtonGroup(self)
        group.buttonClicked[int].connect(self.stackedwidget.setCurrentIndex)
        
        for i, (option, widget) in enumerate(zip(options, 
            (self.page1, self.page2, self.page3, self.page4))):
            button = Button(text=option, checkable=True)
            ix = self.stackedwidget.addWidget(widget)              # !!! +++
            group.addButton(button, ix)
            hlay.addWidget(button)
            if i == 0:
                button.setChecked(True)
                    
        layout = QtWidgets.QVBoxLayout(self.centralWidget)        
        layout.addLayout(hlay)
        layout.addWidget(self.stackedwidget)        
        

if __name__ == "__main__":
    import sys
    
    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.resize(800, 555)
    w.show()
    sys.exit(app.exec())

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

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


cat.jpg

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

→ Ссылка