frauklein
Goto Top

QT6 - eigenes Kontext Menu erstellen

Moin!

Ich möchte unter Python mit Qt6 ein QPlainTextEdit mit eigenem QMenu erstellen, dessen angebotenen QActions von den geklickten Begriffen abhängen. Die Begriffe im Text werden durch Kommas getrennt.

Nehmen wir an, der Text lautet "spam ham eggs, spam bacon eggs, spam beans eggs".
Nach einem Klick auf "spam", wie kann ich feststellen ob "spam ham eggs", "spam bacon eggs" oder spam beans eggs" geklickt wurde?

QTextCursor.SelectionType.WordUnderCursor gibt das geklickte Word "spam" zurück.

QTextCursor.SelectionType.BlockUnderCursor) gibt den ganzen Satz "spam ham eggs, spam bacon eggs, spam beans eggs".

Die einzige Möglichkeit, die ich i.M. sehe, ist den Text an der Kommas umzubrechen, also
"spam ham eggs,
spam bacon eggs,
spam beans eggs"

anzeigen zu lassen und QTextCursor.SelectionType.LineUnderCursor zu nutzen, welches die geklickte Zeile und damit den Begriff zurück gibt. Leider verbraucht so ein Layout zu viel Platz und stört den Lesefluss erheblich. Hat jemand eine bessere Idee?

Danke fürs Lesen, Frau Klein

PS. Jetzt bekomme ich Bock auf englisches Frühstück face-smile

Content-ID: 91341041406

Url: https://administrator.de/contentid/91341041406

Ausgedruckt am: 21.11.2024 um 19:11 Uhr

Lochkartenstanzer
Lochkartenstanzer 23.06.2024 um 09:14:30 Uhr
Goto Top
Moin,

/offtopic
Du hast einige Varianten ausgelassen

face-smile

lks

PS: Du könntest Shift-Space (=ALT-160 = geschütztes Leerzeichen) zwischen den Worten probieren.
13034433319
Lösung 13034433319 23.06.2024 aktualisiert um 10:20:43 Uhr
Goto Top
Hole dir die Position des Cursors als Integer, suche von der Position aus das vorherige Komma und das nachfolgende Komma oder Ende des Textes und extrahiere den Text aus den ermittelten Indizes der Kommas.
Oder du erstellst aus dem Text ein Array gesplittet an den Kommas und ermittelst den Arrayeintrag anhand der Integer-Position des Cursors (abzüglich aller Kommas natürlich) und der addierten Länge der einzelnen Einträge.

https://tio.run/##XY1BDsIgEEX3nGLCCiI2VhMXTXoS4wKBtsQWCMyinh5JbbVx9yd570 ...
# text
txt = "spam ham, spam ham eggs, spam ham egs bacon"  
# position an der der Cursor steht (hier nur als Beispiel definiert)
clickedpos = 12
# Startposition des Strings ermitteln
start = txt.rfind(",",0,clickedpos) + 1  
# Endposition ermitteln 
end = txt.find(",",clickedpos)  
# falls am Ende kein Komma gefunden wird Ende des Textes definieren
if end == -1 : end = len(txt)
# Text aus Indizes extrahieren ohne Whitespace an Anfang/Ende
clickedtext = txt[start:end].strip()
# und auageben
print(clickedtext)
Ergebnis
spam ham eggs


Gruß
FrauKlein
FrauKlein 23.06.2024 um 11:32:38 Uhr
Goto Top
Jepp. Der Tipp mit dem Index war genau richtig! Danke, und schönes Rest-WE!

Frau Klein