我将如何绘制矩形?
我尝试了两种不同的方法;
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/