Qt在部件中进行拖放
Qt中的拖放支持以QDrag为中心,拖放操作的大部分细节由该类处理。
除了创建QDrag对象外,还需要重新实现dragMoveEvent()来接受事件和dropEvent()处理部件上的数据。最终DragEnterEvent()需要重新实现才能接受事件。
在处理拖放操作的控件上,还需要调用
setAcceptDrops(true);
代码实现:
mydialog.h
class MyDialog : public QDialog
{
Q_OBJECT
public:
explicit MyDialog(QWidget *parent = nullptr);
~MyDialog();
public slots:
void makeDrag();
protected:
void dropEvent(QDropEvent *de);
void dragMoveEvent(QDragMoveEvent *de);
void dragEnterEvent(QDragEnterEvent *event);
private:
Ui::MyDialog *ui;
};
class MyGroupBox : public QGroupBox
{
public:
MyGroupBox(QWidget *parent = nullptr) : QGroupBox(parent) {}
protected:
void dropEvent(QDropEvent *de);
void dragMoveEvent(QDragMoveEvent *de);
void dragEnterEvent(QDragEnterEvent *event);
};
mydialog.cpp
#include <QDebug>
MyDialog::MyDialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::MyDialog)
{
ui->setupUi(this);
QHBoxLayout *layout = new QHBoxLayout(this);
QPushButton *pushButton = new QPushButton("Click Me", this);
layout->addWidget(pushButton);
connect(pushButton, SIGNAL(pressed()), this, SLOT(makeDrag()));
MyGroupBox *box = new MyGroupBox(this);
layout->addWidget(box);
// 允许在dialog上拖放
setAcceptDrops(true);
// 允许在group box上拖放
box->setAcceptDrops(true);
}
MyDialog::~MyDialog()
{
delete ui;
}
void MyDialog::makeDrag() {
QDrag *dr = new QDrag(this);
// 拖放操作传递的数据存放在QMimeData 对象中
QMimeData *data = new QMimeData;
data->setText("This is a test");
// 将QMimeData 数据的所属权分配给QDrag 对象
dr->setMimeData(data);
// 开始拖放操作
dr->start();
}
void MyDialog::dragMoveEvent(QDragMoveEvent *de) {
// 在此处接收拖放事件
de->accept();
}
void MyDialog::dragEnterEvent(QDragEnterEvent *event) {
// 将drop操作设置为建议的操作
event->acceptProposedAction();
}
void MyDialog::dropEvent(QDropEvent *de) {
// 将数据解包,并按照希望的方式处理
qDebug("Contents: my dialog %s", de->mimeData()->text().toLatin1().data());
}
void MyGroupBox::dropEvent(QDropEvent *de) {
// 将数据解包,并按照希望的方式处理
qDebug("Contents: group box %s", de->mimeData()->text().toLatin1().data());
}
void MyGroupBox::dragMoveEvent(QDragMoveEvent *de) {
// 在此处接收拖放事件
de->accept();
}
void MyGroupBox::dragEnterEvent(QDragEnterEvent *event) {
// 将drop操作设置为建议的操作
event->acceptProposedAction();
}
调用:
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MyDialog d;
d.show();
return a.exec();
}
在groupbox上放开和在dialog中放开鼠标,如下输出:
Contents: group box This is a test
Contents: my dialog This is a test