Пытаюсь сделать вкладки внутри виджета, но чтобы вкладки работали внутри основного окна и не понимаю как это сделать
У меня есть выдвижной виджет и основное окно, хочу сделать вкладки или QTabWidget внутри виджета, но чтобы они работали с основным окном.
Я не знаю как это сделать и можно ли вообще так сделать?
Помогите пожалуйста, ниже пример кода:
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import *
class gg(object):
def setupUi(self, MainWindow):
#основное окно
MainWindow.setObjectName('MainWindow')
MainWindow.resize(845, 535)
self.widget = QtWidgets.QWidget(MainWindow)
self.widget.setStyleSheet('background-color: white;')
self.widget.setObjectName('widget')
#виджет
self.frame2 = QtWidgets.QFrame(self.widget)
self.frame2.setGeometry(QtCore.QRect(0, 0, 45, 535))
self.frame2.setStyleSheet("background: silver;")
self.frame2.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.frame2.setFrameShadow(QtWidgets.QFrame.Raised)
self.frame2.setObjectName("frame2")
#Вкладки(ну или же QTabWidget)
self.tabWidget = QtWidgets.QTabWidget(self.widget)
self.tabWidget.setGeometry(QtCore.QRect(0, 0, 845, 535))
#для перемещения вкладки
self.tabWidget.setTabPosition(QtWidgets.QTabWidget.West)
self.tabWidget.setObjectName("tabWidget")
self.tab1 = QtWidgets.QWidget()
self.tabWidget.addTab(self.tab1, "1")
self.tab2 = QtWidgets.QWidget()
self.tabWidget.addTab(self.tab2, "2")
lay = QtWidgets.QVBoxLayout(self.frame2)
lay.addWidget(self.tabWidget)
lay.setGeometry(QtCore.QRect(0, 0, 0, 0))
MainWindow.setCentralWidget(self.widget)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
pass
class MainWindow(QtWidgets.QMainWindow, gg):
def __init__(self):
super().__init__()
self.setupUi(self)
self.frame2.installEventFilter(self)
#размер виджета до и после наведения курсором
self._animation = QtCore.QPropertyAnimation(self.frame2, b'size', self)
self._animation.setStartValue(QtCore.QSize(45, self.height()))
self._animation.setEndValue(QtCore.QSize(200, self.height()))
self._animation.setDuration(200)
def eventFilter(self, obj, event):
if self.frame2 is obj:
#анимация выдвижения
if event.type() == event.Enter:
self._animation.setDirection(QtCore.QAbstractAnimation.Forward)
self._animation.start()
elif event.type() == event.Leave:
#анимация возврата
self._animation.setDirection(QtCore.QAbstractAnimation.Backward)
self._animation.start()
return super().eventFilter(obj, event)
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
app.setFont(QtGui.QFont("Times", 12, QtGui.QFont.Bold))
p = MainWindow()
p.show()
sys.exit(app.exec_())
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
Я понял вашу задачу так:
q1295440.py
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *
from q1295440_functions import *
class MainWindow(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
self.resize(845, 535)
self.setMinimumSize(QtCore.QSize(600, 400))
self.setStyleSheet("background-color: rgb(45, 45, 45);")
self.centralwidget = QtWidgets.QWidget()
self.centralwidget.setObjectName("centralwidget")
self.setCentralWidget(self.centralwidget)
self.Content = QtWidgets.QFrame(self.centralwidget)
self.Content.setStyleSheet("background-color: rgb(35, 235, 35);")
self.Content.setFrameShape(QtWidgets.QFrame.NoFrame)
self.Content.setFrameShadow(QtWidgets.QFrame.Raised)
self.Content.setObjectName("Content")
self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.Content)
self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0)
self.horizontalLayout_2.setSpacing(0)
self.frame_left_menu = QtWidgets.QFrame(self.Content)
self.frame_left_menu.setMinimumSize(QtCore.QSize(70, 0))
self.frame_left_menu.setStyleSheet("background-color: rgb(35, 35, 35);")
self.frame_left_menu.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.frame_left_menu.setFrameShadow(QtWidgets.QFrame.Raised)
self.frame_left_menu.setObjectName("frame_left_menu")
self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.frame_left_menu)
self.verticalLayout_3.setContentsMargins(0, 0, 0, 0)
self.frame_top_menus = QtWidgets.QFrame(self.frame_left_menu)
self.frame_top_menus.setFrameShape(QtWidgets.QFrame.NoFrame)
self.frame_top_menus.setFrameShadow(QtWidgets.QFrame.Raised)
self.frame_top_menus.setObjectName("frame_top_menus")
self.verticalLayout_4 = QtWidgets.QVBoxLayout(self.frame_top_menus)
self.verticalLayout_4.setContentsMargins(0, 0, 0, 0)
self.verticalLayout_4.setSpacing(0)
self.btn_page_1 = QtWidgets.QPushButton("Page 1", self.frame_top_menus)
self.btn_page_1.setMinimumSize(QtCore.QSize(0, 40))
self.btn_page_1.setStyleSheet("QPushButton {\n"
" color: rgb(255, 255, 255);\n"
" background-color: rgb(35, 35, 35);\n"
" border: 0px solid;\n"
"}\n"
"QPushButton:hover {\n"
" background-color: rgb(85, 170, 255);\n"
"}")
self.btn_page_1.setObjectName("btn_page_1")
self.verticalLayout_4.addWidget(self.btn_page_1)
self.btn_page_2 = QtWidgets.QPushButton("Page 2", self.frame_top_menus)
self.btn_page_2.setMinimumSize(QtCore.QSize(0, 40))
self.btn_page_2.setStyleSheet("QPushButton {\n"
" color: rgb(255, 255, 255);\n"
" background-color: rgb(35, 35, 35);\n"
" border: 0px solid;\n"
"}\n"
"QPushButton:hover {\n"
" background-color: rgb(85, 170, 255);\n"
"}")
self.btn_page_2.setObjectName("btn_page_2")
self.verticalLayout_4.addWidget(self.btn_page_2)
self.btn_page_3 = QtWidgets.QPushButton("Page 3", self.frame_top_menus)
self.btn_page_3.setMinimumSize(QtCore.QSize(0, 40))
self.btn_page_3.setStyleSheet("QPushButton {\n"
" color: rgb(255, 255, 255);\n"
" background-color: rgb(35, 35, 35);\n"
" border: 0px solid;\n"
"}\n"
"QPushButton:hover {\n"
" background-color: rgb(85, 170, 255);\n"
"}")
self.btn_page_3.setObjectName("btn_page_3")
self.verticalLayout_4.addWidget(self.btn_page_3)
self.verticalLayout_3.addWidget(self.frame_top_menus, 0, QtCore.Qt.AlignTop)
self.horizontalLayout_2.addWidget(self.frame_left_menu)
self.frame_pages = QtWidgets.QFrame(self.Content)
self.frame_pages.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.frame_pages.setFrameShadow(QtWidgets.QFrame.Raised)
self.frame_pages.setObjectName("frame_pages")
self.verticalLayout_5 = QtWidgets.QVBoxLayout(self.frame_pages)
self.verticalLayout_5.setObjectName("verticalLayout_5")
self.stackedWidget = QtWidgets.QStackedWidget(self.frame_pages)
self.stackedWidget.setObjectName("stackedWidget")
self.page_1 = QtWidgets.QWidget()
self.page_1.setObjectName("page_1")
self.verticalLayout_7 = QtWidgets.QVBoxLayout(self.page_1)
self.verticalLayout_7.setObjectName("verticalLayout_7")
self.label_1 = QtWidgets.QLabel("PAGE 1", self.page_1)
font = QtGui.QFont()
font.setPointSize(40)
self.label_1.setFont(font)
self.label_1.setStyleSheet("color: #FFF; background-color: #ba135d;")
self.label_1.setAlignment(QtCore.Qt.AlignCenter)
self.label_1.setObjectName("label_1")
self.verticalLayout_7.addWidget(self.label_1)
self.stackedWidget.addWidget(self.page_1)
self.page_2 = QtWidgets.QWidget()
self.page_2.setObjectName("page_2")
self.verticalLayout_6 = QtWidgets.QVBoxLayout(self.page_2)
self.verticalLayout_6.setObjectName("verticalLayout_6")
self.label_2 = QtWidgets.QLabel("PAGE 2", self.page_2)
font = QtGui.QFont()
font.setPointSize(40)
self.label_2.setFont(font)
self.label_2.setStyleSheet("color: #FFF; background-color: #1eae98;")
self.label_2.setAlignment(QtCore.Qt.AlignCenter)
self.label_2.setObjectName("label_2")
self.verticalLayout_6.addWidget(self.label_2)
self.stackedWidget.addWidget(self.page_2)
self.page_3 = QtWidgets.QWidget()
self.page_3.setObjectName("page_3")
self.verticalLayout_8 = QtWidgets.QVBoxLayout(self.page_3)
self.verticalLayout_8.setObjectName("verticalLayout_8")
self.label = QtWidgets.QLabel("PAGE 3", self.page_3)
font = QtGui.QFont()
font.setPointSize(40)
self.label.setFont(font)
self.label.setStyleSheet("color: #FFF; background-color: #f7a440;")
self.label.setAlignment(QtCore.Qt.AlignCenter)
self.label.setObjectName("label")
self.verticalLayout_8.addWidget(self.label)
self.stackedWidget.addWidget(self.page_3)
self.verticalLayout_5.addWidget(self.stackedWidget)
self.horizontalLayout_2.addWidget(self.frame_pages)
self.stackedWidget.setCurrentIndex(0)
self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
self.verticalLayout.setContentsMargins(0, 0, 0, 0)
self.verticalLayout.setSpacing(0)
self.verticalLayout.addWidget(self.Content)
# PAGE 1
self.btn_page_1.clicked.connect(
lambda: self.stackedWidget.setCurrentWidget(self.page_1))
# PAGE 2
self.btn_page_2.clicked.connect(
lambda: self.stackedWidget.setCurrentWidget(self.page_2))
# PAGE 3
self.btn_page_3.clicked.connect(
lambda: self.stackedWidget.setCurrentWidget(self.page_3))
self.frame_left_menu.installEventFilter(self)
# функция с анимацией выдвижения виджета путем наведения курсора
def eventFilter(self, obj, event):
if self.frame_left_menu is obj:
if event.type() == event.Enter:
UIFunctions.toggleMenu(self, 250, True)
elif event.type() == event.Leave:
UIFunctions.toggleMenu(self, 250, True)
return super().eventFilter(obj, event)
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
app.setFont(QtGui.QFont("Times", 12, QtGui.QFont.Bold))
w = MainWindow()
w.show()
sys.exit(app.exec_())
q1295440_functions.py
from q1295440 import *
class UIFunctions(MainWindow):
def toggleMenu(self, maxWidth, enable):
if enable:
# GET WIDTH
width = self.frame_left_menu.width()
maxExtend = maxWidth
standard = 70
# SET MAX WIDTH
if width == 70:
widthExtended = maxExtend
else:
widthExtended = standard
# ANIMATION
self.animation = QPropertyAnimation(self.frame_left_menu, b"minimumWidth")
self.animation.setDuration(400)
self.animation.setStartValue(width)
self.animation.setEndValue(widthExtended)
self.animation.setEasingCurve(QtCore.QEasingCurve.InOutQuart)
self.animation.start()
Update
можно ли убрать зеленые рамки?
void QLayout::setContentsMargins(int
left, inttop, intright, intbottom)Sets the
left,top,right, andbottommargins to use around thelayout.By default,
QLayoutuses the values provided by the style. On most platforms, the margin is11 pixelsin all directions.
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *
from q1295440_functions import *
class MainWindow(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
self.resize(845, 535)
self.setMinimumSize(QtCore.QSize(600, 400))
self.setStyleSheet("background-color: rgb(45, 45, 45);")
self.centralwidget = QtWidgets.QWidget()
self.centralwidget.setObjectName("centralwidget")
self.setCentralWidget(self.centralwidget)
self.Content = QtWidgets.QFrame(self.centralwidget)
self.Content.setStyleSheet("background-color: rgb(35, 35, 35);") # + 35
self.Content.setFrameShape(QtWidgets.QFrame.NoFrame)
self.Content.setFrameShadow(QtWidgets.QFrame.Raised)
self.Content.setObjectName("Content")
self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.Content)
self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0)
self.horizontalLayout_2.setSpacing(0)
self.frame_left_menu = QtWidgets.QFrame(self.Content)
self.frame_left_menu.setMinimumSize(QtCore.QSize(70, 0))
self.frame_left_menu.setStyleSheet("background-color: rgb(35, 35, 35);")
self.frame_left_menu.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.frame_left_menu.setFrameShadow(QtWidgets.QFrame.Raised)
self.frame_left_menu.setObjectName("frame_left_menu")
self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.frame_left_menu)
self.verticalLayout_3.setContentsMargins(0, 0, 0, 0)
self.frame_top_menus = QtWidgets.QFrame(self.frame_left_menu)
self.frame_top_menus.setFrameShape(QtWidgets.QFrame.NoFrame)
self.frame_top_menus.setFrameShadow(QtWidgets.QFrame.Raised)
self.frame_top_menus.setObjectName("frame_top_menus")
self.verticalLayout_4 = QtWidgets.QVBoxLayout(self.frame_top_menus)
self.verticalLayout_4.setContentsMargins(0, 0, 0, 0)
self.verticalLayout_4.setSpacing(0)
self.btn_page_1 = QtWidgets.QPushButton("Page 1", self.frame_top_menus)
self.btn_page_1.setMinimumSize(QtCore.QSize(0, 40))
self.btn_page_1.setStyleSheet("QPushButton {\n"
" color: rgb(255, 255, 255);\n"
" background-color: rgb(35, 35, 35);\n"
" border: 0px solid;\n"
"}\n"
"QPushButton:hover {\n"
" background-color: rgb(85, 170, 255);\n"
"}")
self.btn_page_1.setObjectName("btn_page_1")
self.verticalLayout_4.addWidget(self.btn_page_1)
self.btn_page_2 = QtWidgets.QPushButton("Page 2", self.frame_top_menus)
self.btn_page_2.setMinimumSize(QtCore.QSize(0, 40))
self.btn_page_2.setStyleSheet("QPushButton {\n"
" color: rgb(255, 255, 255);\n"
" background-color: rgb(35, 35, 35);\n"
" border: 0px solid;\n"
"}\n"
"QPushButton:hover {\n"
" background-color: rgb(85, 170, 255);\n"
"}")
self.btn_page_2.setObjectName("btn_page_2")
self.verticalLayout_4.addWidget(self.btn_page_2)
self.btn_page_3 = QtWidgets.QPushButton("Page 3", self.frame_top_menus)
self.btn_page_3.setMinimumSize(QtCore.QSize(0, 40))
self.btn_page_3.setStyleSheet("QPushButton {\n"
" color: rgb(255, 255, 255);\n"
" background-color: rgb(35, 35, 35);\n"
" border: 0px solid;\n"
"}\n"
"QPushButton:hover {\n"
" background-color: rgb(85, 170, 255);\n"
"}")
self.btn_page_3.setObjectName("btn_page_3")
self.verticalLayout_4.addWidget(self.btn_page_3)
self.verticalLayout_3.addWidget(self.frame_top_menus, 0, QtCore.Qt.AlignTop)
self.horizontalLayout_2.addWidget(self.frame_left_menu)
self.frame_pages = QtWidgets.QFrame(self.Content)
self.frame_pages.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.frame_pages.setFrameShadow(QtWidgets.QFrame.Raised)
self.frame_pages.setObjectName("frame_pages")
self.verticalLayout_5 = QtWidgets.QVBoxLayout(self.frame_pages)
self.verticalLayout_5.setContentsMargins(0, 0, 0, 0) # +++
self.verticalLayout_5.setObjectName("verticalLayout_5")
self.stackedWidget = QtWidgets.QStackedWidget(self.frame_pages)
self.stackedWidget.setObjectName("stackedWidget")
self.page_1 = QtWidgets.QWidget()
self.page_1.setObjectName("page_1")
self.verticalLayout_7 = QtWidgets.QVBoxLayout(self.page_1)
#
self.verticalLayout_7.setContentsMargins(0, 0, 0, 0) # +++
self.verticalLayout_7.setObjectName("verticalLayout_7")
self.label_1 = QtWidgets.QLabel("PAGE 1", self.page_1)
font = QtGui.QFont()
font.setPointSize(40)
self.label_1.setFont(font)
self.label_1.setStyleSheet("color: #FFF; background-color: #ba135d;")
self.label_1.setAlignment(QtCore.Qt.AlignCenter)
self.label_1.setObjectName("label_1")
self.verticalLayout_7.addWidget(self.label_1)
self.stackedWidget.addWidget(self.page_1)
self.page_2 = QtWidgets.QWidget()
self.page_2.setObjectName("page_2")
self.verticalLayout_6 = QtWidgets.QVBoxLayout(self.page_2)
self.verticalLayout_6.setContentsMargins(0, 0, 0, 0) # +++
self.verticalLayout_6.setObjectName("verticalLayout_6")
self.label_2 = QtWidgets.QLabel("PAGE 2", self.page_2)
font = QtGui.QFont()
font.setPointSize(40)
self.label_2.setFont(font)
self.label_2.setStyleSheet("color: #FFF; background-color: #1eae98;")
self.label_2.setAlignment(QtCore.Qt.AlignCenter)
self.label_2.setObjectName("label_2")
self.verticalLayout_6.addWidget(self.label_2)
self.stackedWidget.addWidget(self.page_2)
self.page_3 = QtWidgets.QWidget()
self.page_3.setObjectName("page_3")
self.verticalLayout_8 = QtWidgets.QVBoxLayout(self.page_3)
self.verticalLayout_8.setContentsMargins(0, 0, 0, 0) # +++
self.verticalLayout_8.setObjectName("verticalLayout_8")
self.label = QtWidgets.QLabel("PAGE 3", self.page_3)
font = QtGui.QFont()
font.setPointSize(40)
self.label.setFont(font)
self.label.setStyleSheet("color: #FFF; background-color: #f7a440;")
self.label.setAlignment(QtCore.Qt.AlignCenter)
self.label.setObjectName("label")
self.verticalLayout_8.addWidget(self.label)
self.stackedWidget.addWidget(self.page_3)
self.verticalLayout_5.addWidget(self.stackedWidget)
self.horizontalLayout_2.addWidget(self.frame_pages)
self.stackedWidget.setCurrentIndex(0)
self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
self.verticalLayout.setContentsMargins(0, 0, 0, 0)
self.verticalLayout.setSpacing(0)
self.verticalLayout.addWidget(self.Content)
# PAGE 1
self.btn_page_1.clicked.connect(
lambda: self.stackedWidget.setCurrentWidget(self.page_1))
# PAGE 2
self.btn_page_2.clicked.connect(
lambda: self.stackedWidget.setCurrentWidget(self.page_2))
# PAGE 3
self.btn_page_3.clicked.connect(
lambda: self.stackedWidget.setCurrentWidget(self.page_3))
self.frame_left_menu.installEventFilter(self)
# функция с анимацией выдвижения виджета путем наведения курсора
def eventFilter(self, obj, event):
if self.frame_left_menu is obj:
if event.type() == event.Enter:
UIFunctions.toggleMenu(self, 250, True)
elif event.type() == event.Leave:
UIFunctions.toggleMenu(self, 250, True)
return super().eventFilter(obj, event)
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
app.setFont(QtGui.QFont("Times", 12, QtGui.QFont.Bold))
w = MainWindow()
w.show()
sys.exit(app.exec_())


