Qt初学者QPainter和QRect

Ash*_*Ash 9 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);
}
Run Code Online (Sandbox Code Playgroud)

哪个工作正常(即使参数未命名也未使用),但我不想使用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);
}
Run Code Online (Sandbox Code Playgroud)

这不会显示任何内容(但没有错误).

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

jdi*_*jdi 10

paint事件是在需要重绘窗口小部件时由绘制系统调用的方法.这就是为什么简单地命名自己的方法不起作用.它永远不会被油漆系统调用.

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

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);
}
Run Code Online (Sandbox Code Playgroud)

现在,如果你想将你的绘画逻辑分成另一种方法,那很好.但你需要从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);
}
Run Code Online (Sandbox Code Playgroud)

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

QPixMap pix(200,100);
QPainter painter(&pix);
// do paint operations
painter.end()
someLabel.setPixmap(pix)
Run Code Online (Sandbox Code Playgroud)