通用移動類,目標就是為了實現放入任意的控件以后,支持鼠標拖動,在容器中或者父類中拖動,這個應用場景非常多,比如在地圖上放置的設備,需要用戶自行按下拖動到指定的合適的位置,然后保存設備的位置坐標到數據庫,下次打開直接加載,在一些安防項目、電力項目、環境監測等上面大量運用,有時候設備對應了多種類型,以前做的辦法是將這個移動的代碼直接封裝在對應設備的自定義控件中,有個巨大缺點就是如果再新增加一個控件,又需要重復的代碼加到控件中才行,可否將這個功能獨立出來,只要傳入控件就行呢,當然可以,比如我寫過很多自定義控件,現在需要控件放到某個容器中能自由拖動,只需要new出通用移動類來就行。
項目開源地址:https://gitee.com/feiyangqingyun/QWidgetDemo
#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;
}
原文鏈接:https://www.cnblogs.com/feiyangqingyun/p/11608377.html
【領QT開發教程學習資料,點擊下方鏈接莬費領取↓↓,先碼住不迷路~】
點擊這里:Qt資料領取(視頻教程+文檔+代碼+項目實戰)
用JavaScript實現頁面滑動到指定位置加載動畫。
若頁面滾動到class名為group-pic的元素的位置時開始加載
原理: 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點,交點,導角, 文字變線條 等。
編輯支持
移動、夾點拉伸、偏移、刪除、復制、粘貼、旋轉、縮放、鏡向、離散、圖案填充、實心填充、打碎、計算曲線長、面積、最近點、交點、倒角、文字變線條等。
幾何運算
面積,夾角,向量,矩陣,旋轉,縮放,最進點,最進距離,垂足,參數,鏡向,平移,交點,打斷,延伸, 最短路徑 , 最長路徑 。
支持事件
鼠標事件 , 鍵盤事件 ,選擇修改,夾點編輯,打圖紙完成,命令開始,命令執行完成,視區變化,動態提示,動態繪制,超連接點擊,對象修改,命令執行,進度條變動,系統變量修改,控件初始化完成,等事件。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。