web-dev-qa-db-fra.com

Dans Qt C++, comment puis-je désactiver complètement le redimensionnement d'une fenêtre, y compris l'icône de redimensionnement, lorsque la souris survole la bordure?

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?

33
Klasik

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.

18
thuga

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);

  ...
}
29
dsonck92

One-Liner si vous savez exactement quelle est la taille de la fenêtre:

this->setFixedSize(QSize(750, 400));
13
TranslucentCloud

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). 

7
BuvinJ

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.

7
Aaron

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());
3
ramsudharsan

Vous pouvez utiliser le code suivant en Qt5

this->setMinimumSize(sz);
this->setMaximumSize(sz);

Où sz est un objet QSize.

3
Boris Ivanov

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.

3
Tushar

Aussi, vous pouvez simplement faire quelque chose comme:

this->setFixedWidth(int);
this->setFixedHeight(int);

Les flèches sont partis aussi.

3
GorudoYami

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.

3
Aleksey Bykov

Cela m'a aidé avec Qt Creator 3.1.1:

this->setFixedSize(this->maximumSize());
3
Rachael

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);
    }
}
0
LoneSR

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
0
Œlrim

Si quelqu'un cherche la même chose, mais en Python:

    MainWindow.setWindowFlags(QtCore.Qt.MSWindowsFixedSizeDialogHint)
0
Cherry Red