C++ redimensionner un quai Qt QDockWidget par programmation?
Je viens juste de commencer à travailler sur un nouveau C++/Qt projet. Ça va être un MDI-fondé de l'IDE avec quai des widgets pour des choses comme l'arborescence de l'explorateur d'objets, sortie du compilateur, etc. Une chose est sur écoute-moi jusqu'à présent cependant: je ne peux pas comprendre comment programmatically une QDockWidget
plus petits. Par exemple, cet extrait de code crée mon dock du bas de la fenêtre, "Construire de l'Information":
m_compilerOutput = new QTextEdit;
m_compilerOutput->setReadOnly(true);
dock = new QDockWidget(tr("Build Information"), this);
dock->setWidget(m_compilerOutput);
addDockWidget(Qt::BottomDockWidgetArea, dock);
Lors de son lancement, mon programme ressemble à ceci (gardez à l'esprit que le stade précoce de développement):
Cependant, je veux qu'il apparaisse comme ceci:
Je n'arrive pas à obtenir ce que cela arrive. L'intervalle Qt de Référence sur QDockWidget dit ceci:
Taille personnalisée des conseils, des tailles minimale et maximale et la taille des politiques doivent être mises en œuvre dans l'enfant widget. QDockWidget respecter, en ajustant ses propres contraintes pour inclure l'image et le titre. Les contraintes de taille ne devrait pas être mis sur le QDockWidget lui-même, parce qu'ils changent en fonction de si il est connecté
Maintenant, cela laisse croire qu'une méthode d'aller à ce sujet serait à la sous-classe QTextEdit
et remplacer le sizeHint()
méthode. Cependant, je préfère ne pas le faire juste pour ce but, et je n'ai pas essayé de trouver que, pour être une solution de travail.
J'ai essayé d'appeler dock->resize(m_compilerOutput->width(), m_compilerOutput->minimumHeight())
, appelant m_compilerOutput->setSizePolicy()
avec chacun de ses options de... plus Rien jusqu'à présent n'a affecté la taille. Comme je l'ai dit, je préfère une solution simple en quelques lignes de code pour créer une sous-classe juste pour changer sizeHint()
. Toutes les suggestions sont les bienvenues.
Vous devez vous connecter pour publier un commentaire.
Je suis juste allé à travers ce même processus. Après avoir essayé beaucoup trop de permutations de
resize()
,adjustSize()
et amis sur le quai de widgets et de leurs contenus widget, aucun n'a fonctionné, j'ai fini de sous-classementQListView
et en ajoutant quesizeHint()
méthode.Maintenant il fonctionne comme un charme.
J'ai fait c'est facile:
En-TÊTE:
SOURCE:
QTimer::singleShot
appel à unqApp->processEvents()
. Fonctionne de la même manière. Même ce qui est un méchant hack c'était la seule façon que j'ai trouvée pour redimensionner un quai widget Qt.Il sonne comme le dock widget re-tailles de lui-même à la bonne taille, compte tenu de son enfant widget. À partir de la QDockWidget de la documentation (l'emphase est mienne):
Afin de modifier la taille, ensuite, vous devez re-taille de l'enfant widget.
EDIT: La documentation de Qt peut parfois être trompeuse lorsqu'elle discute de la taille de conseils. Souvent, il est fait référence à tout type de redimensionnement, qu'il soit effectué automatiquement par le widget, ou par programmation.
C'est une vieille question, mais je voulais carillon de mentionner que Qt 5.6 introduit la QMainWindow::resizeDocks fonction pour gérer cela.
Malheureusement, il ne fonctionne pas pour mon cas d'utilisation (en déplaçant le séparateur entre deux QDockWidgets qui ont été séparés en deux QMainWindows::splitDockWidget)
Avez-vous essayé d'appeler
resize()
sur leQTextEdit
à l'intérieur de votre dock widget? Vous pouvez également essayer temporairement le réglage du quai du widget maximum & tailles minimales de la taille que vous voulez qu'il soit, puis restaurer les valeurs d'origine.Vous pourriez faire ceci:
Définir une hauteur maximale pour votre
QTextEdit
:Et puis dans le afficher l'événement de votre fenêtre principale de revenir à l'ancienne taille ou de quelque chose de haut:
C'est tout ce dont vous aurez besoin.
Tests à l'aide de redimensionnement sur la
QDockWidget::widget()
(c'est à dire le widget que leQDockWidget
est la gestion) n'est pas toujours fonctionner comme prévu.Avec un
QDockWidget
sous-classe (DW) dans lequel unQWidget
avec unQHBoxLayout
qui a deux widgets (du panneau de gauche et de droite du panneau) ajouté, qui ont toutes eu leur taille des politiques définies àQSizePolicy::Minimum
, la DW a normalement deux panneau de widgets visible. Lorsque le DW est placé à côté du quai de la demande (QMainWindow
) logement de la manipulation de la DW estdockLocationChanged
signal cache du panneau de gauche et re-tailles de laDW->widget()
à la taille droite du panneau. Lorsque le DW est déplacé par programme pour le dock du bas de la zone de leftPanel est de le rendre visible et le DW remplit toute la largeur de la fenêtre principale (bien sûr). Lorsque le DW est ensuite déplacé par programme à un côté quai le panneau de gauche est caché et le DW est re-taille vers le bas. Cela fonctionne comme prévu. Toutefois, si le DW est glissé, à partir du dock du bas de la zone d'un côté quai, mais le panneau de gauche est masquée et la re-taille, comme auparavant, la DW n'est pas re-taille vers le bas lorsque le déplacement se fait par programmation. Le DW peut être de nouveau manuellement la taille vers le bas en faisant glisser le séparateur handele entre le PS et la fenêtre principale de la zone centrale. Notez que la fenêtre principale de la zone centrale est unQWidget
avoir unQHBoxLayout
avec la taille des politiquesQSizePolicy::Expanding
.Appel
adjustSize
sur la fenêtre principale après la DW a été re-taille n'a pas d'effet. Et ce malgré le DW avoir réimplémentéesizeHint
de retourner sa taille minimale, selon qu'panneau de gauche est visible ou non.Soit j'ai raté quelque chose dans la façon de contrôler la taille de
QDockWidget
(ce qui, compte tenu de la difficulté que j'ai eu de bien comprendre toutes les interactions entre les parties de la disposition du système de gestion, est tout à fait probable), ou leQMainWindow
est ignorant ou en substitution de la mise en page des instructions qui elle est donnée. Examiné de près les flux d'événements au cours de laQDockWidget
opérations de translation suggère celui-ci: Après la fente de la manipulation de ladockLocationChanged
signal a fait son redimensionnement de travail et retour à la boucle d'événements, je peux voir que leQMainWindow
, lorsque l'utilisateur repositionnement est fait, s'applique supplémentaires re-taille des opérations sur leQDockWidget
ainsi, annulation de la logique de l'application qui tente de contrôler la taille du dock. Quelque chose semble anormal dans leQMainWindow
....Si le dockWidgets sont à quai, les tailles sont en contrôle de leur parent. Dans de tels cas, vous pouvez utiliser le
QMainWindow::resizeDocks
fonction.Si flottante, les tailles sont déterminés par leurs enfants.Redimensionner les enfants atteindre votre but.
Le redimensionnement des éléments du dock problème lors de la MainWindow est agrandie est décrit dans QTBUG-16252 (https://bugreports.qt.io/browse/QTBUG-16252)
J'ai trouvé une autre solution de contournement sur elle. Fonctionne pour moi sur l'intervalle QT 5.4.1 minGW sur Windows7.
Il semble que certains widget de restauration de l'état des opérations sont étroitement liées à la QApplication boucle d'événements.
DockWidget tailles sont restaurés correctement UNIQUEMENT lorsque les conditions suivantes sont remplies:
restoreGeometry() est appelée AVANT d'entrer dans QApplication::exec() (par exemple dans le constructeur de ta classe MainWindow)
restoreState() est appelée APRÈS la méthode exec() (par exemple, via QTimer)
Voici mon code: