-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
しかし、私は私の要素でそれを実装しようとしたとき、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です。