Qt 拖拽写法
时间: 2023-07-06 16:06:31 浏览: 86
在 Qt 中实现拖拽操作通常需要以下步骤:
1. 在拖拽源控件中实现 mousePressEvent 事件,在该事件中设置拖拽操作的数据(如 MIME 类型)。
2. 在拖拽源控件中实现 mouseMoveEvent 事件,在该事件中开始拖拽操作,并设置拖拽操作的数据(如 MIME 类型)。
3. 在拖拽目标控件中实现 dragEnterEvent 事件,在该事件中判断是否支持接受拖拽的数据类型。
4. 在拖拽目标控件中实现 dropEvent 事件,在该事件中获取拖拽操作的数据,并进行相应处理。
下面是一个简单的例子:
```C++
// 拖拽源控件 MyWidget
class MyWidget : public QWidget
{
public:
MyWidget(QWidget *parent = nullptr) : QWidget(parent)
{
setAcceptDrops(true);
}
protected:
void mousePressEvent(QMouseEvent *event) override
{
if (event->button() == Qt::LeftButton) {
QDrag *drag = new QDrag(this);
QMimeData *mimeData = new QMimeData;
mimeData->setData("text/plain", "Hello, world!");
drag->setMimeData(mimeData);
drag->exec();
}
}
void mouseMoveEvent(QMouseEvent *event) override
{
if (event->buttons() & Qt::LeftButton) {
QDrag *drag = new QDrag(this);
QMimeData *mimeData = new QMimeData;
mimeData->setData("text/plain", "Hello, world!");
drag->setMimeData(mimeData);
drag->exec();
}
}
};
// 拖拽目标控件 MyDropWidget
class MyDropWidget : public QWidget
{
public:
MyDropWidget(QWidget *parent = nullptr) : QWidget(parent)
{
setAcceptDrops(true);
}
protected:
void dragEnterEvent(QDragEnterEvent *event) override
{
if (event->mimeData()->hasFormat("text/plain")) {
event->acceptProposedAction();
}
}
void dropEvent(QDropEvent *event) override
{
if (event->mimeData()->hasFormat("text/plain")) {
QString text = event->mimeData()->data("text/plain");
QMessageBox::information(this, "Drop", text);
event->acceptProposedAction();
}
}
};
```
在上面的例子中,MyWidget 是拖拽源控件,MyDropWidget 是拖拽目标控件。当在 MyWidget 上按下鼠标左键并移动时,会开始一个拖拽操作,并设置数据为 "Hello, world!"。当该拖拽操作到达 MyDropWidget 时,如果数据类型为 "text/plain",则弹出一个消息框显示数据内容。
阅读全文