Summarised from: https://www.pythonguis.com/tutorials/pyside6-creating-your-first-window/ Part 2 at PythonGuisTutorials2. ## Simple Window ```python from PySide6.QtWidgets import QApplication, QWidget # Only needed for access to command line arguments import sys # You need one (and only one) QApplication instance per application. # Pass in sys.argv to allow command line arguments for your app. # If you know you won't use command line arguments QApplication([]) works too. app = QApplication(sys.argv) # Create a Qt widget, which will be our window. window = QWidget() window.show() # IMPORTANT!!!!! Windows are hidden by default. # Start the event loop. app.exec_() ``` ## Any Widget Can Be a Window ```python import sys from PySide6.QtWidgets import QApplication, QPushButton app = QApplication(sys.argv) window = QPushButton("Push Me") window.show() app.exec_() ``` ## Subclassing QMainWindow ```python import sys from PySide6.QtCore import QSize, Qt from PySide6.QtWidgets import QApplication, QMainWindow, QPushButton # Subclass QMainWindow to customize your application's main window class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("My App") button = QPushButton("Press Me!") # Set the central widget of the Window. self.setCentralWidget(button) app = QApplication(sys.argv) window = MainWindow() window.show() app.exec_() ``` ## Sizing Widgets ```python import sys from PySide6.QtCore import QSize, Qt from PySide6.QtWidgets import QApplication, QMainWindow, QPushButton # Subclass QMainWindow to customize your application's main window class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("My App") button = QPushButton("Press Me!") self.setFixedSize(QSize(400, 300)) # Set the central widget of the Window. self.setCentralWidget(button) app = QApplication(sys.argv) window = MainWindow() window.show() app.exec_() ``` # Signals and Slots ## Push Button ```python iort sys from PySide6.QtWidgets import QApplication, QMainWindow, QPushButton class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("My App") button = QPushButton("Press Me!") button.setCheckable(True) button.clicked.connect(self.the_button_was_clicked) # Set the central widget of the Window. self.setCentralWidget(button) def the_button_was_clicked(self): print("Clicked!") app = QApplication(sys.argv) window = MainWindow() window.show() app.exec_() ``` ## Buttons Can Be Checkable and Signals Can Carry Data ```python class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("My App") button = QPushButton("Press Me!") button.setCheckable(True) button.clicked.connect(self.the_button_was_clicked) button.clicked.connect(self.the_button_was_toggled) self.setCentralWidget(button) def the_button_was_clicked(self): print("Clicked!") def the_button_was_toggled(self, checked): print("Checked?", checked) ``` ## Retrieving State of a Widget ```python class MainWindow(QMainWindow): def __init__(self): super().__init__() self.button_is_checked = True self.setWindowTitle("My App") self.button = QPushButton("Press Me!") self.button.setCheckable(True) self.button.released.connect(self.the_button_was_released) self.button.setChecked(self.button_is_checked) self.setCentralWidget(self.button) def the_button_was_released(self): self.button_is_checked = self.button.isChecked() print(self.button_is_checked) ``` ## Changing Properties of Widgets ```python class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("My App") self.button = QPushButton("Press Me!") self.button.clicked.connect(self.the_button_was_clicked) self.setCentralWidget(self.button) def the_button_was_clicked(self): self.button.setText("You already clicked me.") self.button.setEnabled(False) # Also change the window title. self.setWindowTitle("My Oneshot App") ``` ## Changing Window Titles ```python from PySide6.QtWidgets import QApplication, QMainWindow, QPushButton import sys from random import choice window_titles = [ 'My App', 'My App', 'Still My App', 'Still My App', 'What on earth', 'What on earth', 'This is surprising', 'This is surprising', 'Something went wrong' ] class MainWindow(QMainWindow): def __init__(self): super().__init__() self.n_times_clicked = 0 self.setWindowTitle("My App") self.button = QPushButton("Press Me!") self.button.clicked.connect(self.the_button_was_clicked) self.windowTitleChanged.connect(self.the_window_title_changed) self.setCentralWidget(self.button) def the_button_was_clicked(self): print("Clicked.") new_window_title = choice(window_titles) print("Setting title: %s" % new_window_title) self.setWindowTitle(new_window_title) def the_window_title_changed(self, window_title): print("Window title changed: %s" % window_title) if window_title == 'Something went wrong': self.button.setDisabled(True) app = QApplication(sys.argv) window = MainWindow() window.show() app.exec_() ``` ## Connecting Widget to Widget ```python import sys from PySide6.QtWidgets import QApplication, QMainWindow, QLabel, QLineEdit, QVBoxLayout, QWidget class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("My App") self.label = QLabel() self.input = QLineEdit() self.input.textChanged.connect(self.label.setText) layout = QVBoxLayout() layout.addWidget(self.input) layout.addWidget(self.label) container = QWidget() container.setLayout(layout) self.setCentralWidget(container) app = QApplication(sys.argv) window = MainWindow() window.show() app.exec_() ``` # Events ## Mouse Events ```python import sys from PySide6.QtCore import Qt from PySide6.QtWidgets import QApplication, QLabel, QMainWindow, QTextEdit class MainWindow(QMainWindow): def __init__(self): super().__init__() self.label = QLabel("Click in this window") self.setCentralWidget(self.label) def mouseMoveEvent(self, e): self.label.setText("mouseMoveEvent") def mousePressEvent(self, e): self.label.setText("mousePressEvent") def mouseReleaseEvent(self, e): self.label.setText("mouseReleaseEvent") def mouseDoubleClickEvent(self, e): self.label.setText("mouseDoubleClickEvent") app = QApplication(sys.argv) window = MainWindow() window.show() app.exec_() ``` ### Mouse Event Properties ```plaintext .button() Specific button that triggered this event .buttons() State of all mouse buttons (OR'ed flags) .globalPos() Application-global position as a QPoint .globalX() Application-global horizontal X position .globalY() Application-global vertical Y position .pos() Widget-relative position as a QPoint integer .posF() Widget-relative position as a QPointF float ``` # Context Menus ## Simple Context Menu ```python import sys from PySide6.QtCore import Qt from PySide6.QtGui import QAction from PySide6.QtWidgets import QApplication, QLabel, QMainWindow, QMenu class MainWindow(QMainWindow): def __init__(self): super().__init__() def contextMenuEvent(self, e): context = QMenu(self) context.addAction(QAction("test 1", self)) context.addAction(QAction("test 2", self)) context.addAction(QAction("test 3", self)) context.exec_(e.globalPos()) app = QApplication(sys.argv) window = MainWindow() window.show() app.exec_() ``` ## Signal Based Context Menus ```python class MainWindow(QMainWindow): def __init__(self): super().__init__() self.show() self.setContextMenuPolicy(Qt.CustomContextMenu) self.customContextMenuRequested.connect(self.on_context_menu) def on_context_menu(self, pos): context = QMenu(self) context.addAction(QAction("test 1", self)) context.addAction(QAction("test 2", self)) context.addAction(QAction("test 3", self)) context.exec_(self.mapToGlobal(pos)) ``` # Event Hierarchy ## Inheritance Forwarding ```python def mousePressEvent(self, event): print("Mouse pressed!") super(self, MainWindow).contextMenuEvent(event) ``` ## Marking an Event as Handled `accept()` is like `e.preventDefault()` ```python class CustomButton(QPushButton) def mousePressEvent(self, e): e.accept() ``` `ignore()` will pass the event up the hierarchy ```python class CustomButton(QPushButton) def event(self, e): e.ignore() ```