实现从QListWidgett拖拽项到QTableWidget
1、子类化QListWidget
class ToolStoreListWidget : public QListWidget
{
Q_OBJECT
public:
explicit ToolStoreListWidget(QWidget *parent = nullptr);
protected:
void mousePressEvent(QMouseEvent *event) override;
void mouseMoveEvent(QMouseEvent *event) override;
private:
void performDrag();
private:
QPoint dragStartPos;
int row;
};
ToolStoreListWidget::ToolStoreListWidget(QWidget *parent)
: QListWidget{parent}
{
}
void ToolStoreListWidget::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton) {
QPoint pos = event->pos();
row = indexAt(pos).row();
if (row >= 0)
{
dragStartPos = pos;
}
}
QListWidget::mousePressEvent(event);
}
void ToolStoreListWidget::mouseMoveEvent(QMouseEvent *event)
{
if (event->buttons() & Qt::LeftButton) {
int distance = (event->pos() - dragStartPos).manhattanLength();
if (distance >= QApplication::startDragDistance())
performDrag();
}
QListWidget::mouseMoveEvent(event);
}
void ToolStoreListWidget::performDrag()
{
QListWidgetItem *item = this->item(row);
if (item != nullptr)
{
ToolEntity data = item->data(Qt::UserRole).value<ToolEntity>();
QByteArray byteArray;
QDataStream out(&byteArray, QIODevice::WriteOnly);
out << data;
QMimeData *mimeData = new QMimeData();
mimeData->setData("ToolStoreListItem", byteArray);
QDrag *drag = new QDrag(this);
drag->setMimeData(mimeData);
drag->exec(Qt::CopyAction);
}
}
2、子类化QTableWidget
class ToolTableWidget : public QTableWidget
{
Q_OBJECT
public:
explicit ToolTableWidget(QWidget *parent = nullptr);
signals:
// QWidget interface
protected:
void dragEnterEvent(QDragEnterEvent *event) override;
void dropEvent(QDropEvent *event) override;
void dragMoveEvent(QDragMoveEvent *event) override;
private:
bool isExist(QByteArray data);
};
ToolTableWidget::ToolTableWidget(QWidget *parent)
: QTableWidget{parent}
{
}
bool ToolTableWidget::isExist(QByteArray data)
{
QDataStream in(&data, QIODevice::ReadOnly);
ToolEntity entity;
in >> entity;
for (int i = 0; i < rowCount(); ++i)
{
ToolEntity e = item(i, 0)->data(Qt::UserRole).value<ToolEntity>();
if (entity.mId == e.mId)
{
return true;
}
}
return false;
}
void ToolTableWidget::dragEnterEvent(QDragEnterEvent *event)
{
if (event->mimeData()->hasFormat("ToolStoreListItem") &&
(!isExist(event->mimeData()->data("ToolStoreListItem"))))
{
event->acceptProposedAction();
}
}
void ToolTableWidget::dragMoveEvent(QDragMoveEvent *event)
{
if (event->mimeData()->hasFormat("ToolStoreListItem"))
{
#if (QT_VERSION < QT_VERSION_CHECK(6,0,0))
QTableWidgetItem* curItem = itemAt(event->pos());
#else
QTableWidgetItem* curItem = itemAt(event->position().toPoint());
#endif
if (curItem != nullptr)
{
selectRow(curItem->row());
}
event->acceptProposedAction();
}
}
void ToolTableWidget::dropEvent(QDropEvent *event)
{
if (event->mimeData()->hasFormat("ToolStoreListItem"))
{
#if (QT_VERSION < QT_VERSION_CHECK(6,0,0))
QTableWidgetItem* curItem = itemAt(event->pos());
#else
QTableWidgetItem* curItem = itemAt(event->position().toPoint());
#endif
int idx = rowCount();
if (curItem != nullptr)
{
idx = curItem->row();
}
QByteArray data = event->mimeData()->data("ToolStoreListItem");
QDataStream in(&data, QIODevice::ReadOnly);
ToolEntity entity;
in >> entity;
insertRow(idx);
QTableWidgetItem* item = new QTableWidgetItem();
item->setText(entity.mName);
item->setData(Qt::UserRole, QVariant::fromValue(entity));
setItem(idx, 0, item);
setItem(idx, 1, new QTableWidgetItem(entity.mModel));
selectRow(idx);
event->setDropAction(Qt::CopyAction);
event->accept();
}
}
3、ToolStoreListWidget开启拖拽
mToolStoreWidget->setDragEnabled(true);
4、ToolTableWidget开启接受拖拽
mToolWidget->setAcceptDrops(true);

浙公网安备 33010602011771号