• 5714阅读
  • 3回复

[提问]QPainter在PainterEvent外绘图 [复制链接]

上一主题 下一主题
离线0354030w
 

只看楼主 倒序阅读 楼主  发表于: 2013-01-22
        本来以为QPainter只能在PainterEvent函数内绘图,今天看了 自带Queued Custom Type Example的例子,发现它是在一个槽函数中操作QPainter绘制一个QPixmap的。
        然后我自己也试验一下,具体界面如图
       主窗口派生于QWidget,然后包含一个子QWidget,和两个按钮,分别用了两个布局。按下Magnigy按钮想在子Widget中绘制一个矩形,每次按下,矩形放大两倍,按下Lessen,子Widget中的矩形缩小两倍。主要调用了如下的函数。

void Widget::myPaint(QWidget *w)
{
      QPainter painter;
      painter.begin(w);
      painter.fillRect(0,0,width,height,QColor(Qt::red);
     painter.end();
}
但是一调用就提示QPainter::begin: Paint device returned engine == 0, type: 1
查了下手册只有下面三种情况会出错
painter->begin(0); // impossible - paint device cannot be 0QPixmap image(0, 0);
painter->begin(&image); // impossible - image.isNull() == true;
painter->begin(myWidget);
painter2->begin(myWidget); // impossible - only one painter at a time
我的这个子Widget已经new了,应该不是空的。
感觉在PainterEvent外绘图也蛮好的,特别是要对某个控件绘图,不用再派生一个该控件,再重写PainterEvent函数那么麻烦了。不知道错在哪里?

离线kimtaikee

只看该作者 1楼 发表于: 2013-01-22
QWidget 继承自QObject 有各种事件处理函数,而QPixmap 继承自QPaintDevice ,而QPaintDevice不继承自QObject,它只是调用底层的QPaintEngine 来画图,所以不要想当然适用于QPixmap & QImage的方法亦能够适用于QWidget.看天看一点QT源码。

离线0354030w

只看该作者 2楼 发表于: 2013-01-22
回 1楼(kimtaikee) 的帖子
可是,QWidget同时继承自QPaintDevice和QObject,是不是遇到两者的时候QWidget会按QObject的方法来绘图?
离线jdwx

只看该作者 3楼 发表于: 2013-01-22
回 2楼(0354030w) 的帖子
QWidget只能在paintevent里绘图,要在其它的地方画图,用一个QPixmap做中介,先画到pixmap上面,在paintevent里再画到界面上。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
快速回复
限100 字节
 
上一个 下一个