Как сделать бесшовный переход в 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