您好,登錄后才能下訂單哦!
1、接受拖放
Drag & Drop 是一個界面操作,用于在兩個窗口間傳遞數據。
Drag Source: 拖放源窗口
Drag Target: 拖放目標窗口
拖放操作:
1、在源窗口:選中目標,按下鼠標,移動,拖至目標窗口(Drag)
2、在目標窗口:取消鼠標,到指定位置,松開鼠標(Drop)
(按下ESC取消操作)
MIME:
MIME(Multipurpose Internet Mail Extensions)被傳遞的數據以MIME格式傳送,它是多組type-data數據:(type0, data0) (type1, data1) (type2, data2) ... (type-n, data-n)
其中,
type:字符串,用于指定數據類型,如:“text/plain”
data:字節數組,即要傳遞的數據
接受拖放的步驟:
// 接受拖放 setAcceptDrops( true ); // 重寫 void dragEnterEvent( QDragEnterEvent* event ); void dragLeaveEvent( QDragLeaveEvent* event ); void dragMoveEvent( QDragMoveEvent* event ); void dropEvent( QDropEvent* event );
小練習:
實現一個簡單的窗體,當文本被拖入該窗體時,窗體內的label控件會顯示拖入的文本內容
代碼:
#include <QDragEnterEvent> #include <QDragLeaveEvent> #include <QDragMoveEvent> #include <QDropEvent> #include <QMimeData> #include "Test13_1a_12_18.h" Test13_1a_12_18::Test13_1a_12_18(QWidget *parent) : QMainWindow(parent) { ui.setupUi(this); setAcceptDrops(true); //設置:接受拖放 } // 進入 void Test13_1a_12_18::dragEnterEvent(QDragEnterEvent *event) { if ( event->mimeData()->hasFormat("text/plain") ) { event->acceptProposedAction(); } } //松開鼠標 void Test13_1a_12_18::dropEvent(QDropEvent *event) { if (event->mimeData()->hasFormat("text/plain")) { QString text = event->mimeData()->text(); ui.label->setText(text); } }
二、發起拖放
在QWidget窗口中發起一個Drag操作 步驟:
1、鼠標按下
2、鼠標移動,當移動一段距離后,認為是一個拖動操作。可以發起一個drag動作
實現方法:
1、派生一個子類
2、重寫函數:
virtual void mouseMoveEvent( QMouseEvent* event ); virtual void mousePressEvent( QMouseEvent* event );
同時傳送多種MIME數據:
mimeData->setHtml( "xxxxxxx" ); mimeData->setText( text ); mimeData->("123," dat); //自定義格式的數據 //data : QByteArray
void MyListWidget::mousePressEvent(QMouseEvent *event) { // 記下起點 m_dragPosition = event->pos(); m_dragItem = this->itemAt(m_dragPosition); // 記得調用父類的函數(保持原有的按鍵行為) QListWidget::mouseMoveEvent(event); } void MyListWidget::mouseMoveEvent(QMouseEvent *event) { // 只允許用左鍵拖動 if ( !(event->buttons() & Qt::LeftButton) ) { return; } // 移動一定距離后,才算是開始拖動 if ((event->pos() - m_dragPosition).manhattanLength() < QApplication::startDragDistance()) { return; } // 找到拖動的項 if (!m_dragItem) { return; } QString text = m_dragItem->text(); // 創建數據 QDrag* drag = new QDrag(this); QMimeData* mimeData = new QMimeData; mimeData->setText(text); drag->setMimeData(mimeData); // 啟動拖放 start a drag Qt::DropAction result = drag->exec(Qt::CopyAction | Qt::MoveAction); // 檢查操作是否成功 if (Qt::IgnoreAction != result) { } else { // 按住Ctrl鍵: Qt::CopyAction // 沒按: Qt::RemoveAction } }
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。