2015-05-02 16 views
5

Sto creando un nuovo widget sottoclasse la classe QWidget. Mi piacerebbe essere in grado di impostare un rapporto (per la sua altezza e la sua larghezza) per questo widget, che sarà sempre mantenuto.Mantenere le proporzioni di un QWidget sottoclassato durante il ridimensionamento

Per questo, ho sempre cercato, utilizzando la documentazione Qt5, Google e Stackoverflow. Ovviamente, ho trovato risposte: in particolare, this one. Ma, purtroppo, nemmeno uno è pienamente efficace:

  • Impostazione del sizeIncrement fa assolutamente nulla, anche se il widget è una finestra
  • ho cercato di sovraccaricare resizeEvent, ma io davvero non so come fare questo ...
  • Se seguo this answer, due cose:

    1. Se il widget è una finestra di primo livello, il rapporto non è mantenuta a tutti, posso ridimensionarla come voglio.
    2. Se metto questo widget in un layout, se solo aumento sia la larghezza che l'altezza della finestra, il rapporto viene mantenuto. Ma non appena aumento la larghezza o l'altezza a molto, il widget viene appiattito. Invece, mi piacerebbe che il layout regolasse automaticamente le sue dimensioni per mantenere il rapporto del widget.

Così, come potrei riuscire a mantenere le proporzioni di un QWidget sottoclasse?

+0

Ecco un altro post su cui ho lavorato che funziona bene, almeno per 'QLabel's. http://stackoverflow.com/questions/8211982/qt-resizing-a-qlabel-contain-a-qpixmap-while-keeping-its-aspect-ratio – phyatt

+0

Hai provato a reimplementare 'QWidget :: heightForWidth()'? Ciò consente di specificare un rapporto aspetto. Se ciò non è sufficiente, crea un QWidget "fittizio" per tenere il tuo widget in un QGridLayout 3x3, con il tuo widget nel mezzo e QSpacerItem attorno ai bordi (vedi 'QGridLayout :: addItem()'). QSpacerItem può fornire la spaziatura aggiuntiva (o essere ridimensionata a 0) quando necessario durante il ridimensionamento. Probabilmente dovresti usare 'QGridLayout :: setColumnStretch()' e 'QGridLayout :: setRowStretch()'. – Anthony

+0

Grazie a entrambi, le tue soluzioni funzionano, ma lo stesso problema rimane: se provo ad aumentare solo la larghezza del widget, le proporzioni non vengono più mantenute. – Spirine

risposta

5

Creare un widget padre (ad esempio, AspectRatioWidget) in cui posizionare il widget. Per il widget padre, sottoclasse QWidget e assegnagli un QBoxLayout. Metti il ​​tuo widget al centro e QSpacerItem su entrambi i lati. Quindi nel widget del genitore QWidget::resizeEvent regolare la direzione e gli allungamenti secondo necessità. Ho fornito un esempio qui sotto. Per utilizzare, basta creare un'istanza di AspectRatioWidget e passare il costruttore un puntatore al widget e le proporzioni desiderate.

// header 
class AspectRatioWidget : public QWidget 
{ 
public: 
    AspectRatioWidget(QWidget *widget, float width, float height, QWidget *parent = 0); 
    void resizeEvent(QResizeEvent *event); 

private: 
    QBoxLayout *layout; 
    float arWidth; // aspect ratio width 
    float arHeight; // aspect ratio height 
}; 

// cpp 
AspectRatioWidget::AspectRatioWidget(QWidget *widget, float width, float height, QWidget *parent) : 
    QWidget(parent), arWidth(width), arHeight(height) 
{ 
    layout = new QBoxLayout(QBoxLayout::LeftToRight, this); 

    // add spacer, then your widget, then spacer 
    layout->addItem(new QSpacerItem(0, 0)); 
    layout->addWidget(widget); 
    layout->addItem(new QSpacerItem(0, 0)); 
} 

void AspectRatioWidget::resizeEvent(QResizeEvent *event) 
{ 
    float thisAspectRatio = (float)event->size().width()/event->size().height(); 
    int widgetStretch, outerStretch; 

    if (thisAspectRatio > (arWidth/arHeight)) // too wide 
    { 
     layout->setDirection(QBoxLayout::LeftToRight); 
     widgetStretch = height() * (arWidth/arHeight); // i.e., my width 
     outerStretch = (width() - widgetStretch)/2 + 0.5; 
    } 
    else // too tall 
    { 
     layout->setDirection(QBoxLayout::TopToBottom); 
     widgetStretch = width() * (arHeight/arWidth); // i.e., my height 
     outerStretch = (height() - widgetStretch)/2 + 0.5; 
    } 

    layout->setStretch(0, outerStretch); 
    layout->setStretch(1, widgetStretch); 
    layout->setStretch(2, outerStretch); 
} 
Problemi correlati