Qt初学者QPainter和QRect

Qt初学者QPainter和QRect

我将如何绘制矩形?

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

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 *我没有用。

因此,我尝试仅重命名我的功能;
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 *,为什么会不起作用?

最佳答案

绘画事件是绘画系统在需要重绘窗口小部件时调用的方法。这就是为什么简单地命名自己的方法不起作用的原因。油漆系统从不调用它。

您确实应该使用QPaintEvent。它为您提供了需要绘制的矩形。该矩形将基于窗口小部件的大小,因此,不要在绘画事件中使用显式矩形,而将窗口小部件设置为正确的大小。如果您的小部件移动,调整大小等,将会生成一个绘画事件。

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);
}

现在,如果您想将绘画逻辑分为另一种方法,那就很好了。但是您需要从paint事件中调用它:
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);
}

如果您要完全绕开您所说的绘制事件,而只想创建一个静态矩形进行显示,则一种方法是将其绘制到像素图一次并在QLabel中显示:
QPixMap pix(200,100);
QPainter painter(&pix);
// do paint operations
painter.end()
someLabel.setPixmap(pix)

关于Qt初学者QPainter和QRect,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14101297/

10-15 05:14