惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

雷峰网
雷峰网
MongoDB | Blog
MongoDB | Blog
D
Docker
Martin Fowler
Martin Fowler
人人都是产品经理
人人都是产品经理
GbyAI
GbyAI
Jina AI
Jina AI
酷 壳 – CoolShell
酷 壳 – CoolShell
M
MIT News - Artificial intelligence
腾讯CDC
阮一峰的网络日志
阮一峰的网络日志
H
Hackread – Cybersecurity News, Data Breaches, AI and More
N
Netflix TechBlog - Medium
B
Blog RSS Feed
云风的 BLOG
云风的 BLOG
Blog — PlanetScale
Blog — PlanetScale
Vercel News
Vercel News
The Cloudflare Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
有赞技术团队
有赞技术团队
G
Google Developers Blog
Stack Overflow Blog
Stack Overflow Blog
I
InfoQ
U
Unit 42

博客园 - StationaryTraveller

如何查找微软VS软件中的图标 SQLite 的自增(AUTOINCREMENT)强制要求列的数据类型必须是INTEGER Qt动态获取翻译文本 Windows判断某窗口是否被其他窗口完全覆盖 MFC实现一个通用模态进度条窗口 如何批量修改“后期生成事件”为“预生成事件” MFC对话框中如何给一个控件发送消息 Window剪切板 C语言根据函数指针偏移实现函数动态调用 Qt程序系统文本翻译 SVN创建分支 Qt多版本如何共存 Qt6编译的程序在某些win10系统报错 电脑忘机了用户名密码怎么办 Qt事件过滤器实现空闲检测 CMFCToolTipCtrl的AddTool导致内存增加 MFC中CBitmap、CBrush、CFont、CPalette、CPen、CRgn删除GDI对象问题 Windows系统下通过命令行获取进程指标 命令模式实现撤销和重做机制 避免溢出求平均值的算法 字节流转16进制字符串 PImpl:Pointer to Implementation C++单例
实现从QListWidgett拖拽项到QTableWidget
StationaryTraveller · 2024-12-06 · via 博客园 - StationaryTraveller

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);