图片上拖动矩形框,结果有问题

Keluny 2014-03-06 05:13:31
用label显示图片,现在需要在图片上绘制一个矩形并能用鼠标进行拖动,所以重写了窗口的paintEvent函数:
void Temperature_M::paintEvent(QPaintEvent*)
{
QPainter paint(&img);
paint.setPen(QPen(Qt::green,5));
paint.drawRect(rect1_x,rect1_y,rect1_width,rect1_height);//rect1_x,rect1_y,rect1_width,rect1_height分别是矩形的起点和宽和高
picture->setPixmap(QPixmap::fromImage(img));
}
思路就是在图片上绘制矩形,再把图片显示。
接下来就是关于重写鼠标事件的函数
void Temperature_M:: mousePressEvent(QMouseEvent*mouse_event)
{
if(mouse_event->button()==Qt::LeftButton)//鼠标左键按下
{
QPoint pos=mouse_event->pos();
if(pos.x()>rect1_x&&pos.y()>rect1_y&&pos.x()<(rect1_x+rect1_width)&&pos.y()<(rect1_y+rect1_height))//在矩形区域内
rect1_drag=true;
}
}

void Temperature_M:: mouseMoveEvent(QMouseEvent*mouse_event)
{
if(rect1_drag)
{
rect1_x=mouse_event->pos().x();//获取当前的x
rect1_y=mouse_event->pos().y();//获取当前y
}
}

void Temperature_M:: mouseReleaseEvent(QMouseEvent*mouse_event)
{
rect1_drag=false;
update();
}
拖动矩形框输出的效果却是这样的高手帮我分析分析子么回事啊?
...全文
212 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
Keluny 2014-03-11
  • 打赏
  • 举报
回复
引用 12 楼 nlstone 的回复:
为什么跟布局管理器有关系呢?不是很明白。在窗口dc上画东西,自己控制它显示的位置就好了,跟布局管理器一点关系都没有。
只不过是实际需求,我不单单是显示图像还要提取图像的一些信息在控件中显示,所以窗口中还有控件
nlstone 2014-03-09
  • 打赏
  • 举报
回复
为什么跟布局管理器有关系呢?不是很明白。在窗口dc上画东西,自己控制它显示的位置就好了,跟布局管理器一点关系都没有。
请叫我砖家 2014-03-07
  • 打赏
  • 举报
回复
引用 5 楼 IT_man1989 的回复:
引用 4 楼 heksn 的回复:
在每次绘制之前将picture重置,擦出上次绘制内容
查阅了一下QPainter类的函数没有清除绘制的图形的函数啊,你有好的解决方法么?
paintEvent在每次鼠标有动作的时候都会重新绘制一遍,加个if条件,不满足就不绘制框框
Keluny 2014-03-07
  • 打赏
  • 举报
回复
引用 6 楼 kfbyj 的回复:
看下我博客帖子。。http://blog.csdn.net/kfbyj/article/details/8811010
你的例子的意思不也就是先对图像操作再在窗口显示图像,再在窗口上操作,我当中用到了布局管理器,不知道怎么办了。。
狂风暴雨 2014-03-07
  • 打赏
  • 举报
回复
看下我博客帖子。。http://blog.csdn.net/kfbyj/article/details/8811010
Keluny 2014-03-07
  • 打赏
  • 举报
回复
引用 9 楼 nlstone 的回复:
因为你每次都画了一个矩形到img上,当然是擦不掉的。 这个矩形可以考虑不要画到img上,直接画到窗口上就可以了。
因为其中还运用了布局管理器,如果直接画到widget上布局管理器又没用了。。。这么简单的一个东西,这么多麻烦
Keluny 2014-03-07
  • 打赏
  • 举报
回复
引用 4 楼 heksn 的回复:
在每次绘制之前将picture重置,擦出上次绘制内容
查阅了一下QPainter类的函数没有清除绘制的图形的函数啊,你有好的解决方法么?
nlstone 2014-03-07
  • 打赏
  • 举报
回复
因为你每次都画了一个矩形到img上,当然是擦不掉的。 这个矩形可以考虑不要画到img上,直接画到窗口上就可以了。
Keluny 2014-03-07
  • 打赏
  • 举报
回复
引用 7 楼 u012628469 的回复:
引用 5 楼 IT_man1989 的回复:
[quote=引用 4 楼 heksn 的回复:] 在每次绘制之前将picture重置,擦出上次绘制内容
查阅了一下QPainter类的函数没有清除绘制的图形的函数啊,你有好的解决方法么?
paintEvent在每次鼠标有动作的时候都会重新绘制一遍,加个if条件,不满足就不绘制框框[/quote]嗯,这样的话避免了每次拖动鼠标就绘制一个矩形的缺点,因为矩形是画在图片上的,所以上次绘制的矩形还在啊,还得想想呢
  • 打赏
  • 举报
回复
在每次绘制之前将picture重置,擦出上次绘制内容
Keluny 2014-03-06
  • 打赏
  • 举报
回复
引用 2 楼 heksn 的回复:
把update放到mousemove中试试
之前就试过了没用,不过还得谢谢
  • 打赏
  • 举报
回复
把update放到mousemove中试试
Keluny 2014-03-06
  • 打赏
  • 举报
回复
自己先顶一个!

16,216

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧