Qt实现拖拽数据的功能
来源:互联网 发布:淘宝3c快熟认证 编辑:程序博客网 时间:2024/05/20 22:29
今天在进行Qt编程的时候,学习了一下如何自定义ui的样式,有时候,你在修改别人程序的时候,可能会发现别人程序中的某个控件ui设计是直接拖上去的。这种情况下如果你想增加该控件的事件处理,比如拖拽功能。不太好办,今天在书上找到一个方法,就是使用Qt设计师里面的提升,将需要增加事件响应的那个控件提升到一个类里面,然后自己实现里面相关的事件响应函数,今天我成功实现了一个QTreeWidget的提升,然后把里面的数据实现了拖拽功能,代码如下:
#ifndef NEW_QTREEWIDGET_H#define NEW_QTREEWIDGET_H#include <QTreeWidget>#include <QDragEnterEvent>class new_QTreeWidget:public QTreeWidget{ Q_OBJECTpublic: new_QTreeWidget(QWidget *parent = 0);protected: void dragEnterEvent(QDragEnterEvent *e); void dragMoveEvent(QDragMoveEvent *e); void dropEvent(QDropEvent *e); void mousePressEvent(QMouseEvent *e); void mouseMoveEvent(QMouseEvent *e);private: QPoint _startPos; void performDrag();};#endif // NEW_QTREEWIDGET_H#include "new_qtreewidget.h"#include <QMimeData>#include <QDragEnterEvent>#include <QDragMoveEvent>#include <QDropEvent>#include <QMouseEvent>#include <QApplication>#include <QDrag>#include <QDebug>new_QTreeWidget::new_QTreeWidget(QWidget *parent):QTreeWidget(parent){ setAcceptDrops(true);}void new_QTreeWidget::dragEnterEvent(QDragEnterEvent *e){ new_QTreeWidget *source = qobject_cast<new_QTreeWidget *>(e->source()); if(source) { e->setDropAction(Qt::MoveAction); e->accept(); }}void new_QTreeWidget::dragMoveEvent(QDragMoveEvent *e){ new_QTreeWidget *source = qobject_cast<new_QTreeWidget *>(e->source()); if(source) { e->setDropAction(Qt::MoveAction); e->accept(); }}void new_QTreeWidget::dropEvent(QDropEvent *e){ new_QTreeWidget *source = qobject_cast<new_QTreeWidget *>(e->source()); if(source) { new_QTreeWidget *source = qobject_cast<new_QTreeWidget *>(e->source()); if(source) { QTreeWidgetItem *item = this->itemAt(e->pos()); //当前位置的item if( item == nullptr) //如果放下的位置没有item,则退出,没有这句话死机! return; if( -1 == this->indexOfTopLevelItem(item) && (-1 == this->indexOfTopLevelItem(currentItem())) || -1 != this->indexOfTopLevelItem(item) && (-1 != this->indexOfTopLevelItem(currentItem())) ) //如果“放下位置的item是顶层item,且原来的是顶层”或者“放下的不是顶层,且原来也不是顶层” { qDebug()<<"放下的文本是:"<<e->mimeData()->text(); item->setText(currentColumn(),e->mimeData()->text()); e->setDropAction(Qt::MoveAction); e->accept(); } } }}void new_QTreeWidget::mousePressEvent(QMouseEvent *e){ if(e->button() == Qt::LeftButton) { _startPos = e->pos(); } QTreeWidget::mousePressEvent(e);}void new_QTreeWidget::mouseMoveEvent(QMouseEvent *e){ if(e->buttons() & Qt::LeftButton) { int distance = (e->pos() - _startPos).manhattanLength(); if(distance >= QApplication::startDragDistance()) //当拖动距离大于一个推荐抖动距离时,表示同意已经拖动操作了 performDrag(); } QTreeWidget::mouseMoveEvent(e);}void new_QTreeWidget::performDrag(){ QTreeWidgetItem *item = currentItem(); int column = currentColumn(); if(item) //必须是非顶层item才可以移动数据// if(item) { QMimeData *mineData = new QMimeData; if(column != 4) //只有第四列才可以移动数据 return; mineData->setText(item->text(column)); qDebug()<<item->text(column); QDrag *drag = new QDrag(this); drag->setMimeData(mineData); drag->exec(Qt::MoveAction); }}
这样就解决了当界面已经设置好后如何添加功能的难题!
0 0
- Qt实现拖拽数据的功能
- Qt实现窗口整体拖拽功能.
- QT计算器功能的实现
- QT拖拽功能
- QT实现拖拽TabWidget选项卡形成单独的窗口,双击标题栏可还原的功能【dock功能】
- 在Qt 中实现Sleep的功能
- 对Qt插件功能实现的理解
- Qt中截图功能的实现
- Qt中截图功能的实现
- QT实现类似QQ的截图功能
- Qt中截图功能的实现
- QT 实现拖放功能
- Qt实现监听功能
- Qt 实现登录功能
- qt实现录音功能
- QT拖拽功能简介
- QT拖拽功能简介
- QT拖拽功能简介
- 关于伪类与伪元素及其前面的冒号和两个冒号的使用
- 判断多选框的值是否在指定范围内/判断多选框的值是否包含在另一组值中
- my_string-part1
- kmp算法实现
- android多媒体框架学习 详解 最新版本
- Qt实现拖拽数据的功能
- android系统资源预加载和缓存原理分析
- 10 GridView 样式属性
- Spring-6 使用外部属性文件
- UGUI内核大探究(十四)Text
- java设计模式之建造者模式
- 函数返回值的几种情况
- nw-init
- Mybatis接口编程原理分析(一)