h5用什么網(wǎng)站來做推廣怎么推
Qt拖拽事件詳解及代碼實現(xiàn)
- 前言
- 項目描述
- 代碼結(jié)構(gòu)簡介
- 代碼詳解
前言
qt拖拽事件是一項非常常用并且非常好用的功能,拖拽實際上是一種信息傳遞的載體,其目的是將信息從一個對象傳遞給另一個對象。通過拖拽可以簡化文件打開或業(yè)務(wù)操作流程,qt初學(xué)者學(xué)會拖拽事件后就可以馬上開發(fā)出許多有趣的項目,本文以一個簡單的示例來介紹拖拽事件功能。
項目描述
本項目通過搭建兩個對話框,一個作為拖拽信息來源,另一個作為拖拽信息目標,介紹拖拽事件,主要實現(xiàn)了字符串信息的傳遞,并且對拖拽過程的動作進行了探索。
代碼結(jié)構(gòu)簡介
DragDropWidget類實現(xiàn)了拖拽發(fā)起對話框,主要是重寫了鼠標事件函數(shù),用于設(shè)置拖拽搭載的信息,這里就是一個字符串,實際上也可以是自定義的類或者其他對象。代碼詳見dragdropwidget.h及dragdropwidget.cpp。
AcceptWidget類實現(xiàn)了拖拽接收對話框,主要重寫了拖拽進入及拖拽放置函數(shù),用于處理拖拽進入的信息。代碼詳見acceptwidget.h及acceptwidget.cpp。
代碼詳解
dragdropwidget.h
#ifndef DRAGDROPWIDGET_H
#define DRAGDROPWIDGET_H#include <QWidget>class DragDropWidget : public QWidget
{Q_OBJECTpublic:DragDropWidget(QWidget *parent = 0);~DragDropWidget();protected:void mousePressEvent(QMouseEvent *event) override;void mouseMoveEvent(QMouseEvent *event) override;void mouseReleaseEvent(QMouseEvent *event) override;
private:QPoint m_DragStartPos;
};#endif // DRAGDROPWIDGET_H
在DragDropWidget 類的頭文件中聲明了經(jīng)典鼠標處理三事件,并聲明了一個成員變量m_DragStartPos,用于記錄拖拽的起始位置。
dragdropwidget.cpp
#include "dragdropwidget.h"#include <QStyle>
#include <QStyleOption>
#include <QIcon>
#include <QDrag>
#include <QMimeData>
#include <QMouseEvent>
#include <QApplication>#include <QLabel>
#include <QDebug>DragDropWidget::DragDropWidget(QWidget *parent): QWidget(parent)
{m_DragStartPos=QPoint(-1,-1);setWindowTitle("dragwidget");
}DragDropWidget::~DragDropWidget()
{}void DragDropWidget::mousePressEvent(QMouseEvent *event)
{if(event->button()==Qt::LeftButton){m_DragStartPos=event->pos();printf("====mousepressed\n");}
}void DragDropWidget::mouseMoveEvent(QMouseEvent *event)
{if (event->buttons() & Qt::LeftButton){if(QLineF(event->pos(),m_DragStartPos).length()<QApplication::startDragDistance()){printf("distence less\n");return;}printf("===process drag\n");QDrag *drag=new QDrag(this);QMimeData *mimedata=new QMimeData;mimedata->setData("localtype","teststr");drag->setMimeData(mimedata);QStyle *style = QApplication::style();QStyleOption option;QIcon icon = style->standardIcon(QStyle::SP_DialogOpenButton, &option, nullptr);QPixmap pixmap = icon.pixmap(32, 32);drag->setPixmap(pixmap);drag->setHotSpot(QPoint(10,10));Qt::DropAction dropaction=drag->exec(Qt::CopyAction); //| Qt::MoveAction}
}void DragDropWidget::mouseReleaseEvent(QMouseEvent *event)
{QWidget::mouseReleaseEvent(event);
}
在構(gòu)造函數(shù)中,對拖拽起始位置進行了初始化,并設(shè)置了窗口名稱;在mousePressEvent函數(shù)中,判斷了是否為左鍵點擊,并更新了拖拽起始位置;在mouseMoveEvent函數(shù)中,首先判斷拖拽事件中左鍵是否在移動中保持了點擊狀態(tài),
if (event->buttons() & Qt::LeftButton)
event->buttons()獲取在移動過程中的所有保持點擊狀態(tài)的按鈕,和Qt::LeftButton做&運算,用于判斷左鍵是否在這些按鈕中,據(jù)此判斷左鍵是否在移動中保持點擊狀態(tài);
if(QLineF(event->pos(),m_DragStartPos).length()<QApplication::startDragDistance())
通過判斷當(dāng)前鼠標所在位置與起始拖拽點之間的距離是否超過一定范圍來判斷拖拽是否有效,QApplication::startDragDistance()為10px;
QDrag *drag=new QDrag(this);QMimeData *mimedata=new QMimeData;
首先構(gòu)造了QDrag及QMimeData對象;
mimedata->setData("localtype","teststr");
然后對QMimeData對象設(shè)置了數(shù)據(jù),這里setData有兩個參數(shù),這里用的是通用的數(shù)據(jù)設(shè)置綁定方法,第一個參數(shù)“l(fā)ocaltype”為設(shè)置的數(shù)據(jù)類型,這里可以自定義一個字符串作為類型,第二個參數(shù)即為傳遞的數(shù)據(jù),第二個參數(shù)的類型為QByteArray,也就是說,傳進來的內(nèi)容將會被轉(zhuǎn)為QByteArray類型,后續(xù)在解析時可以將QByteArray還原為傳入的類型。
drag->setMimeData(mimedata);
這里將QMimeData對象綁定到QDrag對象,借助QDrag對象實現(xiàn)數(shù)據(jù)的傳遞;
QStyle *style = QApplication::style();QStyleOption option;QIcon icon = style->standardIcon(QStyle::SP_DialogOpenButton, &option, nullptr);QPixmap pixmap = icon.pixmap(32, 32);drag->setPixmap(pixmap);drag->setHotSpot(QPoint(10,10));
這里實際上是對QDrag對象設(shè)置一個圖標,用于在拖拽過程中顯示,這里使用了qt內(nèi)置的標準圖標,setHotSpot函數(shù)用于指定拖拽點位于圖標的位置;
Qt::DropAction dropaction=drag->exec(Qt::CopyAction);
最后執(zhí)行了QDrag對象的exec函數(shù),這里可以指定拖拽動作類型,不同的類型會影響后面在接收拖拽時的顯示,例如Qt::CopyAction在接收拖拽時則會在之前設(shè)置的圖標右下角顯示一個“+”號;
acceptwidget.h
#ifndef ACCEPTWIDGET_H
#define ACCEPTWIDGET_H#include <QWidget>class QDragEnterEvent;
class QDropEvent;class AcceptWidget : public QWidget
{Q_OBJECT
public:explicit AcceptWidget(QWidget *parent = nullptr);
protected:void dragEnterEvent(QDragEnterEvent *event) override;void dropEvent(QDropEvent *event) override;signals:public slots:
};#endif // ACCEPTWIDGET_H
AcceptWidget 類的頭文件中聲明了處理接收拖拽事件的dragEnterEvent及dropEvent函數(shù),這兩個函數(shù)是處理接收拖拽事件最基本的兩個函數(shù),dragEnterEvent用于處理進入本窗口時需要做出的操作,例如判斷拖拽進入的內(nèi)容是否需要接受等,dropEvent函數(shù)用于處理確認接收拖拽事件的操作,主要是獲取QMimeData;
acceptwidget.cpp
#include "acceptwidget.h"#include <QStyle>
#include <QStyleOption>
#include <QIcon>
#include <QLabel>
#include <QMimeData>
#include <QDropEvent>
#include <QDragEnterEvent>
#include <QApplication>AcceptWidget::AcceptWidget(QWidget *parent) : QWidget(parent)
{setWindowTitle("Drop Widget");this->setAcceptDrops(true);
}void AcceptWidget::dragEnterEvent(QDragEnterEvent *event)
{event->acceptProposedAction();printf("drag enter\n");
}void AcceptWidget::dropEvent(QDropEvent *event)
{printf("grop enter\n");const QMimeData *mimedata= event->mimeData();if(mimedata->hasFormat("localtype")){QByteArray mimestr=mimedata->data("localtype");std::string sstr=mimestr.toStdString();printf("=====sstring==%s\n",sstr.c_str());QLabel *label=new QLabel(this);QStyle *style = QApplication::style();QStyleOption option;QIcon icon = style->standardIcon(QStyle::SP_DialogOpenButton, &option, nullptr);QPixmap pixmap = icon.pixmap(32, 32);label->setPixmap(pixmap);label->move(event->pos());label->show();}
}
AcceptWidget 類的源文件主要代碼在dropEvent函數(shù)中,當(dāng)然首先需要在構(gòu)造函數(shù)中開啟接收拖拽事件的標識通過setAcceptDrops(true),來標識本窗口接收拖拽事件;
event->acceptProposedAction();
在dragEnterEvent函數(shù)中確認接受拖拽事件的動作,這樣拖拽事件才能進入dropEvent函數(shù);
const QMimeData *mimedata= event->mimeData();
在dropEvent函數(shù)中直接通過QDropEvent 即可獲取拖拽事件傳遞來的QMimeData 對象;
if(mimedata->hasFormat("localtype"))
首先對傳遞來的QMimeData 對象進行類型判斷,使用hasFormat函數(shù),這里的類型參數(shù)即為拖拽事件產(chǎn)生窗口中設(shè)置的參數(shù);
QByteArray mimestr=mimedata->data("localtype");std::string sstr=mimestr.toStdString();
首先根據(jù)類型從QMimeData 對象中獲取QByteArray 格式的數(shù)據(jù),然后通過轉(zhuǎn)換,恢復(fù)為原始類型,這里傳遞的是字符串類型,最終恢復(fù)為字符串類型;
QLabel *label=new QLabel(this);QStyle *style = QApplication::style();QStyleOption option;QIcon icon = style->standardIcon(QStyle::SP_DialogOpenButton, &option, nullptr);QPixmap pixmap = icon.pixmap(32, 32);label->setPixmap(pixmap);label->move(event->pos());label->show();
后面為了拖拽事件更有趣味,在窗口中用Qlabel顯示了許多圖標。
main.cpp
#include <QApplication>#include "dragdropwidget.h"
#include "acceptwidget.h"int main(int argc, char *argv[])
{QApplication a(argc, argv);DragDropWidget w;w.show();AcceptWidget aw;aw.move(800,0);aw.show();return a.exec();
}
demo.pro
QT += core guigreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsTARGET = DragDropDemo
TEMPLATE = appDEFINES += QT_DEPRECATED_WARNINGSSOURCES += \main.cpp \dragdropwidget.cpp \acceptwidget.cppHEADERS += \dragdropwidget.h \acceptwidget.hMOC_DIR = ./moc
OBJECTS_DIR = ./moc