2017-09-08 9 views
-1

私の問題は、QGraphicsViewに比率のサイズを保存させることです。私はKeeping the aspect ratio of a sub-classed QWidget during resize と読んで、QWidgetの配置を助けました。固定比率でQGraphicsViewを配置できません

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 

    QWidget* wid = new QWidget; 
    wid->setStyleSheet("background-color: red"); 

    QWidget* wid2 = new QWidget(wid); 
    QVBoxLayout *vbl = new QVBoxLayout(wid); 

    wid2->setStyleSheet("background-color: yellow"); 
    AspectRatioWidget w(wid2, 4, 3); 
    w.setStyleSheet("background-color: blue"); 

    vbl->addWidget(&w); 

    wid->show(); 

    return a.exec(); 
} 

クラスAspectRatioWidget:

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

Situation when height is too big

Normal ratio

しかし、私は私の要素でそれを実装しようとしたとき、AspectRatioWidgetは見えませんでした。

//main: 
int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    wboard w; 
    w.show(); 

    return a.exec(); 
} 

//and constructor: 

wboard::wboard(QWidget *parent) : 
QWidget(parent) 
{ 
    QWidget* wid= new QWidget(this); 
    wid->setStyleSheet("background-color: red"); 

    QVBoxLayout *vbl = new QVBoxLayout(this); 
    vbl->addWidget(wid); 

    QWidget *window = new QWidget(wid); 
    window->setStyleSheet("background-color: yellow"); 
    QVBoxLayout* vbl2 = new QVBoxLayout(wid); 

    AspectRatioWidget w(window, 3, 1); 
    w.setStyleSheet("background-color: blue"); 

    vbl2->addWidget(&w); 
} 

赤と黄色のウィジェットはありません。赤色のみです。

コードは非常にsimularでupperはidkです。

答えて

0

問題なく、AspectRatioWidgetをoperator newなしで作成することが問題でした。 最初の例では、AspectRatioWidgetは、プログラムイベントの全サイクルにわたって持続しました。 2番目の例では、そのオブジェクトはwboardのコンストラクタの終了後に削除されました。

関連する問題