功能描述:
两个界面之间拖拽控件,在另一个界面生成相同的控件
.h文件
#include <QEvent>
#include <QDrag>
#include <QDragEnterEvent>
#include <QDragLeaveEvent>
#include <QDropEvent>
#include <QEvent>
#include <QMimeData>
#include <QVBoxLayout>
#include <QGridLayout>
#include <QPixmap>
#include "ui_TestBag.h"
class TestBag : public QWidget
{
Q_OBJECT
public:
TestBag(QWidget *parent = Q_NULLPTR);
protected:
void dragEnterEvent(QDragEnterEvent* event);
void dragMoveEvent(QDragMoveEvent* event);
void dropEvent(QDropEvent* event);
void mousePressEvent(QMouseEvent* event);
private:
Ui::TestBagClass ui;
QVBoxLayout* m_pVBoxLayout;
//QGridLayout* m_pGrid
};
.cpp文件
#include "TestBag.h"
#include <QFile>
#include <QFileDialog>
#include <QPushButton>
#include <QTextStream>
#include <QLabel>
#include <QPainter>
TestBag::TestBag(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
this->setMouseTracking(true);
this->setAcceptDrops(true);
QLabel* pLabel = new QLabel(this);
pLabel->setText(tr("Test"));
m_pVBoxLayout = new QVBoxLayout;
m_pVBoxLayout->addWidget(pLabel);
this->setLayout(m_pVBoxLayout);
m_pVBoxLayout->setAlignment(Qt::AlignTop);
}
void TestBag::dragEnterEvent(QDragEnterEvent* event)
{
if (event->mimeData()->hasFormat("application/x-dnditemdata")) {
if (event->source() == this) {
event->setDropAction(Qt::MoveAction);
event->accept();
}
else
event->acceptProposedAction();
}
else
event->ignore();
}
void TestBag::dragMoveEvent(QDragMoveEvent* event)
{
if (event->mimeData()->hasFormat("application/x-dnditemdata")){
if (event->source() == this) {
event->setDropAction(Qt::MoveAction);
event->accept();
}
else
event->acceptProposedAction();
}
else {
event->ignore();
}
}
void TestBag::dropEvent(QDropEvent* event)
{
if (event->mimeData()->hasFormat("application/x-dnditemdata")) {
QByteArray array = event->mimeData()->data("application/x-dnditemdata");
QDataStream stream(&array, QIODevice::ReadOnly);
QString text = "";
QPoint offset;
stream >> text >> offset;
//移入的对象
QLabel* pResult = new QLabel(this);
pResult->setText(text);
pResult->move(event->pos() - offset);
pResult->show();
//加入到本界面的布局中
m_pVBoxLayout->addWidget(pResult);
if (event->source() == this)
{
event->setDropAction(Qt::MoveAction);
event->accept();
}
else
event->acceptProposedAction();
}
else {
event->ignore();
}
}
void TestBag::mousePressEvent(QMouseEvent* event)
{
QLabel* pDragButton = static_cast<QLabel*>(childAt(event->pos()));
if (pDragButton == nullptr)
return;
//获取移动控件截图
QPixmap image = QPixmap::grabWidget(pDragButton, pDragButton->rect());
QString text = pDragButton->text();
QByteArray array;
QDataStream stream(&array, QIODevice::WriteOnly);
stream << text << QPoint(event->pos() - pDragButton->pos());
QMimeData* pMimeData = new QMimeData;
pMimeData->setData("application/x-dnditemdata", array);
//将拖动的控件截图跟着鼠标光标移动
QDrag* drag = new QDrag(this);
drag->setMimeData(pMimeData);
drag->setPixmap(image);
drag->setHotSpot(event->pos() - pDragButton->pos());
if (drag->exec(Qt::CopyAction | Qt::MoveAction, Qt::CopyAction) == Qt::MoveAction) {
pDragButton->close();
}
else {
pDragButton->show();
pDragButton->setText(text);
}
}
Qt中的拖拽(针对两个界面之间的拖动)
于 2021-05-18 11:34:41 首次发布