QT窗口中的拖动

                                                                               QT窗口中的拖动
例如:下面有两个列表框,把其中一个列表框中的一项拖动到另外一个列表框中

QT窗口中的拖动_第1张图片

                                   下面是拖动之后的图片

QT窗口中的拖动_第2张图片

 

实现思路:

重新写一个myListWidget类继承于系统的QListWidget类

里面重新写5个系统事件:(.h文件中)

void mousePressEvent(QMouseEvent *event);                               //鼠标按下事件

void mouseMoveEvent(QMouseEvent *event);                               //鼠标移动事件

void dragEnterEvent(QDragEnterEvent *event);                              //myListWidget检测到有东西拖过来触发的事件 

void dropEvent(QDropEvent *event);                                              //拖动放到目标位置触发的事件

void dragMoveEvent(QDragMoveEvent *e);                                    //拖动过程中触发的事件

void Init();                                                            //初始化函数

 

.cpp文件中

void myListWidget::Init()

{

           this->setAcceptDrops(true);                                   //设置this可以接受拖动,没有这个不会触发拖动事件

           QFont* font = new QFont("微软雅黑",25,3);           //字体

           this->setFont(*font);            //设置窗口字体,

}

                             //头文件中添加#include 
void myListWidget::mousePressEvent(QMouseEvent *event)    //如果没有这个事件则不能选定列表项
{
    if(event->button()&Qt::LeftButton)             //只有左键按下时才为真
    {
        QListWidget::mousePressEvent(event);         //持续触发鼠标按下,直到有别的操作
    }
}
            

                           //头文件中添加#include 
void myListWidget::mouseMoveEvent(QMouseEvent *event)      
{
    if(event->button()&Qt::LeftButton)             //只有左键按下时才能拖动
    {
        QListWidgetItem* list_01 = this->currentItem();           //得到当前选中的列表项
        if(list_01)
        {
            QMimeData* mimdata = new QMimeData();     //头文件中添加#include 
                    //把当前选中列表项的文本保存到QMimeData中,以后可以在DropEvent中取出来
            mimdata->setText(list_01->text());
            

            QDrag* drag = new QDrag(this);
                    //把mimdata中保存的数据随着拖动发送到另一个窗口中
            drag->setPixmap(QPixmap("     这里面写图标路径    "));
                    //设置拖动过程中显示的图标
            drag->setMimeData(mimdata);
                    //把mimdata设置到drag中
            drag->exec(Qt::MoveAction);
                    //启动drag,参数表示drag类型,因为这里是拖动所以是Qt::MoveAction
            
            delete list_01;        //释放list_01,把原ListWidget中的拖动项删除掉
            QListWidget::mouseMoveEvent(event);       //持续触发鼠标移动,直到有别的操作
        }
    }
}



                      //头文件中添加#include 
void mylistWidget::dragEnterEvent(QDragEnterEvent *event)   
{
    QListWidget* listwidget = qobject_cast(event->source());
    //取得拖动事件触发的原object,这里的qobject_cast是Qt中的类型转换



    if(listwidget != NULL && listwidget != this)    
    {
        event->setDropAction(Qt::MoveAction);  //  设置拖动属性
        event->accept();         //持续接受
    }
}


                //头文件中添加#include 
void mylistWidget::dragMoveEvent(QDragMoveEvent *e)            
{
    QListWidget* listwidget = qobject_cast(e->source());
    if(listwidget != NULL && listwidget != this)
    {
        e->setDropAction(Qt::MoveAction);
        e->accept();
    }
}

                       //头文件中添加#include 
void mylistWidget::dropEvent(QDropEvent *event)
{

    QListWidget* listwidget = qobject_cast(event->source());
    if(listwidget != NULL && listwidget != this)
    {
        QString str = event->mimeData()->text();                  
                //取得mouseMoveEvent事件中设置的mimdata中的值

        QListWidgetItem* l1 = new QListWidgetItem(str);
        this->addItem(l1);              

        this->setCurrentItem(l1);             //设置列表项焦点


        event->setDropAction(Qt::MoveAction);
        event->accept();
    }
}


 

 

你可能感兴趣的:(QT窗口中的拖动)