【Qt】Qt再學習(十):滑鼠拖拽(drag&drop)QGraphicsItem示例
阿新 • • 發佈:2021-01-20
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);
}