First programs in PyQt6
last modified January 10, 2023
In this part of the PyQt6 tutorial we learn some basic functionality. The examples show a tooltip, close a window, show a message box and center a window on the desktop.
PyQt6 simple example
This is a simple example showing a small window. Yet we can do a lot with this window. We can resize it, maximise it or minimise it. This requires a lot of coding. Someone already coded this functionality. Because it is repeated in most applications, there is no need to code it over again. PyQt6 is a high level toolkit. If we would code in a lower level toolkit, the following code example could easily have hundreds of lines.
#!/usr/bin/python """ ZetCode PyQt6 tutorial In this example, we create a simple window in PyQt6. Author: Jan Bodnar Website: zetcode.com """ import sys from PyQt6.QtWidgets import QApplication, QWidget def main(): app = QApplication(sys.argv) w = QWidget() w.resize(250, 200) w.move(300, 300) w.setWindowTitle('Simple') w.show() sys.exit(app.exec()) if __name__ == '__main__': main()
The above code example shows a small window on the screen.
import sys from PyQt6.QtWidgets import QApplication, QWidget
Here we provide the necessary imports. The basic widgets are located in
PyQt6.QtWidgets
module.
app = QApplication(sys.argv)
Every PyQt6 application must create an application object. The
sys.argv
parameter is a list of arguments from a command line.
Python scripts can be run from the shell. It is a way how we can control the
startup of our scripts.
w = QWidget()
The QWidget
widget is the base class of all user interface objects
in PyQt6. We provide the default constructor for QWidget
. The
default constructor has no parent. A widget with no parent is called a window.
w.resize(250, 150)
The resize
method resizes the widget. It is 250px wide and 150px
high.
w.move(300, 300)
The move
method moves the widget to a position on the screen at
x=300, y=300 coordinates.
w.setWindowTitle('Simple')
We set the title of the window with setWindowTitle
. The title is
shown in the titlebar.
w.show()
The show
method displays the widget on the screen. A widget is
first created in memory and later shown on the screen.
sys.exit(app.exec())
Finally, we enter the mainloop of the application. The event handling starts
from this point. The mainloop receives events from the window system and
dispatches them to the application widgets. The mainloop ends if we call the
exit
method or the main widget is destroyed. The
sys.exit
method ensures a clean exit. The environment will be
informed how the application ended.
PyQt6 tooltip
We can provide a balloon help for any of our widgets.
#!/usr/bin/python """ ZetCode PyQt6 tutorial This example shows a tooltip on a window and a button. Author: Jan Bodnar Website: zetcode.com """ import sys from PyQt6.QtWidgets import (QWidget, QToolTip, QPushButton, QApplication) from PyQt6.QtGui import QFont class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): QToolTip.setFont(QFont('SansSerif', 10)) self.setToolTip('This is a <b>QWidget</b> widget') btn = QPushButton('Button', self) btn.setToolTip('This is a <b>QPushButton</b> widget') btn.resize(btn.sizeHint()) btn.move(50, 50) self.setGeometry(300, 300, 300, 200) self.setWindowTitle('Tooltips') self.show() def main(): app = QApplication(sys.argv) ex = Example() sys.exit(app.exec()) if __name__ == '__main__': main()
In this example, we show a tooltip for two PyQt6 widgets.
QToolTip.setFont(QFont('SansSerif', 10))
This static method sets a font used to render tooltips. We use a 10pt SansSerif font.
self.setToolTip('This is a <b>QWidget</b> widget')
To create a tooltip, we call the setTooltip
method. We can use
rich text formatting.
btn = QPushButton('Button', self) btn.setToolTip('This is a <b>QPushButton</b> widget')
We create a push button widget and set a tooltip for it.
btn.resize(btn.sizeHint()) btn.move(50, 50)
The button is being resized and moved on the window. The sizeHint
method gives a recommended size for the button.
PyQt6 quit button
The obvious way to close a window is to click on the x mark on the titlebar. In the next example, we show how we can programatically close our window. We will briefly touch signals and slots.
The following is the constructor of a QPushButton
widget that we
use in our example.
QPushButton(string text, QWidget parent = None)
The text
parameter is a text that will be displayed on the button.
The parent
is a widget on which we place our button. In our case it
will be a QWidget
. Widgets of an application form a hierarchy. In
this hierarchy, most widgets have their parents. Widgets without parents are
toplevel windows.
#!/usr/bin/python """ ZetCode PyQt6 tutorial This program creates a quit button. When we press the button, the application terminates. Author: Jan Bodnar Website: zetcode.com """ import sys from PyQt6.QtWidgets import QWidget, QPushButton, QApplication class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): qbtn = QPushButton('Quit', self) qbtn.clicked.connect(QApplication.instance().quit) qbtn.resize(qbtn.sizeHint()) qbtn.move(50, 50) self.setGeometry(300, 300, 350, 250) self.setWindowTitle('Quit button') self.show() def main(): app = QApplication(sys.argv) ex = Example() sys.exit(app.exec()) if __name__ == '__main__': main()
In this example, we create a quit button. Upon clicking on the button, the application terminates.
qbtn = QPushButton('Quit', self)
We create a push button. The button is an instance of the QPushButton
class. The first parameter of the constructor is the label of the button.
The second parameter is the parent widget. The parent widget is the
Example
widget, which is a QWidget
by inheritance.
qbtn.clicked.connect(QApplication.instance().quit)
The event processing system in PyQt6 is built with the signal & slot
mechanism. If we click on the button, the signal clicked
is
emitted. The slot can be a Qt slot or any Python callable.
QCoreApplication
, which is retrieved with
QApplication.instance
, contains the main event loop—it processes
and dispatches all events. The clicked signal is connected to the
quit
method which terminates the application. The communication is
done between two objects: the sender and the receiver. The sender is the push
button, the receiver is the application object.
PyQt6 message box
By default, if we click on the x button on the titlebar,
the QWidget
is closed. Sometimes we want to modify
this default behaviour. For example, if we have a file opened in an editor
to which we did some changes. We show a message box to confirm the action.
#!/usr/bin/python """ ZetCode PyQt6 tutorial This program shows a confirmation message box when we click on the close button of the application window. Author: Jan Bodnar Website: zetcode.com """ import sys from PyQt6.QtWidgets import QWidget, QMessageBox, QApplication class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.setGeometry(300, 300, 350, 200) self.setWindowTitle('Message box') self.show() def closeEvent(self, event): reply = QMessageBox.question(self, 'Message', "Are you sure to quit?", QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No, QMessageBox.StandardButton.No) if reply == QMessageBox.StandardButton.Yes: event.accept() else: event.ignore() def main(): app = QApplication(sys.argv) ex = Example() sys.exit(app.exec()) if __name__ == '__main__': main()
If we close a QWidget
, the QCloseEvent
is generated. To modify the widget behaviour we need to reimplement the
closeEvent
event handler.
reply = QMessageBox.question(self, 'Message', "Are you sure to quit?", QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
We show a message box with two buttons: Yes and No. The first string appears
on the titlebar. The second string is the message text displayed by the dialog.
The third argument specifies the combination of buttons appearing in the dialog.
The last parameter is the default button. It is the button which has initially
the keyboard focus. The return value is stored in the reply
variable.
if reply == QMessageBox.StandardButton.Yes: event.accept() else: event.ignore()
Here we test the return value. If we click the Yes button, we accept the event which leads to the closure of the widget and to the termination of the application. Otherwise we ignore the close event.
PyQt6 center window
The following script shows how we can center a window on the desktop screen.
#!/usr/bin/python """ ZetCode PyQt6 tutorial This program centers a window on the screen. Author: Jan Bodnar Website: zetcode.com """ import sys from PyQt6.QtWidgets import QWidget, QApplication class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.resize(350, 250) self.center() self.setWindowTitle('Center') self.show() def center(self): qr = self.frameGeometry() cp = self.screen().availableGeometry().center() qr.moveCenter(cp) self.move(qr.topLeft()) def main(): app = QApplication(sys.argv) ex = Example() sys.exit(app.exec()) if __name__ == '__main__': main()
The QScreen
class class is used to query screen properties.
self.center()
The code that will center the window is placed in the custom center
method.
qr = self.frameGeometry()
We get a rectangle specifying the geometry of the main window. This includes any window frame.
cp = self.screen().availableGeometry().center()
We figure out the screen resolution of our monitor. And from this resolution, we get the center point.
qr.moveCenter(cp)
Our rectangle has already its width and height. Now we set the center of the rectangle to the center of the screen. The rectangle's size is unchanged.
self.move(qr.topLeft())
We move the top-left point of the application window to the top-left point of
the qr
rectangle, thus centering the window on our screen.
In this part of the PyQt6 tutorial, we have created simple code examples in PyQt6.