1. 程式人生 > 其它 >【Qt】Qt再學習(十):滑鼠拖拽(drag&drop)QGraphicsItem示例

【Qt】Qt再學習(十):滑鼠拖拽(drag&drop)QGraphicsItem示例

技術標籤:Qtqt

1、滑鼠拖拽(drag&drop)QGraphicsItem

實現方法,繼承QGraphicsItem,過載滑鼠按下、移動、釋放事件處理函式

class ColorItem : public QGraphicsItem
{...
protected:
    void mousePressEvent(QGraphicsSceneMouseEvent *event) override;
    void mouseMoveEvent(QGraphicsSceneMouseEvent *event) override;
    void mouseReleaseEvent
(QGraphicsSceneMouseEvent *event) override; }...

實現函式詳解:

1.1 按下滑鼠左鍵時顯示為抓緊的小手

在這裡插入圖片描述

void ColorItem::mousePressEvent(QGraphicsSceneMouseEvent *)
{
    setCursor(Qt::ClosedHandCursor);
}
1.2 釋放滑鼠時,顯示為鬆開的小手

在這裡插入圖片描述

void ColorItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *)
{
    setCursor(Qt::OpenHandCursor);
}
1.3 拖動的實現:QDrag
void ColorItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
	/ 滑鼠拖動的距離要不小於程式預設的最小拖動距離,才執行操作
	/ QApplication::startDragDistance():程式預設的最小拖動距離
    if (QLineF(event->screenPos(), event->buttonDownScreenPos(Qt::LeftButton))
        .length() < QApplication::startDragDistance
()) { return; } / 建立拖拽類:QDrag,event->widget()是事件所屬的視窗,不是this QDrag *drag = new QDrag(event->widget()); / QMimeData類為資料提供一個容器,用來記錄關於MIME型別資料的資訊 QMimeData常用來描述儲存在剪下板或者拖拽裡的資訊 QMimeData *mime = new QMimeData; drag->setMimeData(mime); static int n = 0; if (n++ > 2 && QRandomGenerator::global()->bounded(3) == 0) { / 下面是演示拖拽圖片,將圖片存到QMimeData中 QImage image(":/images/head.png"); mime->setImageData(image); / 縮放圖片後,用於在拖拽過程中顯示 drag->setPixmap(QPixmap::fromImage(image).scaled(30, 40)); / 縮放的圖片在滑鼠左上方指定位置QPoint(15, 30)顯示 drag->setHotSpot(QPoint(15, 30)); } else { / 下面是演示拖動顏色、文字 mime->setColorData(color); mime->setText(QString("#%1%2%3") .arg(color.red(), 2, 16, QLatin1Char('0')) .arg(color.green(), 2, 16, QLatin1Char('0')) .arg(color.blue(), 2, 16, QLatin1Char('0'))); QPixmap pixmap(34, 34); pixmap.fill(Qt::white); QPainter painter(&pixmap); painter.translate(15, 15); painter.setRenderHint(QPainter::Antialiasing); paint(&painter, nullptr, nullptr); painter.end(); pixmap.setMask(pixmap.createHeuristicMask()); drag->setPixmap(pixmap); drag->setHotSpot(QPoint(15, 20)); } drag->exec(); setCursor(Qt::OpenHandCursor); }