pyqt5Aan de slag met pyqt5


Opmerkingen

Deze sectie geeft een overzicht van wat pyqt5 is en waarom een ontwikkelaar het misschien wil gebruiken.

Het moet ook alle grote onderwerpen binnen pyqt5 vermelden en naar de gerelateerde onderwerpen verwijzen. Aangezien de documentatie voor pyqt5 nieuw is, moet u mogelijk eerste versies van die gerelateerde onderwerpen maken.

Een toepassingspictogram toevoegen

import sys
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtGui import QIcon


class Example(QWidget):
    
    def __init__(self):
        super().__init__()
        
        self.initUI()
        
        
    def initUI(self):
        
        self.setGeometry(300, 300, 300, 220)
        self.setWindowTitle('Icon')
        self.setWindowIcon(QIcon('web.png'))        
    
        self.show()
        
        
if __name__ == '__main__':
    
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_()) 
 

Analyse

Functieargumenten in Python

In Python kunnen door de gebruiker gedefinieerde functies vier verschillende soorten argumenten aannemen.

  1. Standaard argumenten:
  • Functie definitie

    def defaultArg( name, msg = "Hello!"):

  • Functie oproep

    defaultArg( name)

  1. Vereiste argumenten:
  • Functie definitie

    def requiredArg (str,num):

  • Functie oproep:

    requiredArg ("Hello",12)

  1. Trefwoord argumenten:
  • Functie definitie

    def keywordArg( name, role ):

  • Functie oproep

    keywordArg( name = "Tom", role = "Manager")

    of

    keywordArg( role = "Manager", name = "Tom")

  1. Variabel aantal argumenten:
  • Functie definitie

    def varlengthArgs(*varargs):

  • Functie oproep

    varlengthArgs(30,40,50,60)

class Example(QWidget):
    
    def __init__(self):
        super().__init__()
        ...
 

Drie belangrijke dingen in objectgeoriënteerd programmeren zijn klassen, gegevens en methoden. Hier maken we een nieuwe klasse met de naam Example . De klasse Example neemt van de klasse QWidget . Dit betekent dat we twee constructors aanroepen: de eerste voor de klasse Example en de tweede voor de overgenomen klasse. De methode super() retourneert het bovenliggende object van de klasse Example en we roepen de constructor aan. De self variabele betreft het object zelf.

Waarom hebben we __init__ gebruikt?

Bekijk dit eens:

class A(object):
    def __init__(self):
        self.lst = []

class B(object):
    lst = []
 

en probeer nu:

>>> x = B()
>>> y = B()
>>> x.lst.append(1)
>>> y.lst.append(2)
>>> x.lst
[1, 2]
>>> x.lst is y.lst
True
 

en dit:

>>> x = A()
>>> y = A()
>>> x.lst.append(1)
>>> y.lst.append(2)
>>> x.lst
[1]
>>> x.lst is y.lst
False
 

Betekent dit dat x in klasse B wordt vastgesteld vóór instantiëring?

Ja, het is een klasseattribuut (het wordt gedeeld tussen instanties). In klasse A is het een instantieattribuut.

self.initUI() 
 

Het maken van de GUI wordt gedelegeerd aan de methode initUI() .

self.setGeometry(300, 300, 300, 220)
self.setWindowTitle('Icon')
self.setWindowIcon(QIcon('web.png'))  
 

Alle drie de methoden zijn overgenomen van de klasse QWidget . De setGeometry() doet twee dingen: het lokaliseert het venster op het scherm en stelt het in. De eerste twee parameters zijn de x- en y-posities van het venster. De derde is de breedte en de vierde is de hoogte van het venster. In feite combineert het de methoden resize() en move() in één methode. Met de laatste methode wordt het toepassingspictogram ingesteld. Om dit te doen, hebben we een QIcon object gemaakt. De QIcon ontvangt het pad naar ons pictogram dat moet worden weergegeven.

if __name__ == '__main__':
    
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())
 

De applicatie- en voorbeeldobjecten worden gemaakt. De hoofdlus wordt gestart.

Hallo wereld voorbeeld

Dit voorbeeld maakt een eenvoudig venster met een knop en een lijnbewerking in een lay-out. Het laat ook zien hoe een signaal op een slot wordt aangesloten, zodat het klikken op de knop tekst toevoegt aan de lijnbewerking.

import sys
from PyQt5.QtWidgets import QApplication, QWidget


if __name__ == '__main__':
    
    app = QApplication(sys.argv)

    w = QWidget()
    w.resize(250, 150)
    w.move(300, 300)
    w.setWindowTitle('Hello World')
    w.show()
    
    sys.exit(app.exec_())
 

Analyse

app = QtWidgets.QApplication(sys.argv)

Elke PyQt5-toepassing moet een toepassingsobject maken. De parameter sys.argv is een lijst met argumenten van een opdrachtregel. Python-scripts kunnen vanuit de shell worden uitgevoerd.

w = QWidget()
 

De widget QWidget is de basisklasse van alle gebruikersinterfaceobjecten in PyQt5. We bieden de standaardconstructor voor QWidget . De standaardconstructor heeft geen ouder. Een widget zonder ouder wordt een venster genoemd.

w.resize(250, 150)
 

Met de methode resize() wordt de grootte van de widget aangepast. Het is 250 px breed en 150 px hoog.

w.move(300, 300)
 

De methode move() verplaatst de widget naar een positie op het scherm op x = 300, y = 300 coördinaten.

w.setWindowTitle('Hello World')
 

Hier zetten we de titel voor ons venster. De titel wordt weergegeven in de titelbalk.

w.show()
 

De methode show() geeft de widget op het scherm weer. Een widget wordt eerst in het geheugen gemaakt en later op het scherm weergegeven.

sys.exit(app.exec_())
 

Uiteindelijk komen we in de hoofdloop van de applicatie. De gebeurtenisafhandeling begint vanaf dit punt. De mainloop ontvangt gebeurtenissen van het raamsysteem en verzendt deze naar de toepassingswidgets. De hoofdlus eindigt als we de methode exit() aanroepen of de hoofdwidget wordt vernietigd. De methode sys.exit() zorgt voor een schone exit. De omgeving wordt geïnformeerd hoe de toepassing is beëindigd.

De methode exec_() heeft een onderstrepingsteken. Dit komt omdat de exec een Python-sleutelwoord is. En dus werd in plaats daarvan exec_() gebruikt.

Installatie of instellingen

  1. Installeer Anaconda (PyQt5 is ingebouwd), vooral voor Windows-gebruikers.
  2. Integreer QtDesigner en QtUIConvert in PyCharm (externe tools)
    • Open PyCharm- Settings > Tools > External Tools
    • Create Tool (QtDesigner) - gebruikt om * .ui-bestanden te bewerken
    • Create Tool (PyUIConv) - gebruikt om * .ui naar * .py te converteren
  3. Demo schrijven
    • nieuw window.ui door externe tool (QtDesigner)
    • converteren naar window.py door externe tool (PyUIConv)
    • demonstratie
      import sys
      from PyQt5.QtWidgets import QApplication,QMainWindow
      from window import Ui_MainWindow
      
      if __name__ == '__main__':
          app = QApplication(sys.argv)
          w = QMainWindow()
          ui = Ui_MainWindow()
          ui.setupUi(w)
          w.show()
          sys.exit(app.exec_())
       

Verpak uw project in excutable / installer

cx_Freeze - een tool kan uw project verpakken naar excutable / installer

  • na installatie door pip, om demo.py te verpakken, hebben we hieronder setup.py nodig.
import sys
from cx_Freeze import setup, Executable

# Dependencies are automatically detected, but it might need fine tuning.
build_exe_options = {
    "excludes": ["tkinter"],
    "include_files":[('./platforms','./platforms')] # need qwindows.dll for qt5 application
}

# GUI applications require a different base on Windows (the default is for a
# console application).
base = None
if sys.platform == "win32":
    base = "Win32GUI"

setup(  name = "demo",
        version = "0.1",
        description = "demo",
        options = {"build_exe": build_exe_options},
        executables = [Executable("demo.py", base=base)])
 
  • bouw dan
python .\setup.py build
 
  • dan dist
python .\setup.py bdist_msi
 

Tooltip weergeven

import sys
from PyQt5.QtWidgets import (QWidget, QToolTip, 
    QPushButton, QApplication)
from PyQt5.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()
        
        
if __name__ == '__main__':
    
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())
 

Analyse

QToolTip.setFont(QFont('SansSerif', 10))
 

Met deze statische methode wordt een lettertype ingesteld dat wordt gebruikt om knopinfo weer te geven. We gebruiken een 10px SansSerif-lettertype.

self.setToolTip('This is a <b>QWidget</b> widget')
 

Om een tooltip te maken, roepen we de methode setTooltip() . We kunnen rich text-opmaak gebruiken.

btn = QPushButton('Button', self)
btn.setToolTip('This is a <b>QPushButton</b> widget')
 

We maken een widget met drukknoppen en stellen er een tooltip voor in.

btn.resize(btn.sizeHint())
btn.move(50, 50) 
 

Het formaat van de knop wordt gewijzigd en naar het venster verplaatst. De methode sizeHint() geeft een aanbevolen grootte voor de knop.