12
votes

PYQT: Comment gérer le redimensionnement automatique des widgets lorsque leur contenu change

J'ai des problèmes avec la taille des widgets Qt4 lorsque leur contenu change.

Je vais illustrer mes problèmes avec deux scénarios simples:

scénario 1:

J'ai un widget QLineDit. Parfois, lorsque je change de contenu à l'aide de qLineDit.SetText (), la chaîne d'une ligne ne correspond pas au widget à sa taille actuelle. Je dois sélectionner le widget et utiliser 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 widget QtextEdit. Parfois, lorsque je change de contenu à l'aide de qtextedit.Sethtml (), le contenu HTML rendu ne s'intègre plus dans le widget à sa taille actuelle. Le widget commence à afficher des barres de défilement horizontales et / ou verticales et je peux les utiliser pour faire défiler le contenu HTML.

Ce que je voudrais dans de tels scénarios est de disposer d'une logique qui décide si après un changement de contenu, le nouveau contenu ne correspondra plus dans le widget et augmente automatiquement la taille du widget afin que tout soit adapté.

Comment ces scénarios sont-ils traités? J'utilise PYQT4.

Edit: Après avoir lu à la fois le commentaire et la première réponse (qui mentionne le contenu du widget), je suis allé sur la question une fois de plus. J'étais désagréablement surpris de découvrir une typo horrible. Je voulais dire QtextBrowser quand j'ai écrit Qtextedit, mes excuses pour vous tromper. C'est-à-dire que j'ai un widget qui rend le code HTML que je change et que je voudrais que le widget grandisse suffisamment pour tout afficher sans avoir des barres de défilement.

Quant à QLineDit au lieu de Qlabel - Je suis allé pour QLeDedit depuis que j'ai remarqué que je ne peux pas sélectionner de texte d'un qlabel avec la souris pour la copier. Avec qLineDit, il est possible.


1 commentaires

Je voulais juste vous faire savoir que votre question n'a pas été négligée ... J'y ai réfléchi depuis et que je ne puisse penser à un moyen facile de faire ce que vous demandez. Ce n'est tout simplement pas ce que les articles que vous utilisez sont conçus pour. Ce sont des widgets d'entrée et conçus pour permettre de saisir davantage de données que de pouvoir s'adapter confortablement à l'écran. Si vous souhaitez vraiment redimensionner les éléments actuels, essayez d'agrandir Qlabels à l'intérieur d'une mise en page.


5 Réponses :


8
votes

Je réponds en C ++ ici, car c'est ce dont je connais le plus, et votre problème n'est pas spécifique à Pyqt.

Normalement, il vous suffit d'appeler qwidget :: updategeometry () lorsque le type Sizehint () peut avoir changé, comme vous devez appeler qwidget: : mise à jour () lorsque le contenu peut avoir changé.

Votre problème, cependant, est que le Sizehint () ne change pas lorsque le texte est ajouté à qlineDit et qtextedit . Pour une raison: les gens ne s'attendent pas à ce que leurs dialogues se développent-comme-leur-type :)

Cela dit, si vous voulez vraiment un comportement de type à croissance de vous dans ces widgets, vous devez hériter d'eux et réimplément sizehint () et minimumSIZINT () Pour retourner la taille plus grande, et potentiellement settext () , append () et etc. Pour appeler updategometry () donc le changement de taille est révélé.

Le calcul de Sizehint ne sera pas tout à fait trivial et sera bien plus facile pour qlineDit que pour qtextedit (qui est secrètement un qabstractscrollarea ), mais vous pouvez regarder le sizehint () et minimumSizeHint () implémentations pour inspiration (également celui pour qcombobox , qui a un mode Pour faire exactement ce que vous voulez: qcombobox :: régltocontents .

Edit: vos deux usecases (QtextBrowser W / O ScrollBars et QLineDIT au lieu de Qlabel Juste pour la sélection du texte de là) peuvent être résolus à l'aide d'un QLabel et d'un QT assez récent. QLabel a gagné à la fois un clic de liaison et appelé "drapeaux d'interaction de texte" (dont l'une est TextSelectableBymouse) dans Qt 4.2. La seule différence que j'ai pu faire, c'est que le chargement de nouveau contenu n'est pas automatique, il n'y a pas d'historique, et il n'y a pas d'indication de micro-focus (c.-à-d. Tabbing de lien vers le lien) dans Qlabel.


2 commentaires

La raison pour laquelle Qlabel ne fonctionne pas pour moi est le mot wrap. Il refuse de casser un mot distinctif qui est inacceptable lors de l'affichage des liens.


J'ai le même problème et avez besoin de qlabel pour supporter WrapatwordboundRaryOutherywhere vraiment.



2
votes

Pour le boîtier QtextBrowser, vous devriez pouvoir obtenir la taille du document à l'aide de xxx

après avoir défini le code HTML, puis redimensionnez-le du QtextBrowser.


0 commentaires

0
votes

OK implémenter TailleHint () méthode. Et chaque fois que votre contenu modifie la taille de la taille de la taille updateométry () Lorsque le contenu change sans changement d'utilisation de la taille update () . ( UpdateDeDoméométry () Appelez automatiquement Mise à jour () ).


0 commentaires

1
votes

I Atteindre un effet similaire en utilisant la classe C ++ suivante:

textedit.h h2> xxx pré>

textedit-inl.h h2> xxx
#include "textedit.h"

void TextEdit::fitToDocument( Qt::Orientations orientations )
{
  QSize documentSize( document()->size().toSize() );
  QSizePolicy sizePolicy( QSizePolicy::Preferred, QSizePolicy::Preferred );
  if( orientations & Qt::Horizontal ) {
    fittedWidth_ = documentSize.width() + (width() - viewport()->width());
    sizePolicy.setHorizontalPolicy( QSizePolicy::Fixed );
  }
  if( orientations & Qt::Vertical ) {
    fittedHeight_ = documentSize.height() + (width() - viewport()->width());
    sizePolicy.setVerticalPolicy( QSizePolicy::Fixed );
  }
  fittedOrientations_ = orientations;
  setSizePolicy( sizePolicy );
  updateGeometry();
}
Pe_por exemple, appeler textedit :: FITTODOCUMUME (QT :: horizontal) code> définira la largeur du widget à une largeur fixe exactement assez grande pour s'adapter au document et à son environnement (par exemple, une barre de défilement verticale, s'il en existe un). Si votre objectif est d'avoir cela arriver à chaque fois que le contenu change, connectez le signal qtextEdit :: textchanged () code> signal sur une fente qui appelle textedit :: fittodocument () code>. p>

Quant à votre problème avec qlabel code>, la solution est simple: appeler qlabel :: settextexteractionflags (qt :: linksaccessiBymouse | qt :: textselectablebymouse) code>. p> p>


0 commentaires

1
votes

Peut-être jetez un coup d'oeil à Resize de widget automatique Python QT . Il est écrit en Python mais cela peut vous donner des idées sur la façon de faire ce dont vous avez besoin.


1 commentaires

Lien brisé. C'est précisément la raison pour laquelle les "réponses" seules seules sont les fronzées sur ...