QT 利用两种方式实现两个list中元素的互相移动
分别利用点击鼠标 和 按住鼠标直接拖动的方式来实现
1 创建界面文件 左右两个为list 中间两个为Qtoolbutton
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 运行结果
源码下载地址:
http://download.csdn.net/download/yunge812/10253462