找回密码
 立即注册
收起左侧

Qt绘图板双缓冲问题

6
回复
8804
查看
[复制链接]
累计签到:22 天
连续签到:1 天
来源: 2014-10-27 09:23:20 显示全部楼层 |阅读模式
1Qter豆
一共有三个小问题,谢谢。
  1. void Dialog::paintEvent(QPaintEvent *)
  2. {

  3.       int x=startPoint.x();
  4.       int y=startPoint.y();
  5.       int width=endPoint.x()-x;
  6.       int height=endPoint.y()-y;

  7.       QPainter painter;
  8.       painter.begin(&temppix);
  9.       if(!isPressed)
  10.       {
  11.           painter.drawRect(x,y,width,height);
  12.           pix=temppix;
  13.       }
  14.       painter.end();
  15.       painter.begin(this);
  16.       painter.drawPixmap(0,0,pix);
  17.       painter.end();

  18. }
复制代码
问题1.当这样使用双缓冲绘制矩形的时候鼠标拖动的过程中不显示矩形,松开鼠标才显示矩形,这个问题如何解决?
  1. void Dialog::paintEvent(QPaintEvent *event)
  2. {
  3.     QPainter painter(this);
  4.     QRectF rectf = QRectF(startPoint, endPoint);
  5.     painter.drawRect(rectf);

  6. }
复制代码
问题2.当这样绘制矩形的时候为什么不产生拖影?
问题3.第一个矩形绘制完成,当再次点击鼠标绘制第二个矩形时第一个矩形会消失,如何解决?为什么前一种代码不会出现这种问题?

最佳答案

查看完整内容

可以啊,我试过了。。。
回复

使用道具 举报

累计签到:882 天
连续签到:3 天
2014-10-27 09:23:21 显示全部楼层
可以啊,我试过了。。。

点评

不是鼠标移动事件未处理,是paintevent中代码有问题  发表于 2014-10-29 17:35
回复

使用道具 举报

累计签到:882 天
连续签到:3 天
2014-10-28 09:20:03 显示全部楼层
第一个问题应该是鼠标移动事件未做处理吧; 后面两个问题我觉得你可以在看看亚飞 老师的教程
回复

使用道具 举报

累计签到:410 天
连续签到:1 天
2014-10-28 17:21:13 显示全部楼层
对  楼上说得对
后面2个问题  在yafei老师的书中有这个demo源码
回复

使用道具 举报

累计签到:22 天
连续签到:1 天
2014-10-28 20:42:57 显示全部楼层
一叶知秋 发表于 2014-10-28 09:20
第一个问题应该是鼠标移动事件未做处理吧; 后面两个问题我觉得你可以在看看亚飞 老师的教程 ...

  1. void Dialog::mouseMoveEvent(QMouseEvent *event)
  2. {
  3.          if(event->buttons()&Qt::LeftButton)
  4.         {
  5.                   endPoint = event->pos();
  6.                   update();

  7.          }
  8. }
复制代码
鼠标移动事件
回复

使用道具 举报

累计签到:22 天
连续签到:1 天
2014-10-28 20:46:35 显示全部楼层
a408815041 发表于 2014-10-28 17:21
对  楼上说得对
后面2个问题  在yafei老师的书中有这个demo源码

霍亚飞老师么?那个书里的源码实现后在拖动过程中就无法显示矩形框
回复

使用道具 举报

累计签到:22 天
连续签到:1 天
2014-10-29 17:35:51 显示全部楼层
一叶知秋 发表于 2014-10-27 09:23
可以啊,我试过了。。。
  1. void MainWindow::paintEvent(QPaintEvent *)
  2. {

  3.     int x,y,w,h;
  4.     x = lastPoint.x();
  5.     y = lastPoint.y();
  6.     w = endPoint.x() - x;
  7.     h = endPoint.y() - y;

  8.     QPainter painter(this);
  9.     if(isDrawing)     //如果正在绘图
  10.     {
  11.         tempPix = pix;    //将以前pix中的内容复制到tempPix中,这样实现了交互绘图
  12.         QPainter pp(&tempPix);
  13.         pp.drawRect(x,y,w,h);
  14.         painter.drawPixmap(0,0,tempPix);
  15.     }
  16.     else
  17.     {
  18.         QPainter pp(&pix);
  19.         pp.drawRect(x,y,w,h);
  20.         painter.drawPixmap(0,0,pix);
  21.     }
  22. }
复制代码
这样就对了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了