Verständnisproblem mit QtGui.QFontMetrics() (PyQt5)

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Martin1986
User
Beiträge: 11
Registriert: Freitag 4. September 2020, 10:13

Hallo liebe Forenmitglieder,
ich habe vor langer Zeit eine einfache Funktion zum Ausmessen eines Textstrings in Pixel geschrieben. Diese Funktion habe ich immer in einer Qt5-Widget-Instanz aufgerufen. Dies hat auch immer sehr gut funktioniert.
Als ich die Funktion nun das erste mal außerhalb einer Instanz von PyQt5 aufgerufen habe bricht das ganze dann bei der return-Anweisung ab. Ich habe leider hier noch ein Verständnisproblem warum das so ist. Ich hoffe ihr könnt mir hier auf die Sprünge helfen.
Vielen Dank schon im Vorraus.
Der Quelltext der Funktion:
P.S.: Ich weiß, dass die QFontMetrics.width()-Funktion eigentlich veraltet ist.

Folgende Fehlermeldung erscheint: "Process finished with exit code -1073741819 (0xC0000005)"

Code: Alles auswählen

from PyQt5 import QtGui


def berechne_textlaenge(text: str, schriftgroesse: int, schriftart: str = "Arial", bold: bool = False) -> int:
    """
    Ausmessen eines beliebigen Strings in Pixel
    :param text:
    :param schriftart:
    :param schriftgroesse:
    :param bold:
    """

    # Fontobjekt
    font = QtGui.QFont()

    # Schriftart
    font.setFamily(schriftart)

    # fett schreiben ja oder nein
    font.setBold(bold)

    # Schriftgroesse
    font.setPointSize(schriftgroesse)

    # Objekt zum Ausmessen des Texts
    fm = QtGui.QFontMetrics(font)

    return fm.width(text)


if __name__ == '__main__':
    print(berechne_textlaenge("test", 10))
Viele Grüße Martin
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ist geraten, aber Qt ist echt fuxig wenn es keine QApplication-Instanz hat. Es gibt welche ohne GUI (für Kommandozeilentools), ob die hier reicht, ist mir aber unklar. Ich würde einfach die Standardvariante nehmen. Zur Not noch ein Widget dazu, musst du ja nicht anzeigen.
Benutzeravatar
__blackjack__
User
Beiträge: 13135
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Ich denke nicht das die QApplication ohne GUI ausreichen wird, denn bei mir liefert das Programm folgende Ausgabe:

Code: Alles auswählen

QGuiApplication::font(): no QGuiApplication instance and no application font set.
Segmentation fault (core dumped)
“There will always be things we wish to say in our programs that in all known languages can only be said poorly.” — Alan J. Perlis
Benutzeravatar
__blackjack__
User
Beiträge: 13135
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Martin1986: Das ist alles ein bisschen ”geschwätzig”. Die Kommentare sind alle überflüssig. Die Namen der Argumente noch mal im Docstring wiederholen ohne sie zu dokumentieren macht keinen Sinn.

Man braucht keine Typannotationen wenn das aus der direkten Zuweisung offensichtlich ist. Sowohl Menschen als auch die Werkzeuge zum analysieren der Typannotationen wissen das "Arial" vom Typ `str` und `False` vom Typ `bool` sind.

Das hier läuft bei mir:

Code: Alles auswählen

#!/usr/bin/env python3
from PyQt5 import QtGui


def berechne_textlaenge(
    text: str, schriftgroesse: int, schriftart="Arial", bold=False
) -> int:
    """
    Ausmessen eines beliebigen Strings in Pixeln.
    """
    font = QtGui.QFont()
    font.setFamily(schriftart)
    font.setPointSize(schriftgroesse)
    font.setBold(bold)
    return QtGui.QFontMetrics(font).width(text)


def main():
    _app = QtGui.QGuiApplication([])
    print(berechne_textlaenge("test", 10))


if __name__ == "__main__":
    main()
“There will always be things we wish to say in our programs that in all known languages can only be said poorly.” — Alan J. Perlis
Martin1986
User
Beiträge: 11
Registriert: Freitag 4. September 2020, 10:13

@__blackjack__: Ok vielen Dank. Dann liegt es an der fehlenden QApplication - Instanz. Für mich war QApplication immer nur das Starten der Event-Loop.
Vielen Dank für deine Hilfe.

Viele Grüße
Martin
Antworten