PyQt und: wie geht man mit auto-resize-widgets, wenn sich Ihr Inhalt ändert
Ich habe einige Probleme mit der Größe der qt4-widgets, wenn sich Ihr Inhalt ändert.
Werde ich veranschaulichen meine Probleme mit zwei einfachen Szenarien:
Szenario 1:
Habe ich ein QLineEdit-widget. Manchmal, wenn ich eine änderung seiner Inhalte mit QLineEdit.setText(), the one-line-string passt nicht in das widget in der aktuellen Größe nicht mehr. Ich muss wählen Sie das widget aus und verwenden Sie die Pfeiltasten zum scrollen der string in beide Richtungen, um alles zu sehen.
Szenario 2:
Habe ich ein QTextEdit widget. Manchmal, wenn ich bin, ändert es seine Inhalte mithilfe von QTextEdit.setHtml(), die den gerenderten HTML-Inhalt passt nicht in das widget in der aktuellen Größe nicht mehr. Das widget startet die Anzeige der horizontalen und/oder vertikalen scroll-Balken und ich kann Sie nutzen, um das scrollen der HTML-Inhalte.
Ich würde in solchen Szenarien ist eine gewisse Logik, die entscheidet, wenn nach einem Inhalt ändern, werden die neuen Inhalte passen nicht mehr in das widget und die automatische Erhöhung der widget-Größe, so dass alles passen würde.
Wie sind diese Szenarien behandelt?
Ich bin mit PyQt4.
Edit: nach dem Lesen sowohl den Kommentar und die erste Antwort (die erwähnt Eingabe von Inhalt in das widget), ging ich über die Frage noch ein mal. Ich war unangenehm überrascht zu erfahren, eine schreckliche Tippfehler. Ich meinte QTextBrowser als ich schrieb, QTextEdit, ich entschuldige mich für irreführend. Das heißt: ich habe ein widget rendert HTML-code, die ich ändern bin, und ich würde wollen, das widget, um zu wachsen genug, um Anzeige alles ohne Scrollbalken.
Als für QLineEdit statt QLabel - ich ging für QLineEdit da ich gemerkt habe ich kann nicht wählen Sie text aus einem QLabel mit der Maus zu kopieren. Mit QLineEdit ist es möglich.
InformationsquelleAutor | 2009-07-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich bin Anrufbeantworter in C++ hier, da es ist, was, die ich bin sehr vertraut mit, und Ihr problem ist nicht spezifisch für PyQt.
Normalerweise, Sie brauchen nur zu rufen
QWidget::updateGeometry()
wenn diesizeHint()
haben sich geändert, genau wie Sie aufrufen müssenQWidget::update()
wenn die Inhalte geändert haben können.Dein problem, jedoch, ist, dass die
sizeHint()
ändert sich nicht, wenn text Hinzugefügt wirdQLineEdit
undQTextEdit
. Aus einem Grund: die Menschen erwarten Sie nicht, Ihre Dialoge zu wachsen-wie-Sie-Typ 🙂Sagte, dass, wenn Sie wirklich wollen, grow-as-you-type-Verhalten in diesen widgets, die Sie brauchen, von der Sie Erben und implementieren
sizeHint()
undminimumSizeHint()
zurückkehren, die größere Größe, und möglicherweisesetText()
,append()
etc. zu nennenupdateGeometry()
so die sizehint Veränderung bemerkt.Den sizehint Berechnung nicht ganz trivial, und wird so leichter für
QLineEdit
als fürQTextEdit
(die heimlich eineQAbstractScrollArea
), aber anschauen kann man sich diesizeHint()
undminimumSizeHint()
Implementierungen für die inspiration (die einen auch fürQComboBox
, die einen Modus, genau das zu tun, was Sie wollen:QComboBox::AdjustToContents
.EDIT: Ihr zwei usecases (QTextBrowser w/o scrollbars und QLineEdit statt QLabel nur für den text auswählen) können gelöst werden, indem mit einem QLabel und neu genug ist Qt. QLabel gewonnen hat, der sowohl link-Klick-Benachrichtigung und die so genannte "text-Interaktion flags" (eine von denen ist TextSelectableByMouse) in Qt 4.2. Der einzige Unterschied, den ich machen konnte, ist, dass das laden von neuen Inhalten nicht automatisch, es gibt keine Geschichte, und es gibt keine micro focus hinting (ie. Navigation mit der Tabulatortaste von link zu link) in QLabel.
Ich habe das gleiche problem und müssen QLabel zu unterstützen WrapAtWordBoundaryOrAnywhere wirklich.
InformationsquelleAutor Marc Mutz - mmutz
Für die QTextBrowser Fall sollten Sie in der Lage sein, um die Größe des Dokuments mit
nachdem Sie die html -, und dann Größenänderung die QTextBrowser danach.
InformationsquelleAutor Kristian
Vielleicht werfen Sie einen Blick auf Python-QT-Automatische Widget Resizer. Es ist in python geschrieben, aber es kann Ihnen einige Ideen, wie man über das tun, was Sie brauchen.
InformationsquelleAutor hollahhoo
ich einen ähnlichen Effekt erzielen, indem mit Hilfe der folgenden C++ - Klasse:
textedit.h
textedit-inl.h
textedit.cpp
z.B. den Aufruf
TextEdit::fitToDocument( Qt::Horizontal )
wird die widget-Breite auf eine Feste Breite gerade groß genug, um das Dokument und seine Umgebung (z.B. eine vertikale Bildlaufleiste, wenn es eine ist). wenn Ihr Ziel ist es, diese passieren, wenn sich der Inhalt ändern, verbinden Sie dasQTextEdit::textChanged()
signal an einen slot, die AnrufeTextEdit::fitToDocument()
.als für Ihr Problem mit
QLabel
, die Lösung ist ganz einfach: rufen SieQLabel::setTextInteractionFlags( Qt::LinksAccessibleByMouse | Qt::TextSelectableByMouse )
.InformationsquelleAutor nisavid
Ok implementieren
sizeHint()
Methode. Und jedes mal, wenn Sie Ihre Inhalte ändern Sie die Größe nennenupdateGeometry()
Wenn sich Inhalte ändern, ohne die Größe zu verwenden
update()
. (updateGeometry()
automatisch aufrufenupdate()
).InformationsquelleAutor przemo_li