2015-05-02 23 views
5

QWidget sınıfını alt sınıflara ayırarak yeni bir pencere öğesi oluşturuyorum. Her zaman korunacak olan bu widget için bir oran (yüksekliği ve genişliği için) ayarlayabilmek istiyorum.Yeniden boyutlandırma sırasında alt sınıf bir QWidget'ın en boy oranını koruyarak görüntüle

Bunun için her zaman, Qt5 belgelerini, Google ve Stackoverflow'u kullanarak arama yaptım. Açıkçası, cevapları buldum: özellikle this one. Ama ne yazık ki bir tane bile tam etkilidir:

  • Ayar sizeIncrement Widget Ben resizeEvent aşırı çalışan bir pencere
  • , ama gerçekten nasıl yapılacağını bilmiyorsanız bile, tamamen hiçbir şey yapmaz Bu ... Ben this answer, iki şey izlerseniz
  • : istediğim gibi Widget üst düzey pencere ise

    1. oran hiç korunmaz, bunu yeniden boyutlandırabilirsiniz.
    2. Bu pencere öğesi bir düzende yerleştirilirse, yalnızca pencerenin hem genişliğini hem de yüksekliğini artırırsam, oran korunur. Ancak genişliği veya yüksekliği çok artırdığım anda, widget düzleşir. Bunun yerine, düzenin, widget'in oranını korumak için boyutunu otomatik olarak ayarlamasını isterim.

Yani, nasıl bir subclassed QWidget en boy oranını korumak için yönetmek olabilir?

+0

Çalıştığım başka bir gönderi, en azından QLabel 'ler için iyi çalışıyor. http://stackoverflow.com/questions/8211982/qt-resizing-a-qlabel-containing-a-qpixmap-while-keeping-its-aspect-ratio – phyatt

+0

"QWidget :: heightForWidth()" ifadesini yeniden denemeyi denediniz mi? Bu, bir en boy oranı belirtmenize izin verir. Bu yeterli değilse, widget'ınızı 3x3 QGridLayout'ta, widget'ınızı ortada ve QSpacerItem'in kenarlarında tutmak için bir "kukla" QWidget oluşturun (bkz. 'QGridLayout :: addItem() '). QSpacerItem'in yeniden boyutlandırırken gerektiğinde fazladan boşluk bırakabilir (veya 0'a kadar boyutlandırılabilir). Muhtemelen 'QGridLayout :: setColumnStretch()' ve 'QGridLayout :: setRowStretch()' kullanmanız gerekir. – Anthony

+0

İkinize de teşekkürler, çözümleriniz işe yarıyor, ancak aynı sorun devam ediyor: Yalnızca widget'ın genişliğini artırmaya çalışırsam, en boy oranı artık korunmaz. – Spirine

cevap

5

Widget'ınızın yerleştirileceği bir ana pencere öğesi (ör., AspectRatioWidget) oluşturun. Üst pencere öğesi için, QWidget alt sınıfı ve ona bir QBoxLayout verin. Widget'ınızı ortasına ve QSpacerItems'in her iki tarafına yerleştirin. Sonra ana pencere öğesinin QWidget::resizeEvent içinde yönünü ayarlayın ve gerektiği gibi uzatın. Aşağıda bir örnek verdim. Kullanmak için AspectRatioWidget örneğini oluşturup kurucunuza widget'ınıza ve istenen en boy oranına bir işaretçi iletmeniz yeterlidir.

// 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); 
} 
İlgili konular