Signal emitted in paintEvent stops drawing
-
I added an emit to the beginning of paintEvent and drawing stops, program continues, but if I add it to the end it works fine. Why?
Works void MyCanvas::paintEvent(QPaintEvent *e) { QPainter p(this); p.drawRect(drawableAreaRectangle); drawing code. QString st; st.append("AspectRatios Canvas = "); st.append(QString::number(drawableAreaAspectRatio)); st.append(" Rectangle = "); st.append(QString::number(drawableAspectRatio)); emit message(st); } Does not work void MyCanvas::paintEvent(QPaintEvent *e) { QString st; st.append("AspectRatios Canvas = "); st.append(QString::number(drawableAreaAspectRatio)); st.append(" Rectangle = "); st.append(QString::number(drawableAspectRatio)); emit message(st); QPainter p(this); drawing code } connect(ui->canvas, &MyCanvas::message, this, [this](const QString& st) { this->ui->statusBar->clearMessage(); this->ui->statusBar->showMessage(st, 0);}); -
I added an emit to the beginning of paintEvent and drawing stops, program continues, but if I add it to the end it works fine. Why?
Works void MyCanvas::paintEvent(QPaintEvent *e) { QPainter p(this); p.drawRect(drawableAreaRectangle); drawing code. QString st; st.append("AspectRatios Canvas = "); st.append(QString::number(drawableAreaAspectRatio)); st.append(" Rectangle = "); st.append(QString::number(drawableAspectRatio)); emit message(st); } Does not work void MyCanvas::paintEvent(QPaintEvent *e) { QString st; st.append("AspectRatios Canvas = "); st.append(QString::number(drawableAreaAspectRatio)); st.append(" Rectangle = "); st.append(QString::number(drawableAspectRatio)); emit message(st); QPainter p(this); drawing code } connect(ui->canvas, &MyCanvas::message, this, [this](const QString& st) { this->ui->statusBar->clearMessage(); this->ui->statusBar->showMessage(st, 0);}); -
Hi,
What does the method connected to message do ? Note that it's pretty unusual to emit in the paintEvent.
-
Hi,
What does the method connected to message do ? Note that it's pretty unusual to emit in the paintEvent.
-
Hi,
What does the method connected to message do ? Note that it's pretty unusual to emit in the paintEvent.
-
@JonB Thanks, the scroll didn't go far enough...
As I don't know what MyCanvas is, it could be triggering repaints every time, so re-triggering the emit etc.
-
@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(); }