我想在我的QFrame中绘制一个像素,我像这样覆盖我的painEvent函数:
void MainBoard::paintEvent(QPaintEvent *event)
{
QFrame::paintEvent(event);
QPainter painter(this);
point.paintPoint(event,100,100);
}
和我的类点有函数
class Point: public QWidget
{
public:
void paintPoint(QPaintEvent *event, int x, int y)
{
QWidget::paintEvent(event);
QPainter painter(this);
painter.setPen(QPen(Qt::black, 12, Qt::DashDotLine, Qt::RoundCap));
painter.drawLine(x, y, x+1, y+1);
}
};
它不工作,什么是错误的?
错误是
QWidget::paintEngine: Should no longer be called
QPainter::begin: Paint device returned engine == 0, type: 1
QPainter::setPen: Painter not active
QWidget::paintEngine: Should no longer be called
QPainter::begin: Paint device returned engine == 0, type: 1
QPainter::setPen: Painter not active
您正在从Qt不期望它的上下文中调用Point
对象上的QWidget::paintEvent(event)
-即从MainBoard::paintEvent(QPaintEvent *)
内。通常在Qt中,你永远不会在不同的部件上显式地调用paintEvent()
;Qt的事件循环代码会在适当的时候为你调用它。
我建议删除对QWidget::paintEvent(event)
的调用,并将对QPainter
的引用传递给paintPoint()
而不是QPaintEvent
。(事实上,没有任何理由有Point
子类QWidget
,如果你只是想用它来画一个点;你可以通过调用painter.drawLine()
来大大简化事情,或者更好的是,必要时直接从MainBoard::paintEvent()
调用painter.drawPoint()
。