簡體   English   中英

無法在自定義QWidget(Qt5)的paintEvent中使用QPainter

[英]Can't use QPainter in paintEvent of custom QWidget (Qt5)

有問題的錯誤如下:

QWidget::paintEngine: Should no longer be called
QPainter::begin: Paint device returned engine == 0, type: 1
QPainter::setPen: Painter not active
QPainter::setFont: Painter not active

看了無數的在線論壇帖子后,所有人都犯了同樣的錯誤,他們試圖在paintEvent()之外的窗口小部件上繪畫,但我一直沒有運氣。 我嘗試直接在此自定義QWidget子類上進行繪制,我嘗試制作一個子QWidget並在其上進行繪制。 有人可以告訴我我做錯了什么嗎?

提前致謝。

標題:

#ifndef TEXTDISPLAY_H
#define TEXTDISPLAY_H

#include <QWidget>

class TextDisplay : public QWidget
{
    Q_OBJECT

public:
    TextDisplay(QString text, QString fontFamily = "Helvetica", int fontSize = 20,
                int fontColor = Qt::black, QWidget* parent = 0);

protected:
    void paintEvent(QPaintEvent *e) Q_DECL_OVERRIDE;
    void resizeEvent(QResizeEvent *e) Q_DECL_OVERRIDE;

private:
    QString text;
    QString fontFamily;
    int fontSize;
    int fontColor;
};

#endif // TEXTDISPLAY_H

CPP:

#include "textdisplay.h"
#include <QPainter>


TextDisplay::TextDisplay(QString text, QString fontFamily, int fontSize,
                         int fontColor, QWidget* parent)
    : QWidget(parent), text(text), fontFamily(fontFamily),
      fontSize(fontSize), fontColor(fontColor)
{
    this->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Minimum);
}

void TextDisplay::resizeEvent(QResizeEvent*) {
    paintEvent(NULL);
}

void TextDisplay::paintEvent(QPaintEvent *) {
    QPainter painter(this);
    painter.setPen(fontColor);
    painter.setFont(QFont(fontFamily, fontSize));

    QRect rect(QPoint(0, 0), this->size());
    QRect bound;
    QTextOption options;
    options.setWrapMode(QTextOption::WrapAtWordBoundaryOrAnywhere);

    painter.drawText(rect, Qt::TextWordWrap | Qt::TextWrapAnywhere, text, &bound);

    this->setMinimumHeight(bound.size().height());
}

使用解決方案進行編輯:

感謝兩位響應者-我需要做兩件事才能使其正常工作:

a)擺脫paintEvent(NULL) 我也擺脫了resizeEvent覆蓋,這是沒有必要的建議。

b)設置小部件的最小尺寸。 沒有這個,Qt永遠不會調用paintEvent。

如果要為小部件安排重繪,只需調用update()

如果需要立即重繪( 幾乎不需要 ),則可以調用repaint()

直接調用paintEvent()將不起作用-Qt需要准備后備存儲以處理繪畫,因此您不能繞過更新機制。 相反,請調用上述方法,這將導致對paintEvent()的調用(如果窗口小部件可見,未被遮擋等,等等)。

還要注意,您不必只重新實現resizeEvent()就可以更新窗口小部件。 Qt應該已經為您完成了...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM