我该如何绘制矩形?
我试过两种不同的方式;
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)
归档时间: |
|
查看次数: |
40116 次 |
最近记录: |