Application Chooser Example¶
Simple application that shows the effect of selecting an application from the corners of the widget.
from __future__ import annotations
import sys
from PySide6.QtCore import (QPointF, QPropertyAnimation, QRect, QRectF, Qt,
Signal)
from PySide6.QtGui import QPixmap
from PySide6.QtWidgets import (QApplication, QGraphicsScene, QGraphicsView,
QGraphicsWidget)
from PySide6.QtStateMachine import QState, QStateMachine
import appchooser_rc # noqa: F401
class Pixmap(QGraphicsWidget):
clicked = Signal()
def __init__(self, pix, parent=None):
super().__init__(parent)
self.orig = QPixmap(pix)
self.p = QPixmap(pix)
def paint(self, painter, option, widget):
painter.drawPixmap(QPointF(), self.p)
def mousePressEvent(self, ev):
self.clicked.emit()
def setGeometry(self, rect):
super(Pixmap, self).setGeometry(rect)
if rect.size().width() > self.orig.size().width():
self.p = self.orig.scaled(rect.size().toSize())
else:
self.p = QPixmap(self.orig)
def create_states(objects, selectedRect, parent):
for obj in objects:
state = QState(parent)
state.assignProperty(obj, 'geometry', selectedRect)
parent.addTransition(obj.clicked, state)
def create_animations(objects, machine):
for obj in objects:
animation = QPropertyAnimation(obj, b'geometry', obj)
machine.addDefaultAnimation(animation)
if __name__ == '__main__':
app = QApplication(sys.argv)
p1 = Pixmap(QPixmap(':/digikam.png'))
p2 = Pixmap(QPixmap(':/akregator.png'))
p3 = Pixmap(QPixmap(':/accessories-dictionary.png'))
p4 = Pixmap(QPixmap(':/k3b.png'))
p1.setGeometry(QRectF(0.0, 0.0, 64.0, 64.0))
p2.setGeometry(QRectF(236.0, 0.0, 64.0, 64.0))
p3.setGeometry(QRectF(236.0, 236.0, 64.0, 64.0))
p4.setGeometry(QRectF(0.0, 236.0, 64.0, 64.0))
scene = QGraphicsScene(0, 0, 300, 300)
scene.setBackgroundBrush(Qt.GlobalColor.white)
scene.addItem(p1)
scene.addItem(p2)
scene.addItem(p3)
scene.addItem(p4)
window = QGraphicsView(scene)
window.setFrameStyle(0)
window.setAlignment(Qt.AlignmentFlag.AlignLeft | Qt.AlignmentFlag.AlignTop)
window.setHorizontalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAlwaysOff)
window.setVerticalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAlwaysOff)
machine = QStateMachine()
machine.setGlobalRestorePolicy(QStateMachine.RestorePolicy.RestoreProperties)
group = QState(machine)
selected_rect = QRect(86, 86, 128, 128)
idle_state = QState(group)
group.setInitialState(idle_state)
objects = [p1, p2, p3, p4]
create_states(objects, selected_rect, group)
create_animations(objects, machine)
machine.setInitialState(group)
machine.start()
window.resize(300, 300)
window.show()
sys.exit(app.exec())
<!DOCTYPE RCC><RCC version="1.0">
<qresource>
<file>accessories-dictionary.png</file>
<file>akregator.png</file>
<file>digikam.png</file>
<file>k3b.png</file>
</qresource>
</RCC>