• 鼠标缩略图遥感图像显示时的连动效果——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测试解决问题。”
    软件工程说:“咱们还是应该把车推回山顶再开下来,看看问题是否重复发生。”

  • 相关阅读:
    模块
    javacript一键换肤
    ajax请求
    jquery获取元素的方法
    ajax请求里的contentType: "application/json"作用
    Underscore.js 入门-常用方法介绍
    .NET Core调用WCF的最佳实践
    证伪主义——科学与伪科学的量尺
    高效的筒仓
    此时此刻,一个项目正在走向失败
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3043328.html
Copyright © 2020-2023  润新知