J'ai utilisé: setFixedSize(size());
pour arrêter le redimensionnement de la fenêtre, mais les flèches de redimensionnement apparaissent toujours lorsque la souris survole le bord de la fenêtre.
Existe-t-il un meilleur moyen de désactiver le redimensionnement de la fenêtre pour éviter d'afficher les flèches lors du franchissement de la frontière?
Essayez quelque chose comme ça:
this->statusBar()->setSizeGripEnabled(false);
Si cela ne fonctionne pas, tout ce que vous avez à faire est de détecter quel widget active/ QSizeGrip . Vous pouvez le faire en installant un filtre d'événements sur votre application et en essayant d'attraper le mouseMoveEvent du QSizeGrip. Puis déboguez son widget parent.
Voici un exemple de la fonction eventFilter que vous pourriez utiliser:
bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
if(event->type() == QEvent::MouseMove)
{
QSizeGrip *sg = qobject_cast<QSizeGrip*>(obj);
if(sg)
qDebug() << sg->parentWidget();
}
return false;
}
Vous pourriez probablement aussi assister à son spectacle, c'est à vous de décider.
Qt a un windowFlag appelé Qt::MSWindowsFixedSizeDialogHint
pour cela. Selon ce que vous voulez exactement, vous souhaitez combiner cet indicateur avec Qt::Widget
, Qt::Window
ou Qt::Dialog
.
void MyDialog::MyDialog()
{
setWindowFlags(Qt::Dialog | Qt::MSWindowsFixedSizeDialogHint);
...
}
One-Liner si vous savez exactement quelle est la taille de la fenêtre:
this->setFixedSize(QSize(750, 400));
Si vous utilisez Qt Designer, définissez les propriétés "sizePolicy" de votre fenêtre sur "Fixe" dans les directions verticale et horizontale et définissez des dimensions égales pour les dimensions minimale et maximale. Cliquez ensuite avec le bouton droit de la souris sur la fenêtre et sélectionnez "Supprimer la barre d'état" pour supprimer la "taille" dans le coin inférieur droit. Ou bien, supprimez simplement la taille de la poignée via la suggestion de francis (plutôt que la barre de statut entière).
J'ai trouvé que l'appel de setSizeConstraint (QLayout :: SetFixedSize) sur la présentation fonctionnait le mieux pour moi. Plus précisément, à partir d'un constructeur QMainWindow, j'ai appelé:
this->layout()->setSizeConstraint(QLayout::SetFixedSize);
Voici un lien vers la documentation: http://doc.qt.io/qt-4.8/qlayout.html#SizeConstraint-enum
(J'utilise Qt 4.8.)
Comme il s’agissait également d’un moyen simple de résoudre la question du PO, j’ai pensé que je la partagerais avec les autres. Il semble qu’il existe de nombreuses façons d’y parvenir en Qt, mais toutes ne sont pas nécessairement idéales pour toutes les situations. J'ai essayé plusieurs des autres options publiées ici, mais elles posaient divers problèmes ou contraintes qui ne me convenaient pas dans ma propre situation.
Si vous souhaitez obtenir les valeurs de largeur et de hauteur à partir du formulaire de l'interface utilisateur sans spécifier manuellement, vous pouvez ajouter la commande suivante dans votre classe de projet:
this->setFixedSize(this->width(), this->height());
Vous pouvez également définir des paramètres distincts pour la largeur et la hauteur (si nécessaire) avec:
this->setFixedWidth(this->width());
this->setFixedHeight(this->height());
Vous pouvez utiliser le code suivant en Qt5
this->setMinimumSize(sz);
this->setMaximumSize(sz);
Où sz est un objet QSize.
Utilisation
setMinimumSize (QSize (width_px, height_px))
setMaximumSize (QSize (width_px, height_px))
où les deux méthodes ontsamesize.Vous ne verrez pas le curseur de redimensionnement et la fenêtre ne sera donc pas redimensionnée/maximisée.
Aussi, vous pouvez simplement faire quelque chose comme:
this->setFixedWidth(int);
this->setFixedHeight(int);
Les flèches sont partis aussi.
Si vous utilisez Qt Creator , vous pouvez essayer de spécifier les mêmes Width
et Height
de la fenêtre dans les properties
de geometry
, minimumSize
et maximumSize
.
Cela m'a aidé avec Qt Creator 3.1.1:
this->setFixedSize(this->maximumSize());
La taille n'est pas connue avant l'apparition et peut varier en fonction des paramètres système (100%, 125%, 150%), vous pouvez donc essayer quelque chose comme ceci (cela masque également le curseur de redimensionnement):
void QWidget::showEvent(QShowEvent *event)
{
// disable vertical resize
int height = this->height();
if (height != minimumHeight() || height != maximumHeight()) {
setMinimumHeight(height);
setMaximumHeight(height);
}
}
La seule solution qui a vraiment fonctionné pour moi sur Windows 10 utilise WinAPI:
#ifdef Q_OS_WIN
#include <windows.h>
...
SetWindowLong((HWND) window->winId(), GWL_STYLE, GetWindowLong((HWND) window->winId(), GWL_STYLE)&~WS_SIZEBOX);
#endif
Si quelqu'un cherche la même chose, mais en Python:
MainWindow.setWindowFlags(QtCore.Qt.MSWindowsFixedSizeDialogHint)