c++ - 无法在自定义QWidget(Qt5)的paintEvent中使用QPainter

标签 c++ qt 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 为您完成了...

关于c++ - 无法在自定义QWidget(Qt5)的paintEvent中使用QPainter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37452964/

相关文章:

c++,在QTableWidget中仅插入数字( double )

c++ - Visual C++ Studio,仅重新编译修改后的文件

java - While 或 For 循环哪个适合哪种条件

qt - 为什么Qt6中没有QtWebEngine?

Python:如何在 PyQt 中从 GroupBox 取消分配布局

c++ - 无法使用 QML/C++ 中的绑定(bind)对象初始化 UI

qt - 增加 Qt 中的字体大小

css - QTableWidget 和 QHeaderView CSS

C++等待和休眠问题

windows - 如何在qmake项目中检测Qt是OpenGL还是Angle版本?