webentwicklung-frage-antwort-db.com.de

Wie kann ich in Qt C++ die Größenänderung eines Fensters einschließlich des Größenänderungssymbols vollständig deaktivieren, wenn der Mauszeiger über den Rand zeigt?

Ich habe verwendet: setFixedSize(size());, um die Größenänderung des Fensters zu stoppen, aber die Größenänderungspfeile werden weiterhin angezeigt, wenn sich der Mauszeiger über dem Rand des Fensters befindet.

Gibt es eine bessere Möglichkeit, die Fenstergröße zu deaktivieren, um zu vermeiden, dass beim Überschreiten der Grenze die Pfeile angezeigt werden?

33
Klasik

Versuchen Sie etwas so:

this->statusBar()->setSizeGripEnabled(false);

Wenn dies nicht funktioniert, müssen Sie nur feststellen, welches Widget QSizeGrip aktiviert. Sie können dies tun, indem Sie einen Ereignisfilter in Ihrer App installieren und versuchen, das mouseMoveEvent des QSizeGrip abzufangen. Dann debuggen Sie das übergeordnete Widget.

Hier ist ein Beispiel für die eventFilter-Funktion, die Sie verwenden könnten:

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

Sie könnten wahrscheinlich auch den Show-Event sehen, es liegt an Ihnen.

18
thuga

Qt hat dafür ein windowFlag namens Qt::MSWindowsFixedSizeDialogHint. Abhängig davon, was Sie genau möchten, möchten Sie dieses Flag mit Qt::Widget, Qt::Window oder Qt::Dialog kombinieren.

void MyDialog::MyDialog()
{
  setWindowFlags(Qt::Dialog | Qt::MSWindowsFixedSizeDialogHint);

  ...
}
29
dsonck92

Einliner, wenn Sie genau wissen, wie groß das Fenster sein soll:

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

Wenn Sie Qt Designer verwenden, setzen Sie die "sizePolicy" -Eigenschaft Ihres Fensters in vertikaler und horizontaler Richtung auf "Fixed" und setzen Sie minimale und maximale Abmessungen auf gleiche Werte. Klicken Sie dann mit der rechten Maustaste in das Fenster und wählen Sie "Remove Status Bar" (Statusleiste entfernen), um den "Größengriff" in der rechten unteren Ecke zu entfernen. Oder entfernen Sie nur den Größengriff mithilfe des Vorschlags von francis (und nicht der gesamten Statusleiste). 

7
BuvinJ

Ich habe festgestellt, dass der Aufruf von setSizeConstraint (QLayout :: SetFixedSize) im Layout für mich am besten funktioniert hat. Insbesondere habe ich aus einem QMainWindow-Konstruktor aufgerufen:

this->layout()->setSizeConstraint(QLayout::SetFixedSize);

Hier ist ein Link zu den Dokumenten: http://doc.qt.io/qt-4.8/qlayout.html#SizeConstraint-enum

(Ich verwende Qt 4.8.) 

Da dies auch eine einfache Lösung für die Beantwortung der OP-Frage war, dachte ich, ich würde es anderen mitteilen. Es scheint, dass es viele Möglichkeiten gibt, dies in Qt zu erreichen, aber möglicherweise sind nicht alle für jede Situation ideal. Ich habe einige der anderen Optionen ausprobiert, die hier veröffentlicht wurden, aber sie hatten verschiedene Probleme oder Einschränkungen, mit denen ich in meiner eigenen Situation nicht zufrieden war.

7
Aaron

Wenn Sie die Werte für Breite und Höhe aus dem Benutzeroberflächenformular ohne manuelle Angabe abrufen möchten, können Sie den folgenden Befehl in Ihre Projektklasse einfügen:

this->setFixedSize(this->width(), this->height());

Sie können auch separate Parameter für Breite und Höhe (falls erforderlich) festlegen mit:

this->setFixedWidth(this->width());
this->setFixedHeight(this->height());
3
ramsudharsan

Sie können in Qt5 folgenden Code verwenden

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

Dabei ist sz ein QSize-Objekt.

3
Boris Ivanov

Benutzen 

setMinimumSize (QSize (width_px, height_px))

setMaximumSize (QSize (width_px, height_px))

wo beide Methodendie gleichesize haben. Der Cursor für die Größenänderung wird nicht angezeigt. Das Fenster wird also nicht skaliert/maximiert.

3
Tushar

Sie können auch etwas tun wie:

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

Die Pfeile sind auch weg.

3
GorudoYami

Wenn Sie Qt Creator verwenden, können Sie try verwenden, um dieselbe Width und Height des Fensters in der properties von geometry, minimumSize und maximumSize anzugeben.

3
Aleksey Bykov

Dies hat mir bei Qt Creator 3.1.1 geholfen:

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

Die Größe ist bis zum Aussehen nicht bekannt und kann auch je nach Systemeinstellungen variieren (100%, 125%, 150%). Sie können also etwas versuchen (es verdeckt auch den Größenänderungs-Cursor):

void QWidget::showEvent(QShowEvent *event)
{
    // disable vertical resize
    int height = this->height();
    if (height != minimumHeight() || height != maximumHeight()) {
        setMinimumHeight(height);
        setMaximumHeight(height);
    }
}
0
LoneSR

Um die Größe des Fensters nicht zu ändern, fügen Sie diese Zeile hinzu:

setFixedSize(width(), height());

in Ihrem QMainWindow-Konstruktor nach der Zeile: ui->setupUi(this);.

0
Nikos

Die einzige Lösung, die unter Windows 10 wirklich funktioniert hat, ist die Verwendung der 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

Wenn jemand dasselbe sucht, aber in Python:

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