QT 利用两种方式实现两个list中元素的互相移动
2018-02-20 11:02
936 查看
QT 利用两种方式实现两个list中元素的互相移动
分别利用点击鼠标 和 按住鼠标直接拖动的方式来实现
1 创建界面文件 左右两个为list 中间两个为Qtoolbutton
2 初始化两个list
ui->setupUi(this);
3 完成按键移动元素 完成槽函数
void Widget::moveCurrentItem(ProjectListWidget *source,ProjectListWidget *target)
4 完成ProjectListWidget定义 以及拖拽事件捕获
void ProjectListWidget::mousePressEvent(QMouseEvent *event)
void ProjectListWidget::performDrag()
6 运行结果
源码下载地址:
http://download.csdn.net/download/yunge812/10253462
分别利用点击鼠标 和 按住鼠标直接拖动的方式来实现
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
相关文章推荐
- 用js实现两个select下拉框之间的元素互相移动
- 用js实现两个select下拉框之间的元素互相移动
- 用js实现两个select下拉框之间的元素互相移动
- FORM开发两种方式实现动态LIST
- 循环删除List中的元素的问题-两种方式(不一样的结果)
- TreeSet对元素进行排序实现的两种方式
- python基础===两个list之间移动元素
- JavaScript DOM 利用样式实现元素移动位置
- 详解多线程的两种实现方式以及4个线程,两个线程对j加1,两个线程对j减1完整代码。
- JavaScript DOM 利用样式实现元素移动位置
- Adobe AIR移动App的互相调用实现方式
- 利用CSS让元素垂直居中的两种实现方法
- 利用Ajax实现的广告流动条的两种方式
- 利用两种不同的NAT配置实现两个接口的双向静态NAT测试
- Unity实现绘制线断一 ――――利用LineRenderer组件划线的两种方式
- JQuery中两个ul标签的li互相移动实现方法
- JavaScript DOM 利用样式实现元素移动位置
- 利用Selenium实现图片文件上传的两种方式介绍
- List ADT的两种实现方式