Открыть новое окно с применением стилей в PySide2
У меня в приложении по кнопке открываются новые окна. Мне хотелось бы, чтобы эти окна открывались как-нибудь "красиво":) Ну слева выплывали или сверху, или с задержкой какой...
Не могу нигде подобных примеров найти. Может кто подскажет, как сделать подобные стили для дочерних окон? Спасибо
Привожу простой пример открытия нового окна
UI_test.py
from PySide2 import QtCore, QtGui, QtWidgets
from PySide2.QtCore import Qt
from random import randint
class Ui_Form(object):
def setupUi(self, Form):
Form.resize(1300, 700)
self.layout = QtWidgets.QHBoxLayout()
self.layout.setContentsMargins(0, 0, 0, 0)
self.layout.setSpacing(0)
self.listWidget = QtWidgets.QListWidget()
self.layout.addWidget(self.listWidget)
self.stackedWidget = QtWidgets.QStackedWidget()
self.layout.addWidget(self.stackedWidget)
self.listWidget.currentRowChanged.connect(
self.stackedWidget.setCurrentIndex)
item1 = QtWidgets.QListWidgetItem(QtGui.QIcon('icons/settings.png'),'CamSettings', self.listWidget)
item2 = QtWidgets.QListWidgetItem(QtGui.QIcon('icons/explore.png'),'Explore', self.listWidget)
item1.setSizeHint(QtCore.QSize(10, 60))
item2.setSizeHint(QtCore.QSize(10, 60))
item1.setTextAlignment(QtCore.Qt.AlignCenter)
item2.setTextAlignment(QtCore.Qt.AlignCenter)
label2= QtWidgets.QLabel('Это страница 2')
label2.setAlignment(QtCore.Qt.AlignCenter)
label2.setStyleSheet('background: rgb(%d, %d, %d); margin: 50px;' % (
randint(0, 255), randint(0, 255), randint(0, 255)))
create_tiff_but = QtWidgets.QPushButton('Create TIFF')
create_tiff_but.setObjectName('createTifBut')
create_tiff_but.setFixedSize(200, 70)
create_tiff_but.clicked.connect(Form.create_tiff)
image_panel_buttons = QtWidgets.QHBoxLayout()
image_panel_buttons.addWidget(create_tiff_but)
image_panel_buttons_frame = QtWidgets.QFrame()
image_panel_buttons_frame.setLayout(image_panel_buttons)
main_first_box = QtWidgets.QVBoxLayout()
main_first_box.addWidget(image_panel_buttons_frame)
first_container = QtWidgets.QWidget()
first_container.setLayout(main_first_box)
self.stackedWidget.addWidget(first_container)
self.stackedWidget.addWidget(label2)
Form.setLayout(self.layout)
app.py
import sys
import os
from PySide2 import QtWidgets
from PySide2 import QtWidgets, QtGui, QtCore
from UI_test import Ui_Form
from create_tiff import Create_TIFF
class App(QtWidgets.QWidget):
def __init__(self, parent = None):
QtWidgets.QWidget.__init__(self, parent)
self.ui = Ui_Form()
self.ui.setupUi(self)
def create_tiff(self):
# функция открытия диалогового окна для создания tiff
self.ct = Create_TIFF()
self.ct.displayInfo()
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
window = App()
window.show()
sys.exit(app.exec_())
create_tiff.py
import os
import json
from PySide2 import QtWidgets
from PySide2 import QtCore
class Create_TIFF(QtWidgets.QWidget):
#модуль с диалоговым окном для создания tiff файла
def __init__(self, parent=None):
super(Create_TIFF, self).__init__(parent)
self.setFixedWidth(400)
self.setFixedHeight(220)
self.setObjectName('modalTIFF')
self.setWindowTitle('Create TIFF')
self.json=None
self.path=None
button_json = QtWidgets.QPushButton("JSON")
button_json.setObjectName('modalJSONBtn')
button_json.setFixedWidth(90)
button_img = QtWidgets.QPushButton("IMG PATH")
button_img.setObjectName('modalImgPathBtn')
button_img.setFixedWidth(90)
button_tiff = QtWidgets.QPushButton("Create TIFF")
button_tiff.setObjectName('modalCrtTIFFBtn')
button_tiff.setFixedSize(200, 70)
json_label = QtWidgets.QLabel('Название json')
self.name_json= QtWidgets.QLineEdit()
self.name_json.setFixedWidth(160)
path_label = QtWidgets.QLabel('Путь к файлу')
self.name_path = QtWidgets.QLineEdit()
self.name_path.setFixedWidth(160)
first_h_box = QtWidgets.QHBoxLayout()
first_h_box.addWidget(json_label)
first_h_box.addWidget(self.name_json)
first_h_box.addWidget(button_json)
second_h_box = QtWidgets.QHBoxLayout()
second_h_box.addWidget(path_label)
second_h_box.addWidget(self.name_path)
second_h_box.addWidget(button_img)
first_h_box_frame = QtWidgets.QFrame()
first_h_box_frame.setLayout(first_h_box)
second_h_box_frame = QtWidgets.QFrame()
second_h_box_frame.setLayout(second_h_box)
vbox = QtWidgets.QVBoxLayout()
vbox.addWidget(first_h_box_frame)
vbox.addWidget(second_h_box_frame)
vbox.addWidget(button_tiff,alignment=QtCore.Qt.AlignCenter)
self.setLayout(vbox)
resolution = QtWidgets.QDesktopWidget().screenGeometry()
self.move((resolution.width() / 2) - (self.frameSize().width() / 2),
(resolution.height() / 2) - (self.frameSize().height() / 2))
def displayInfo(self):
self.show()
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
Класс QPropertyAnimation анимирует свойства Qt.
Больше https://doc.qt.io/qt-5/qpropertyanimation.html
import sys
from PyQt5.Qt import *
class SecondWidget(QWidget):
closed = pyqtSignal()
def __init__(self):
super().__init__()
self.resize(350, 250)
self.closeBtn = QPushButton('Close')
self.closeBtn.clicked.connect(self._close)
layout = QGridLayout(self)
layout.addWidget(self.closeBtn, 0, 0, alignment=Qt.AlignRight | Qt.AlignBottom)
self.animation = QPropertyAnimation(self, b'windowOpacity')
self.animation.setDuration(1500)
def _close(self):
self.animation.stop()
self.animation.finished.connect(self.close)
self.animation.setStartValue(1)
self.animation.setEndValue(0)
self.animation.start()
def closeEvent(self, event):
self.closed.emit()
def paintEvent(self, event):
qp = QPainter(self)
qp.fillRect(self.rect(), QColor(128, 228, 128, 128))
class MainWindow(QWidget):
def __init__(self):
super().__init__()
self.resize(350, 250)
self.setWindowFlags(self.windowFlags() | Qt.WindowStaysOnTopHint | Qt.X11BypassWindowManagerHint)
self.openBtn = QPushButton('open')
self.openBtn.clicked.connect(self.open_dialog)
self.label = QLabel("Hello World")
layout = QGridLayout(self)
layout.addWidget(self.openBtn, 0, 0, alignment=Qt.AlignLeft | Qt.AlignTop)
layout.addWidget(self.label, 0, 1, alignment=Qt.AlignLeft | Qt.AlignTop)
def open_dialog(self):
x, y = self.geometry().x(), self.geometry().y()
self.dialog = QWidget()
self.box = SecondWidget()
self.box.closed.connect(self.do_something)
self.box.show()
self.animation_2 = QPropertyAnimation(self.box, b"geometry")
self.animation_2.setDuration(7000)
self.animation_2.setStartValue(self.geometry())
self.animation_2.setEndValue(QRect(x+400, y, 350, 250))
self.animation_2.setEasingCurve(QEasingCurve.OutBounce)
self.animation_2.start()
def do_something(self):
self.label.setText("Closed")
def paintEvent(self, event):
qp = QPainter(self)
qp.fillRect(self.rect(), QColor(128, 128, 228, 228))
if __name__ == "__main__":
app = QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())

