首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Qt初学者QPainter和QRect

Qt初学者QPainter和QRect
EN

Stack Overflow用户
提问于 2012-12-31 19:58:14
回答 5查看 43K关注 0票数 9

我该怎么画一个矩形呢?

我尝试了两种不同的方法;

代码语言:javascript
复制
void MyWidget::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);
    painter.setPen(Qt::black);
    QRect rect = QRect(290, 20, 70, 40);
    painter.drawText(rect, Qt::AlignCenter,
                      "Data");
    painter.drawRect(rect);
}

它工作得很好(即使参数既没有命名也没有使用),但是我不想使用QPaintEvent,我对它没有任何用处。

所以我试着重命名我的函数;

代码语言:javascript
复制
void MyWidget::draw()
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);
    painter.setPen(Qt::black);
    QRect rect = QRect(290, 20, 70, 40);
    painter.drawText(rect, Qt::AlignCenter,
                      "Data");
    painter.drawRect(rect);
}

这不会显示任何内容(还没有错误)。

如果我不使用QPaintEvent *,为什么它不能工作?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-01-01 04:00:32

paint事件是需要重新绘制小部件时由paint系统调用的方法。它不会被画图系统调用。

你真的应该使用QPaintEvent。它为您提供了需要绘制的矩形。这个rect将基于小部件的大小,所以不要在paint事件中使用显式的rect,而是将小部件设置为正确的大小。如果您的小部件发生移动、调整大小等操作,将会生成一个paint事件。

代码语言:javascript
复制
void MyWidget::paintEvent(QPaintEvent *event)
{
    QRect rect = event->rect();
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);
    painter.setPen(Qt::black);
    painter.drawText(rect, Qt::AlignCenter,
                      "Data");
    painter.drawRect(rect);
}

代码语言:javascript
复制
void MyWidget::paintEvent(QPaintEvent *event)
{
    QRect rect = event->rect();
    draw(rect);
}

void MyWidget::draw(QRect &rect)
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);
    painter.setPen(Qt::black);
    painter.drawText(rect, Qt::AlignCenter,
                      "Data");
    painter.drawRect(rect);
}

如果您想像您所说的那样完全绕过paint事件,并且只想创建一个静态矩形来显示,一种方法是只将它绘制一次到像素图并在QLabel中显示它:

代码语言:javascript
复制
QPixMap pix(200,100);
QPainter painter(&pix);
// do paint operations
painter.end()
someLabel.setPixmap(pix)
票数 10
EN

Stack Overflow用户

发布于 2013-01-01 03:49:59

您的paintEvent()需要的任何数据都应该可以作为包含类的字段访问,在本例中是MyWidget的私有字段。这些私有字段可以通过“设置器”暴露给MyWidget的客户端,“设置器”将在调用MyWidget上的update()之前设置数据值,这将触发对paintEvent()的调用。

票数 2
EN

Stack Overflow用户

发布于 2012-12-31 21:44:29

This playlist包含了最好的Qt教程,入门教程74对你很有用(Qpainter和QPen),教程75是如何使用QRect绘制矩形。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14101297

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档