• Qt ListWidget item 发起拖放


    第一步:重写类 MyListWidget 继承自 QListWidget

    第二步:重写 mousePressEvent 函数 和 mouseMoveEvent 函数

    void mousePressEvent(QMouseEvent* event);
    void mouseMoveEvent(QMouseEvent* event);

    MyListWidget.h 文件

    #ifndef MYLISTWIDGET_H
    #define MYLISTWIDGET_H
    
    #include <QListWidget>
    // 包含所有用到的界面类
    #include <QtGui>
    
    class MyListWidget : public QListWidget
    {
        Q_OBJECT
    
    public:
        MyListWidget(QWidget *parent);
        ~MyListWidget();
    
    private:
        // 拖放起点
        QPoint m_startPos;
        // 被拖放的item
        QListWidgetItem* m_sitem;
        void mousePressEvent(QMouseEvent* event);
        void mouseMoveEvent(QMouseEvent* event);
    };
    
    #endif // MYLISTWIDGET_H

    MyListWidget.cpp 文件

    #include "MyListWidget.h"
    
    MyListWidget::MyListWidget(QWidget *parent)
        : QListWidget(parent)
    {
    
    }
    
    MyListWidget::~MyListWidget()
    {
    
    }
    
    void MyListWidget::mousePressEvent(QMouseEvent* event)
    {
        // 记下起点
        m_startPos = event->pos();
        m_sitem = this->itemAt(event->pos());
        // 记得调用父类的函数,保持原有的按键行为
        QListWidget::mouseMoveEvent(event);
    }
    
    void MyListWidget::mouseMoveEvent(QMouseEvent* event)
    {
        // 只允许左键拖动
        if (!(event->buttons() & Qt::LeftButton))
        {
            return;
        }
        // 移动一定距离后才算是开始拖动
        if ((event->pos() - m_startPos).manhattanLength() < QApplication::startDragDistance())
        {
            return;
        }
        // 找到拖动的项
        if (m_sitem == NULL)
        {
            return;
        }
        QString itemText = m_sitem->text();
        // 创建数据
        QDrag* drag = new QDrag(this);
        QMimeData* mimeData = new QMimeData();
        mimeData->setText(itemText);
        drag->setMimeData(mimeData);
        // 设置拖动时的图像显示
        QPixmap drag_img(120, 18);
        QPainter painter(&drag_img);
        painter.drawText(QRectF(20, 0, 120, 18), itemText, QTextOption(Qt::AlignVCenter));
        drag->setPixmap(drag_img);
        // 启动拖放 start a drag
        Qt::DropAction result = drag->exec(Qt::CopyAction | Qt::MoveAction);
        // 检查操作有没有成功,有没有被取消
        if (Qt::IgnoreAction != result)
        {
            qDebug() << QString::fromLocal8Bit("成功完成拖拽");
        }
        // 按住 Ctrl 就是 Qt::CopyAction,没按 就是 Qt::MoveAction
    }
  • 相关阅读:
    Gitblit搭建及Git协作开发流程
    Windows平台使用Gitblit搭建Git服务器图文教程
    gitblit搭建git服务器
    IntelliJ IDEA手动配置连接MySQL数据库
    如何去掉Intellij IDEA过多的警告 设置警告级别
    修改和重置WAMP的phpMyAdmin密码
    phpMyAdmin中config.inc.php设置密码和修改密码的方法
    Oracle、Mysql、SqlServer创建表和给表和字段加注释
    java注释规范
    JAVA基础补漏--static
  • 原文地址:https://www.cnblogs.com/duxie/p/11806769.html
Copyright © 2020-2023  润新知