您的位置:首页 > 编程语言 > Qt开发

鼠标缩略图遥感图像显示时的连动效果——Qt实现

2013-04-25 19:58 507 查看
时间紧张,先记一笔,后续优化与完善。

遥感像图理处时少不了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测试解决问题。”

软件工程说:“咱们还是应该把车推回山顶再开下来,看看问题是否重复发生。”
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: