Domanda

Come potrei ridimensionare il widget quando il bambino Riprova è nascosto in modo che appaia come nella prima immagine?Il layout principale è un QVBoxLayout, anche il retry child è un widget con un QVBoxLayout.

Ho provato quanto segue:

  • aggiornamento()
  • aggiornamentoGeometria()
  • setGeometria(bambiniRect())
  • layout()->attiva()

sul widget principale non appena ho impostato il widget Riprova su nascosto.Devo intercettare qualche evento per fare questo?

È stato utile?

Soluzione

La funzione adjustSize può fare quello che vuoi.

Altri suggerimenti

Ecco un esempio di base che non auto-ridimensionamento su widget di Mostra / Nascondi.

file dialog.h:

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include <QtGui>

class dialog : public QDialog
{
    Q_OBJECT


public:
    explicit dialog(QWidget *parent = 0)
    {

        vlayout.addWidget(&checkbox);
        vlayout.addWidget(&label);
        label.setText("Label");

        setLayout(&vlayout);
        this->layout()->setSizeConstraint(QLayout::SetFixedSize); // !!! This is the what makes it auto-resize

        checkbox.setChecked(true);
        connect(&checkbox,SIGNAL(toggled(bool)),&label,SLOT(setVisible(bool)));
    }

private:
    QVBoxLayout vlayout;
    QCheckBox checkbox;
    QLabel label;

};

#endif // DIALOG_H

e main.c

#include <QApplication>
#include "dialog.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    dialog d;
    d.show();
    return a.exec();
}

Questa è quella che ho appena messo a punto una risposta per !!! (Nota: questo sarà data in forma PyQt4)

ho avuto bisogno la capacità di ridimensionare la mia finestra app quando visualizzare o nascondere i pannelli aggiuntivi. Tuttavia, in passato ho finito appena la riconfigurazione del flusso UI e / o di lavoro in modo che ri-dimensionamento della finestra non era necessario. Tuttavia ora è un must necessario.

La finestra può essere ridimensionato durante la sua creazione. La finestra può essere ridimensionato direttamente (ad esempio self.resize (XSize, YSize) Tuttavia, se si crea alcune righe di codice che catturano le dimensioni necessarie, nasconde la sezione desiderata, ricalcola quale sia la dimensione dovrebbe essere, la ri-size sembra non prendere affatto.

(esempio)

curHgt = self.size().height()
curWth = self.size().width()
myFrmHgt = self.ui.reviewFrm.size().height()
self.ui.reviewFrm.hide()
self.resize( curWth, (curHgt - myFrmHgt ) )

Niente. Non funziona. Perché no?

la caccia di oggi per una risposta ancora non è venuto su con una risposta valida. Ci sono diverse offerte per le opzioni. Caccia in alto nella gerarchia del widget, invalidare, adjustSize. Un layout piuttosto esaustivo agitazione che proprio non funziona se si sta tentando di ridimensionare la finestra principale. C'era anche una risposta superiore di dire per impostare il vincolo a FixedSize. Ma che invece sconfigge l'intero scopo, un po 'come dire a tagliare la mano fuori al polso se si dispone di un chiodo blocco.

Comunque ho inciampo in qualcuno che ha avuto un certo successo con scavare e scoprire che il motivo per il ridimensionamento non sta prendendo piede è a causa della coda di eventi Pubblicato in grado di ripristinare il ridimensionamento.

La sua soluzione era quella di eseguire i QApplication.sendPostedEvents () appena prima di fare la vostra applicazione ri-dimensioni, in modo che gli eventi in coda non reimpostare la finestra. Sì e no. Sì, questa è la soluzione, e sono sicuro che ci sia un modo più bello di farlo, ma è necessario per scuotere davvero il coda fuori come un rullo di vernice lavata prima.

Ecco il mio semplice frammento che ho creato che finora sembra essere solido.

result = [ self.size().width(), self.size().height() ]
if self.ui.reviewFrm.isVisible():
    result[1] -= self.ui.reviewFrm.size().height()
    self.ui.reviewFrm.hide()

    while self.size().height() > result[1]:
        self.appy.sendPostedEvents()
        self.resize( result[0], result[1] )

No. Non è abbastanza. Tuttavia, al massimo ho visto solo scuotere il rullo di vernice due volte prima degli eventi Pubblicato consentiti per la finestra da ridimensionare. Non c'è bisogno di bloccare vincoli o scuotere i widget genitore o salire nella gerarchia in cerca di suggerimenti per le dimensioni.

Il mio problema era leggermente diverso in quanto avevo un QWidget di livello superiore (invece di un QDialog o un QMainWindow) che aveva dei figli all'interno di un layout.Quando quei bambini si stavano ridimensionando più grandi, il QWidget si ridimensionava per adattarsi, ma non quando diventavano PIÙ PICCOLO.Proprio come sopra, l'area aveva solo spazio vuoto.Finalmente ho trovato una soluzione:

Il layout utilizzato nel mio QWidget aveva una proprietà chiamata setSizeConstraint().Normalmente è impostato su "QLayout::SetDefaultConstraint", che influisce semplicemente sulla "minimumSize" del QWidget che lo possiede.Invece, ho scelto "QLayout::SetFixedSize" che ha fatto sì che il layout regolasse il file fisso dimensione del QWidget proprietario, rendendolo effettivamente PIÙ PICCOLO quando necessario.

Se si desidera che il widget di essere ridimensionabile dopo aver impostato QLayout::SetFixedSize sarà anche necessario sovrascrivere QWidget::resizeEvent().

void resizeEvent(QResizeEvent* event) override {
    QWidget::resizeEvent(event);
    layout()->setSizeConstraint(QLayout::SetMinAndMaxSize);
};
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top