• 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
    }
  • 相关阅读:
    CentOS 6.4下Squid代理服务器的安装与配置
    从C++到objectivec[转]
    在Objectivec里面使用property教程【转】
    Socket常用的数据结构【转】
    iOS 5 Storyboard 学习之 Tabbar Controller,Navigation Controller (1)
    Linux Socket编程(不限Linux)
    重要的套接字函数[转]
    HTTP,TCP/IP
    网络编程socket之bind函数[转]
    linux 下遍历目录中的目录项
  • 原文地址:https://www.cnblogs.com/duxie/p/11806769.html
Copyright © 2020-2023  润新知