@JonB MyCanvas is a UI Widget that I have promoted. Simply that. The full code (that works) is posted below; note that is only one update(). It fails when the emit is moved before the first declaration of QPainter.
class MyCanvas : public QWidget
{
Q_OBJECT
public:
explicit MyCanvas(QWidget *parent = nullptr);
void paintEvent(QPaintEvent *e);
void resizeEvent(QResizeEvent *e);
qreal drawableAreaAspectRatio;
QPointF drawableAreaCenter;
qreal drawableAreaHeight;
qreal drawableAreaWidth;
qreal drawableAspectRatio{1.0};
QRectF drawableAreaRectangle;
signals:
void message(QString st);
public slots:
void newAspectRatio(qreal ar);
};
MyCanvas::MyCanvas(QWidget *parent) : QWidget(parent)
{
}
void MyCanvas::paintEvent(QPaintEvent *e)
{
QPainter p(this);
QString st;
p.drawRect(drawableAreaRectangle);
p.setPen(Qt::red);
if (drawableAspectRatio < drawableAreaAspectRatio){
st.append("Height Constrained ");
qreal widthDelta = drawableAreaHeight * drawableAspectRatio;
qreal wd = widthDelta * 0.5;
qreal cx = drawableAreaCenter.rx();
p.drawRect(int(cx - wd), 20, int(wd + wd), int(drawableAreaHeight));
}else{
st.append("Width Constrained ");
qreal heightDelta = drawableAreaHeight / drawableAspectRatio;
qreal hd = (heightDelta * 0.5);
qreal w = drawableAreaWidth;
qreal cy = drawableAreaCenter.ry();
p.drawRect(20.0, int(cy - hd), int(w), int(hd + hd));
}
p.end();
st.append("AspectRatios Canvas = ");
st.append(QString::number(drawableAreaAspectRatio));
st.append(" Rectangle = ");
st.append(QString::number(drawableAspectRatio));
emit message(st);
}
void MyCanvas::resizeEvent(QResizeEvent *e)
{
drawableAreaRectangle = QRectF(this->rect());
drawableAreaAspectRatio = drawableAreaRectangle.width()/drawableAreaRectangle.height();
drawableAreaRectangle.adjust(20.0, 20.0, -20.0, -20.0);
drawableAreaCenter = drawableAreaRectangle.center();
drawableAreaHeight = drawableAreaRectangle.height();
drawableAreaWidth = drawableAreaRectangle.width();
}
void MyCanvas::newAspectRatio(qreal ar)
{
drawableAspectRatio = ar;
this->update();
}