QPlainTextEdit resize entsprechend dem Text

Alles rund um die Programmierung mit Qt
Antworten
redbulls
Beiträge: 59
Registriert: 27. März 2011 15:20

QPlainTextEdit resize entsprechend dem Text

Beitrag von redbulls »

Hi
ich möchte ein QPlainTextEdit ohne parent erzeugen. Dann möchte ich einen langen Text hinzufügen und die Size des QPlainTextEdits abfragen. Der ganze Sinn dahinter ist der, dass ich immer wissen muss wie groß ein QPlainTextEdit in der Höhe sein muss, damit der Text hineinpasst ohne Scrollbars.
Leider resized sich das QPlainTextEdit nicht ensprechend dem Text und ich bekomme falsche Größen geliefert.
Ich bitte um Hilfe...
sehr interessiert an Qt
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: QPlainTextEdit resize entsprechend dem Text

Beitrag von franzf »

Hört sich sehr komisch/verworren an.
Wenn es dir nur um die Größe geht: Schau dir doch mal QFontMetrics an. Intern wird das sicher auch in QText[Edit,Document] verwendet um die Größe zu berechnen.
redbulls
Beiträge: 59
Registriert: 27. März 2011 15:20

Re: QPlainTextEdit resize entsprechend dem Text

Beitrag von redbulls »

Danke für die Antwort franzf! Finde ich auch, aber bin bis jetzt noch nicht dahinter gekommen, wie ich die Höhe und Breite des Textes errechnen kann. Die Breite des Textes ist fix, die bekomm ich von der sectionSize meines QTreeViews, die Höhe ist die Unbekannte.
Hab schon mit QTextDoxument und mit der entsprechenden QFont herumhantiert um die Höhe zu bekommen. Hat aber nie funktioniert. Die Höhe war immer viel zu klein.
Werde mir jetzt QFontMetrics ansehen, aber dafür benötige ich doch die Anzahl der Zeilen, auf die ich noch nicht gekommen bin.
sehr interessiert an Qt
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: QPlainTextEdit resize entsprechend dem Text

Beitrag von franzf »

redbulls hat geschrieben:Die Breite des Textes ist fix, die bekomm ich von der sectionSize meines QTreeViews
...
aber dafür benötige ich doch die Anzahl der Zeilen, auf die ich noch nicht gekommen bin.
Aber die sectionSize bezieht sich doch nur auf die angezeigte Breite, welche nicht zwangsläufig mit der Textbreite übereinstimmen muss... Warum nicht auch hier auf QFontMetrics::width() setzen?
Und die Anzahl der Zeilen entspricht der Anzahl der Zeilenumbrüche (\n, \r\n, \r auf unix, win, mac) plus 1.

Wie kommst du an die Daten? kannst du nicht zeilenweise einlesen/zeilen splitten und dir die maximumWidth merken?
redbulls
Beiträge: 59
Registriert: 27. März 2011 15:20

Re: QPlainTextEdit resize entsprechend dem Text

Beitrag von redbulls »

Der Text kommt von einem XmlTag in einem Xml Dokument und werden in der QTreeView angezeigt. Das editieren erfolgt in einem abgeleiteten QPlainTextEdit. Es soll niemals eine QScrollbar erscheinen und auch, wenn nicht editiert wird soll der Text in seiner vollen Höhe im QTreeView anegzeigt werden. Durch das implementieren von sizeHint des QStyledItemDelegates funktioniert das auch gut, nur die Größen haben nie gepasst. Die paint Methode vom Delegate muss auch implementiert werden, damit die QTreeView den plaintext gleich darstellt, wie das QPlainTextEdit oder?

Werde deine Vorschläge testen, aber was passiert wenn der Text ohne Umbrüche erfasst wird, dann ergibt sich der Umbruch durch die Breite.
sehr interessiert an Qt
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: QPlainTextEdit resize entsprechend dem Text

Beitrag von franzf »

Bitte für zukünfige Fragen merken: Formuliere WAS dein eigentliches Ziel ist und nicht WIE du etwas erreichen willst!

Durch deinen letzten Post habe ich eine Ahnung, du hast es aber (immer noch) nicht gesagt:
Du brauchst in einer View ein Delegate. Um die Daten jetzt editieren zu können, soll das Item so groß dargestellt werden, dass ein TextEdit in der Zelle ohne Scrollbars den Text aufnehmen kann.

Nimm nicht QFontMetrics::width sondern boundingRect. Gib dem "rect"-Parameter deine Breite und eine aberwitzige Höhe, dann kommt sowas raus:

Code: Alles auswählen

>>> fm.boundingRect(QRect(0,0,100,20000), Qt.AlignLeft|Qt.TextWordWrap,"Das ist das Haus vom Nikolaus")
PyQt4.QtCore.QRect(0, 0, 67, 42)
Denk dran, dass ein TextEdit einen Rahmen + evtl. margins/paddings hat die auch styleabhängig sein können!

Generell würde ich das aber nicht so machen, da bei viel Text die view ziemlich vergrößerst wird. Desweiteren würde beim Editieren vielleicht doch eine ScrollBar auftauchen. Wenn du jetzt auf die Idee kommst, das zu unterbinden indem du nach jedem keystroke die Größe anpasst: Lass es, der User kann im Normalfall mit Scrollbars umgehen. Sich während der Interaktion resizende Widgets sind nicht userfreundlich.

Also: Gib deinem TextEdit vllt. 4 Zeilen, das sollte doch reichen, oder?
Wenns dem User nicht reicht kann der noch immer die Spaltenbreite/Höhe anpassen.
redbulls
Beiträge: 59
Registriert: 27. März 2011 15:20

Re: QPlainTextEdit resize entsprechend dem Text

Beitrag von redbulls »

Ok, sorry.
Danke franzf. Deine Hilfe war perfekt. :D
sehr interessiert an Qt
Antworten