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

时间紧张,先记一笔,后续优化与完善。

    遥感像图理处时少不了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测试解决问题。”
软件工程说:“咱们还是应该把车推回山顶再开下来,看看问题是否重复发生。”

转载于:https://www.cnblogs.com/jiangu66/archive/2013/04/25/3043328.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值