Не удается разместить QGraphicsView с фиксированным соотношением

Моя проблема заключается в том, чтобы заставить QGraphicsView сохранять свой размер соотношения. Я прочитал Сохранение соотношения сторон суб- классифицировал QWidget во время изменения размера, и это помогло мне разместить QWidget в примере.

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

Ситуация, когда высота слишком велика

Нормальное соотношение

Но когда я попытался реализовать это с помощью своих элементов, 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);
}

Никаких синих и желтых виджетов, только красный.

Код очень похож на верхний, но это не так.


person MrTremolo    schedule 08.09.2017    source источник


Ответы (1)


Хорошо, проблема заключалась в создании AspectRatioWidget без оператора new. В первом примере AspectRatioWidget сохранялся на протяжении всего цикла событий программы. Во втором примере этот объект удален после завершения конструктора wboard.

person MrTremolo    schedule 08.09.2017