QT 利用两种方式实现两个list中元素的互相移动

时间:2024-04-02 18:14:23

QT 利用两种方式实现两个list中元素的互相移动

分别利用点击鼠标  和 按住鼠标直接拖动的方式来实现


1 创建界面文件   左右两个为list   中间两个为Qtoolbutton

QT 利用两种方式实现两个list中元素的互相移动

2  初始化两个list

    ui->setupUi(this);
    ui->listA->addItem("A");
    ui->listA->addItem("B");
    ui->listA->addItem("C");
    ui->listA->addItem("D");
    ui->listA->addItem("E");
    ui->listA->addItem("F");
    ui->listA->addItem("G");


    ui->listB->addItem("a");
    ui->listB->addItem("b");
    ui->listB->addItem("c");
    ui->listB->addItem("d");
    ui->listB->addItem("e");
    ui->listB->addItem("f");


3 完成按键移动元素    完成槽函数

void Widget::moveCurrentItem(ProjectListWidget *source,ProjectListWidget *target)
{
    if (source->currentItem())
    {
        QListWidgetItem *newItem = source->currentItem()->clone(); //复制该元素
        target->addItem(newItem); //添加元素
        target->setCurrentItem(newItem);
        delete source->currentItem();//删除原始元素
    }
}



void Widget::on_toolButton_toLeft_clicked()
{
     moveCurrentItem(ui->listB, ui->listA);
}

void Widget::on_toolButton_toRight_clicked()
{
     moveCurrentItem(ui->listA, ui->listB);
}


4 完成ProjectListWidget定义   以及拖拽事件捕获

void ProjectListWidget::mousePressEvent(QMouseEvent *event)
{
    if (event->button() == Qt::LeftButton)
        startPos = event->pos(); //获取当前位置
    QListWidget::mousePressEvent(event); //需要调用系统自带的处理函数  必须这样操作
}

void ProjectListWidget::mouseMoveEvent(QMouseEvent *event)
{
    if (event->buttons() & Qt::LeftButton) //鼠标一直按下左键
    {
        int distance = (event->pos() - startPos).manhattanLength(); //计算移动的距离
        if (distance >= QApplication::startDragDistance()) //startDragDistance 为默认4px
            performDrag();
    }
    QListWidget::mouseMoveEvent(event); //调用系统默认的鼠标拖动函数
}




//拖拽事件
void ProjectListWidget::dragMoveEvent(QDragMoveEvent *event)
{
     //判断事件来源
    ProjectListWidget *source =qobject_cast<ProjectListWidget *>(event->source());
    if (source && source != this)
    {
        event->setDropAction(Qt::MoveAction);
        event->accept();
    }
}

//释放事件
void ProjectListWidget::dropEvent(QDropEvent *event)
{
    ProjectListWidget *source =qobject_cast<ProjectListWidget *>(event->source());
    if (source && source != this)
    {
        addItem(event->mimeData()->text());
        event->setDropAction(Qt::MoveAction);
        event->accept();
    }
}
void ProjectListWidget::dragEnterEvent(QDragEnterEvent *event)
{
    //判断事件来源
    ProjectListWidget *source =qobject_cast<ProjectListWidget *>(event->source());

    if (source && source != this)
    {
        event->setDropAction(Qt::MoveAction);
        event->accept();
    }
}

5 完成移动list中元素的操作

void ProjectListWidget::performDrag()
{
    QListWidgetItem *item = currentItem();
    if (item)
    {
        QMimeData *mimeData = new QMimeData;
        mimeData->setText(item->text()); //创建文本  储存数据

        QDrag *drag = new QDrag(this);
        drag->setMimeData(mimeData);
       // drag->setPixmap(QPixmap(":/images/person.png"));
        if (drag->exec(Qt::MoveAction) == Qt::MoveAction)
            delete item;
    }
}

6  运行结果

QT 利用两种方式实现两个list中元素的互相移动

QT 利用两种方式实现两个list中元素的互相移动

源码下载地址:

http://download.csdn.net/download/yunge812/10253462