时间紧张,先记一笔,后续优化与完善。
遥感像图理处时少不了ENVI,用过ENVI的人都道知,打开像图时或像图理处完后,在缩略图上挪动鼠标时,鼠标四周的像图信息会在大的视图中实时的表现,即大图会着跟小图中的鼠标挪动,这等于像图的连动效果。如下图是ENVI的示意图:
在软件设计中,要现实相似ENVI中连动的效果,确切要费一番筋脑。
求要:有两幅图,一个是缩略图,一个是原图或理处后的图,用使两个对话框,鼠标在小的缩略图中挪动或点击时,大图中的像图实时表现出鼠标所在位置的像图。
结果示展:首先给出结果示展,这样读者也好白明现实这样的功能动手点和重点在那些方地。
从上图中可以看出:1.大图在挪动时其实只须要控制滑动杆的位置可即,控制滑动杆的位置即设置水和平垂直两个滑动轴的值小大;
2.须要检测出鼠标在缩略图中的滑动和点击件事
再联系到用使QT现实时,可以用使信号与槽将这两者联系起来,两幅图对应两个对话框,用使两个类别分现实对话框的功能。鼠标在缩略图中点击或挪动时,实时录记鼠标所在位置,并发触信号,大图的槽函数应响缩略图对话框发过来的信号,设置滑动轴的值。
坐标值与滑动轴值之间的联系:须要肯定鼠标在缩略图中的位置,x长度占缩略图度宽的百分比,y长度占缩略图长度的百分比,然后这两个值传递给大图对话框的类对象,根据这两个百分比和大图像图的宽和高设置滑动杆的值。
缩略图对话框类为SmallImage,大图对话框类为ImgShow
首先是在SmallImage类中重写鼠标件事
//smallimage.h #ifndef SMALLIMAGE_H #define SMALLIMAGE_H #include <QWidget> #include <QMouseEvent> #include "ui_smallimage.h" class SmallImage : public QWidget { Q_OBJECT public: SmallImage(QWidget *parent = 0); ~SmallImage(); void show_small_img(float *data,int width,int height);//表现缩略图像图 float x_value;//鼠标点所在位置占x轴的百分比 float y_value;//鼠标点所在位置占y轴的百分比 signals: void press(float x,float y); private: Ui::SmallImage ui; void mousePressEvent(QMouseEvent *ev);//重写鼠标按下件事 void mouseMoveEvent(QMouseEvent *ev);//重写鼠标挪动件事 int img_width_;//缩略图宽 int img_height_;//缩略图高 }; #endif // SMALLIMAGE_H //smallimage.cpp //重写鼠标按下件事 void SmallImage::mousePressEvent(QMouseEvent *ev) { int x1=ui.label->x();//x坐标 int y1=ui.label->y();//y坐标 int x_left=x1+(300-img_width_)/2;//缩略图左起x坐标 int x_right=x1+img_width_+(300-img_width_)/2;//缩略图边右的x坐标 int y_top=y1+(300-img_height_)/2;//缩略图上起y坐标 int y_bottom=y1+img_height_+(300-img_height_)/2;//缩略图底部y坐标 int x0=ev->x(); int y0=ev->y(); if ( (x0>=x_left) && (x0<=x_right) && (y0>=y_top) && (y0<=y_bottom)) { x_value=(float)(x0-x_left)/(float)img_width_; y_value=(float)(y0-y_top)/(float)img_height_; //发触鼠标按下信号 emit press(x_value,y_value); } } //鼠标挪动作操 void SmallImage::mouseMoveEvent(QMouseEvent *ev) { int x1=ui.label->x();//x坐标 int y1=ui.label->y();//y坐标 int x_left=x1+(300-img_width_)/2;//缩略图左起x坐标 int x_right=x1+img_width_+(300-img_width_)/2;//缩略图边右的x坐标 int y_top=y1+(300-img_height_)/2;//缩略图上起y坐标 int y_bottom=y1+img_height_+(300-img_height_)/2;//缩略图底部y坐标 int x0=ev->x(); int y0=ev->y(); if ( (x0>=x_left) && (x0<=x_right) && (y0>=y_top) && (y0<=y_bottom)) { x_value=(float)(x0-x_left)/(float)img_width_; y_value=(float)(y0-y_top)/(float)img_height_; emit press(x_value,y_value); } }
然后是在ImgShow类中定义槽函数
//imgshow.h public slots: void set_scroll_value(float x0,float y0);//设置滑动杆的值 //imgshow.cpp //设置滑动杆的值 void ImgShow::set_scroll_value(float x0, float y0) { ui.scrollArea->horizontalScrollBar()->setValue(x0*img_width_- (ui.scrollArea->width())/2); ui.scrollArea->verticalScrollBar()->setValue(y0*img_height_- (ui.scrollArea->height())/2); }
最后是当着两个对话框均表现出来后之将他们的信号与槽连接起来。
connect(small_img,SIGNAL(press(float,float)),img_show,SLOT(set_scroll_value(float,float)))
还有相称主要的一点就是,两个对话框必须都长短态模,关于非态模的内容请见:http://blog.csdn.net/luo_klt/article/details/8826975
本文中疏忽了像图读取及表现等作操,在本人博客中的其他文章中有具体叙说,详见:
http://blog.csdn.net/luo_klt/article/details/8826959
http://blog.csdn.net/luo_klt/article/details/8826960
http://blog.csdn.net/luo_klt/article/details/8826966
文章结束给大家分享下程序员的一些笑话语录:
据说有一位软件工程师,一位硬件工程师和一位项目经理同坐车参加研讨会。不幸在从盘山公路下山时坏在半路上了。于是两位工程师和一位经理就如何修车的问题展开了讨论。
硬件工程师说:“我可以用随身携带的瑞士军刀把车坏的部分拆下来,找出原因,排除故障。”
项目经理说:“根据经营管理学,应该召开会议,根据问题现状写出需求报告,制订计划,编写日程安排,逐步逼近,alpha测试,beta1测试和beta2测试解决问题。”
软件工程说:“咱们还是应该把车推回山顶再开下来,看看问题是否重复发生。”