PyQt: comment gérer le redimensionnement automatique des widgets lors de leurs changements de contenu
Je vais avoir quelques problèmes avec la taille de qt4 widgets lorsque leur contenu est modifié.
Je vais illustrer mes problèmes avec deux scénarios simples:
Scénario 1:
J'ai un QLineEdit widget. Parfois, quand je suis en changer le contenu à l'aide de QLineEdit.setText(), une ligne de chaîne ne rentre pas dans le widget à sa taille actuelle plus. Je dois sélectionner le widget et utilisez les touches fléchées pour faire défiler la chaîne dans les deux directions afin de tout voir.
Scénario 2:
J'ai un QTextEdit widget. Parfois, quand je suis en changer le contenu à l'aide de QTextEdit.setHtml(), le rendu du contenu HTML ne rentre pas dans le widget à sa taille actuelle plus. Le widget affiche horizontal et/ou vertical des barres de défilement et je peux les utiliser pour faire défiler le contenu HTML.
Ce que je veux dans de tels scénarios est d'avoir une certaine logique qui décide si, après une modification du contenu, le nouveau contenu ne rentre pas plus dans le widget et augmenter automatiquement la taille de widget, donc tout adaptée.
Comment ces scénarios sont-elles traitées?
Je suis l'aide de PyQt4.
Edit: après lecture à la fois le commentaire et la première réponse (qui mentionne la saisie du contenu dans le widget), je suis allé sur la question une fois de plus. J'ai été désagréablement surpris de découvrir une horrible faute de frappe. Je voulais dire QTextBrowser quand j'ai écrit QTextEdit, mes excuses pour vous induire en erreur. C'est: j'ai un widget qui affiche le code HTML le code que je vais changer et je voudrais le widget de croître suffisamment pour afficher tout ce que sans avoir des barres de défilement.
Comme pour QLineEdit au lieu de QLabel - je suis allé pour QLineEdit depuis que je l'ai remarqué, je ne peux pas sélectionner le texte à partir d'un QLabel avec la souris pour copier. Avec QLineEdit c'est possible.
OriginalL'auteur | 2009-07-20
Vous devez vous connecter pour publier un commentaire.
Je suis répondeur en C++ ici, puisque c'est ce que je suis plus familier avec, et votre problème n'est pas spécifique à PyQt.
Normalement, vous avez juste besoin d'appeler
QWidget::updateGeometry()
lorsque lesizeHint()
ont peut-être changé, tout comme vous avez besoin d'appelerQWidget::update()
lorsque le contenu peut avoir changé.Votre problème, cependant, est que les
sizeHint()
ne change pas lorsque le texte est ajouté àQLineEdit
etQTextEdit
. Pour une raison: les Gens n'attendent pas de leurs boîtes de dialogue de croissance-comme-ils-type 🙂Cela dit, si vous voulez vraiment pousser-as-you-type de comportement dans ces widgets vous avez besoin d'hériter d'eux et de les ré-écrire
sizeHint()
etminimumSizeHint()
de retourner la plus grande taille, et potentiellementsetText()
,append()
etc. pour appelerupdateGeometry()
de sorte que le sizehint changement est remarqué.La sizehint calcul ne sera pas tout à fait triviaux, et sera plus facile pour
QLineEdit
que pourQTextEdit
(qui est secrètement unQAbstractScrollArea
), mais vous pouvez toujours regarder lasizeHint()
etminimumSizeHint()
implémentations pour l'inspiration (également l'un pourQComboBox
, qui a un mode de faire exactement ce que vous voulez:QComboBox::AdjustToContents
.EDIT: Vos deux usecases (QTextBrowser w/o barres de défilement et QLineEdit au lieu de QLabel juste pour la sélection du texte) peut être résolu en utilisant un QLabel et une version suffisamment récente de Qt. QLabel a gagné à la fois de lien en cliquant sur la notification et la soi-disant "text-interaction des drapeaux" (dont l'un est TextSelectableByMouse) dans Qt 4.2. La seule différence que j'ai pu faire est que le chargement d'un nouveau contenu n'est pas automatique, il n'y a pas d'histoire, et il n'y a pas de micro focus allusion (ie. la tabulation d'un lien) dans le QLabel.
Je vais avoir le même problème et avez besoin d'QLabel pour soutenir WrapAtWordBoundaryOrAnywhere vraiment.
OriginalL'auteur Marc Mutz - mmutz
Pour la QTextBrowser cas, vous devriez être en mesure d'obtenir la taille du document à l'aide
après la définition de l'html, et ensuite le transformer le QTextBrowser par la suite.
OriginalL'auteur Kristian
Peut-être jeter un oeil à Python QT Automatique Widget Resizer. Il est écrit en python, mais il peut vous donner quelques idées sur la façon de faire ce dont vous avez besoin.
OriginalL'auteur hollahhoo
je obtenir un effet similaire à l'aide de la classe C++:
textedit.h
textedit-inl.h
textedit.cpp
par exemple, l'appel
TextEdit::fitToDocument( Qt::Horizontal )
va définir le widget de la largeur d'une largeur fixe exactement suffisamment grand pour contenir le document et de son environnement (par exemple, une barre de défilement verticale, si il y en a un). si votre objectif est de voir cela se produire chaque fois que le contenu change, connectez leQTextEdit::textChanged()
signal à un slot qui appelleTextEdit::fitToDocument()
.comme pour votre problème avec
QLabel
, la solution est simple: appelezQLabel::setTextInteractionFlags( Qt::LinksAccessibleByMouse | Qt::TextSelectableByMouse )
.OriginalL'auteur nisavid
Ok mettre en œuvre
sizeHint()
méthode. Et à chaque fois que votre contenu de changer la taille de l'appelupdateGeometry()
Lors de la modification du contenu sans changer la taille de l'utiliser
update()
. (updateGeometry()
appeler automatiquementupdate()
).OriginalL'auteur przemo_li