QWidget在自我绘制窗口时使用的也同样是QPainter类,因为QT规定:“A paint device can only be painted by one painter at a time”,即“一个油漆设备一次只能由一个油漆工油漆”。所以在QT在自我绘制时,在其调用QPainter::end()函数之前,用户将始终无法使用this初始化QPainter。
当用户绘制事件触发时,QT会首先调用QPainter::end()函数, 然后调用paintEvent ()虚函数, 因此QPainter的初始化只能放在paintEvent ()函数之中。
不过用户可以将QPainter的指针作为widget类的成员变量预先定义, painter = new QPainter;放在构造函数中, 然后在paintEvent ()函数中将绘制代码置于painter->begin(this);与painter->end();的调用之间。
class MyWidget : QWidget
{
MyPainter * painter;
public:
MyWidget(...);
void painterEvent(...);
~MyWidget();
}
MyWidget::MyWidget(...) : QWidget(...)
{
painter = new MyPainter;
}
void MyWidget::painterEvent(...)
{
painter->begin(this);
...
painter->end();
}
MyWidget::~MyWidget()
{
delete painter;
}