整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

Qt编写自定义控件-通用移动

Qt编写自定义控件-通用移动

、前言

通用移动类,目标就是为了实现放入任意的控件以后,支持鼠标拖动,在容器中或者父类中拖动,这个应用场景非常多,比如在地图上放置的设备,需要用户自行按下拖动到指定的合适的位置,然后保存设备的位置坐标到数据库,下次打开直接加载,在一些安防项目、电力项目、环境监测等上面大量运用,有时候设备对应了多种类型,以前做的办法是将这个移动的代码直接封装在对应设备的自定义控件中,有个巨大缺点就是如果再新增加一个控件,又需要重复的代码加到控件中才行,可否将这个功能独立出来,只要传入控件就行呢,当然可以,比如我写过很多自定义控件,现在需要控件放到某个容器中能自由拖动,只需要new出通用移动类来就行。
项目开源地址:https://gitee.com/feiyangqingyun/QWidgetDemo

二、实现的功能

  • 1:可以指定需要移动的widget
  • 2:可设置是否限定鼠标左键拖动
  • 3:支持任意widget控件

三、效果图

四、头文件代码

#ifndef MOVEWIDGET_H
#define MOVEWIDGET_H

/**
 * 通用控件移动类 作者:feiyangqingyun(QQ:517216493) 2019-9-28
 * 1:可以指定需要移动的widget
 * 2:可设置是否限定鼠标左键拖动
 * 3:支持任意widget控件
 */

#include <QWidget>

#ifdef quc
#if (QT_VERSION < QT_VERSION_CHECK(5,7,0))
#include <QtDesigner/QDesignerExportWidget>
#else
#include <QtUiPlugin/QDesignerExportWidget>
#endif

class QDESIGNER_WIDGET_EXPORT MoveWidget : public QObject
#else
class MoveWidget : public QObject
#endif

{
    Q_OBJECT
public:
    explicit MoveWidget(QObject *parent=0);

protected:
    bool eventFilter(QObject *watched, QEvent *event);

private:
    QPoint lastPoint;   //最后按下的坐标
    bool pressed;       //鼠标是否按下
    bool leftButton;    //限定鼠标左键
    QWidget *widget;    //移动的控件

public Q_SLOTS:
    //设置是否限定鼠标左键
    void setLeftButton(bool leftButton);
    //设置要移动的控件
    void setWidget(QWidget *widget);
};

#endif // MOVEWIDGET_H


【领QT开发教程学习资料,点击下方链接莬费领取↓↓,先码住不迷路~】

点击这里:「链接」


五、核心代码

#include "movewidget.h"
#include "qevent.h"
#include "qdebug.h"

MoveWidget::MoveWidget(QObject *parent) : QObject(parent)
{
    lastPoint=QPoint(0, 0);
    pressed=false;
    leftButton=true;
    widget=0;
}

bool MoveWidget::eventFilter(QObject *watched, QEvent *event)
{
    if (widget !=0 && watched==widget) {
        QMouseEvent *mouseEvent=(QMouseEvent *)event;
        if (mouseEvent->type()==QEvent::MouseButtonPress) {
            //如果限定了只能鼠标左键拖动则判断当前是否是鼠标左键
            if (leftButton && mouseEvent->button() !=Qt::LeftButton) {
                return false;
            }

            //判断控件的区域是否包含了当前鼠标的坐标
            if (widget->rect().contains(mouseEvent->pos())) {
                lastPoint=mouseEvent->pos();
                pressed=true;
            }
        } else if (mouseEvent->type()==QEvent::MouseMove && pressed) {
            //计算坐标偏移值,调用move函数移动过去
            int offsetX=mouseEvent->pos().x() - lastPoint.x();
            int offsetY=mouseEvent->pos().y() - lastPoint.y();
            widget->move(widget->x() + offsetX, widget->y() + offsetY);
        } else if (mouseEvent->type()==QEvent::MouseButtonRelease && pressed) {
            pressed=false;
        }
    }

    return QObject::eventFilter(watched, event);
}

void MoveWidget::setWidget(QWidget *widget)
{
    if (this->widget==0) {
        this->widget=widget;
        this->widget->installEventFilter(this);
    }
}

void MoveWidget::setLeftButton(bool leftButton)
{
    this->leftButton=leftButton;
}


六、控件介绍

  1. 超过150个精美控件,涵盖了各种仪表盘、进度条、进度球、指南针、曲线图、标尺、温度计、导航条、导航栏,flatui、高亮按钮、滑动选择器、农历等。远超qwt集成的控件数量。
  2. 每个类都可以独立成一个单独的控件,零耦合,每个控件一个头文件和一个实现文件,不依赖其他文件,方便单个控件以源码形式集成到项目中,较少代码量。qwt的控件类环环相扣,高度耦合,想要使用其中一个控件,必须包含所有的代码。
  3. 全部纯Qt编写,QWidget+QPainter绘制,支持Qt4.6到Qt5.13的任何Qt版本,支持mingw、msvc、gcc等编译器,支持任意操作系统比如windows+linux+mac+嵌入式linux等,不乱码,可直接集成到Qt Creator中,和自带的控件一样使用,大部分效果只要设置几个属性即可,极为方便。
  4. 每个控件都有一个对应的单独的包含该控件源码的DEMO,方便参考使用。同时还提供一个所有控件使用的集成的DEMO。
  5. 每个控件的源代码都有详细中文注释,都按照统一设计规范编写,方便学习自定义控件的编写。
  6. 每个控件默认配色和demo对应的配色都非常精美。
  7. 超过130个可见控件,6个不可见控件。
  8. 部分控件提供多种样式风格选择,多种指示器样式选择。
  9. 所有控件自适应窗体拉伸变化。
  10. 集成自定义控件属性设计器,支持拖曳设计,所见即所得,支持导入导出xml格式。
  11. 自带activex控件demo,所有控件可以直接运行在ie浏览器中。
  12. 集成fontawesome图形字体+阿里巴巴iconfont收藏的几百个图形字体,享受图形字体带来的乐趣。
  13. 所有控件最后生成一个动态库文件(dll或者so等),可以直接集成到qtcreator中拖曳设计使用。
  14. 目前已经有qml版本,后期会考虑出pyqt版本,如果用户需求量很大的话。
  15. 自定义控件插件开放动态库使用(永久免费),无任何后门和限制,请放心使用。
  16. 目前已提供26个版本的dll,其中包括了qt5.12.3 msvc2017 32+64 mingw 32+64 的。
  17. 不定期增加控件和完善控件,不定期更新SDK,欢迎各位提出建议,谢谢!
  18. Qt入门书籍推荐霍亚飞的《Qt Creator快速入门》《Qt5编程入门》,Qt进阶书籍推荐官方的《C++ GUI Qt4编程》。
  19. 强烈推荐程序员自我修养和规划系列书《大话程序员》《程序员的成长课》《解忧程序员》,受益匪浅,受益终生!
  20. SDK地址:https://gitee.com/feiyangqingyun/QUCSDK

原文链接:https://www.cnblogs.com/feiyangqingyun/p/11608377.html

【领QT开发教程学习资料,点击下方链接莬费领取↓↓,先码住不迷路~】

点击这里:Qt资料领取(视频教程+文档+代码+项目实战)

用JavaScript实现页面滑动到指定位置加载动画。

若页面滚动到class名为group-pic的元素的位置时开始加载


  1. $(document).ready(function(){
  2. var a,b,c;
  3. a=$(window).height(); //浏览器窗口高度
  4. var group=$(".group-pic");
  5. $(window).scroll(function(){
  6. b=$(this).scrollTop(); //页面滚动的高度
  7. c=group.offset().top; //元素距离文档(document)顶部的高度
  8. if(a+b>c){
  9. ...
  10. }else{
  11. ...
  12. }
  13. });
  14. });

原理: 1.获取浏览器窗口的高度;

2.获取页面滚动的高度;

3.获取页面距离文档(document)顶部的高度

offset().top具体指的是距哪里的高度呢?

一些获宽高度的属性:

网页可见区域宽: document.body.clientWidth;

网页可见区域高: document.body.clientHeight;

网页可见区域宽: document.body.offsetWidth (包括边线的宽);

网页可见区域高: document.body.offsetHeight (包括边线的宽);

网页正文全文宽: document.body.scrollWidth;

网页正文全文高: document.body.scrollHeight;

网页被卷去的高: document.body.scrollTop;

网页被卷去的左: document.body.scrollLeft;

网页正文部分上: window.screenTop;

网页正文部分左: window.screenLeft;

屏幕分辨率的高: window.screen.height;

屏幕分辨率的宽: window.screen.width;

屏幕可用工作区高度: window.screen.availHeight;

屏幕可用工作区宽度:window.screen.availWidth;

obj.offsetTop 指 obj 距离上方或上层控件的位置,整型,单位像素。

obj.offsetLeft 指 obj 距离左方或上层控件的位置,整型,单位像素。

obj.offsetWidth 指 obj 控件自身的宽度,整型,单位像素。

obj.offsetHeight 指 obj 控件自身的高度,整型,单位像素。

1.offsetTop : 当前对象到其上级层顶部的距离.

不能对其进行赋值.设置对象到页面顶部的距离请用style.top属性.

2.offsetLeft : 当前对象到其上级层左边的距离.

不能对其进行赋值.设置对象到页面左部的距离请用style.left属性.

3.offsetWidth : 当前对象的宽度.

与style.width属性的区别在于:如对象的宽度设定值为百分比宽度,则无论页面变大还是变小,style.width都返回此百分比,而offsetWidth则返回在不同页面中对象的宽度值而不是百分比值

4.offsetHeight : 与style.height属性的区别在于:如对象的宽度设定值为百分比高度,则无论页面变大还是变小,style.height都返回此百分比,而offsetHeight则返回在不同页面中对象的高度值而不是百分比值

想绘图插件5.2(MxDraw5.2)


梦想CAD是专业的CAD插件(控件),经过10年研发,可轻松在网页、手机及BS/CS程序中使用CAD和浏览编辑DWG文件,不需安装AutoCAD即可运行。

控件核心代码使用VC++ 2010开发,至今已有三十万行代码规模;2007年发布第一个Release版本,经过多年的版本更迭与技术沉淀,控件已经十分快速稳定。在关键的 空间搜索 上使用了复杂度极低的算法,并且使用 汇编 优化,可以处理50万级的实体,图形的显示和处理效率比同类产品高出很多。


梦想绘图3d插件6.0(MxDraw6.03d)


使用二位控件的显示核心,基于 OpenCASCADE几何造型引擎 ,创建锥、柱、环等基本几何体,对几何体进行 布尔操作 ,如:相加、相减、相较、倒角、斜切、镂空、偏移、扫视;几何 空间关系计算 ,如:法线、点积、叉积、投影、拟合;几何体分析,如:质心、体积、曲率; 空间变换 ,如:平移、缩放、旋转。


梦想绘图手机版插件6.0(MxDrawAndroid6.0/MxDrawIOS6.0/)


使用二维控件的显示核心,并专对手机显示CAD图纸做了极速优化 ,是目前手机上显示DWG文件非常快的控件。


梦想CAD软件5.2(MxCAD5.0)


使用二维控件的显示核心,完全自主的二维CAD绘图软件,程序简洁、运行快速、功能齐全、稳定可靠;兼容 所有版本的DWG文件 ,支持 ARX的二次开发接口。


安装包下载


点击此处下载

运行环境

支持以下的32/64平台的系统:WindowsXP、Windows2000、WindowsVista、WindowsServer、Windows7、Windows8、Windows10。


支持以下的浏览器:IE所有版本、火狐、谷歌4.5及以前的版本、360浏览器(兼容模式)、QQ浏览器。


1

QQ浏览器使用了最新的谷歌浏览器内核,可使用QQ浏览器代替谷歌浏览器运行控件

支持语言

网页使用,支持 IE所有版本

控件支持如下的语言进行二次开发:VC、VB、CSharp、Delphi、HTML、ASP、JAVA、JavaScript、C++、 Builder、PHP、.Net、易语言、PowerBuild等。

编程接口

有一万多个接口函数 可供调用,提供Object Arx,AutoCAD VBA、COM开发接口,与AutoCAD二次开发类似的接口。

文件格式

控件支持自定义文件格式,扩展名为.mxg,mxg文件 稳定可靠 ,能 完整呈现DWG文件 ,支持图纸预览,加密;支持DWG、DXG、BMP、JPG、PNG、DWF、PDF、GIF、ICO DGN、SHP等。

支持SHX、TrueType字体。

控件与AutoCAD兼容,支持AutoCAD R14至AutoCAD 2017的 所有DWG图纸格式 ,并保证能支持将来新出现的AutoCAD文件格式。

网络功能

在控件支持的浏览器(见 运行环境 )中,控件可浏览服务器上的DWG文件,把DWG文件保存到服务器、在服务器后台运行控件、把DWG转成其他格式、提取信息等;支持FTP连接,二进制数据流加载。


在网页中使用控件演示

主要功能

DWG批量转到PDF、DWF,图纸信息搜索提取,测距离,算面积,图章, 批注 ,捕捉,正交,实体闪烁,曲线离散,偏移,打断,阵列,扩展数据读写,扩展记录读写,构造选择集,打印, 动画自定义实体 ,组,右键菜单, 超连接 ,Undo,Redo,字典,图层,标注样式,线型样式,文字样式,视口,布局, 用户坐标系 ,系统变量,图纸比较,图纸剪切,界面切换,动态提示,google百度地图等。

打印功能

框选、全屏打印、后台批量打印、多个 图纸嵌套打印 、与 网页合并打印 等。

显示功能

鸟瞰、放大镜、视区平移、缩放、视区旋转、鹰眼、 透明显示 、背景、水印、网格、回溯显示、最佳显示、显示/隐藏工具条、浏览模式、 分屏显示 、矢量线、矢量圆、 动画 、动态标注、叠加对比显示等。

图元支持

主要实体有:直线,圆弧,Polyline,样条线,圆,椭圆,椭圆弧,IMAGE,点,块引用,外部块参照,射线,云线,文本,多行文本,对齐标注,旋转标注 ,半径标注,直径标注,角度标注,OLE对象,布局,视口,图层,线型,文字样式,命名字典,标注, 自定义实体 ,代理实体, 反应器 等。主要编辑有:移动,夹点拉伸,偏移,删除,复制,粘贴,旋转,缩放,镜向,离散,图案填充,实心填充,打碎,计算曲线长,面积,最jin点,交点,导角, 文字变线条 等。

编辑支持

移动、夹点拉伸、偏移、删除、复制、粘贴、旋转、缩放、镜向、离散、图案填充、实心填充、打碎、计算曲线长、面积、最近点、交点、倒角、文字变线条等。

几何运算

面积,夹角,向量,矩阵,旋转,缩放,最进点,最进距离,垂足,参数,镜向,平移,交点,打断,延伸, 最短路径最长路径

支持事件

鼠标事件键盘事件 ,选择修改,夹点编辑,打图纸完成,命令开始,命令执行完成,视区变化,动态提示,动态绘制,超连接点击,对象修改,命令执行,进度条变动,系统变量修改,控件初始化完成,等事件。