#include "applicationlistwidget.h"
#include "ui_applicationlistwidget.h"
#include <QDebug>
ApplicationListWidget::ApplicationListWidget(QWidget *parent) :
QListWidget(parent),
ui(new Ui::ApplicationListWidget),
m_leftPress(false),
m_mouseMoved(false),
m_dragItem(nullptr),
m_shotLabel(nullptr),
m_shotLine(nullptr)
{
ui->setupUi(this);
initWidget();
}
ApplicationListWidget::~ApplicationListWidget()
{
if(m_shotLabel)
{
m_shotLabel->close();
m_shotLabel->deleteLater();
m_shotLabel = nullptr;
}
if(m_shotLine)
{
m_shotLine->close();
m_shotLine->deleteLater();
m_shotLine = nullptr;
}
delete ui;
}
void ApplicationListWidget::initWidget()
{
setViewMode(QListView::IconMode);
setResizeMode(QListView::Adjust);
setGridSize(QSize(122, 110));
setStyleSheet(
"QListWidget{border:0px;}"
"QListView::item{width:95;height:93px;}");
}
bool ApplicationListWidget::AddItem(YYXX yyxx)
{
ApplicationItem *itemWidget = new ApplicationItem;
itemWidget->setData(yyxx);
QListWidgetItem *item = new QListWidgetItem;
addItem(item);
this->setItemWidget(item, itemWidget);
return true;
}
void ApplicationListWidget::mousePressEvent(QMouseEvent *event)
{
if(event->button() == Qt::LeftButton)
{
m_leftPress = true;
m_startPos = event->pos();
m_dragItem = itemAt(event->pos());
}
//QListWidget::mousePressEvent(event);
}
void ApplicationListWidget::mouseMoveEvent(QMouseEvent *event)
{
if(m_dragItem == nullptr)
{
return ;
}
m_mouseMoved = true;
if(m_shotLabel == nullptr)
{
InitShotLabel();
}
if(m_shotLine == nullptr)
{
InitShotLine();
}
QListWidgetItem *item = itemAt(event->pos());
if(ApplicationItem *hoverWidget = ItemWidget(item))
{
m_hoverRect = visualItemRect(item);
m_shotLine->move(mapToGlobal(QPoint(m_hoverRect.x(), m_hoverRect.y() + 1)));
m_shotLine->setVisible(m_hoverRect.contains(event->pos()));
}
QRect rect = visualItemRect(m_dragItem);
if(ApplicationItem *newWidget = ItemWidget(m_dragItem))
{
m_shotLabel->move(mapToGlobal(event->pos() - newWidget->mapFromParent(m_startPos)));
if(rect.contains(event->pos()) || event->pos().isNull())
{
setCursor(Qt::ForbiddenCursor);
}
else
{
setCursor(Qt::ArrowCursor);
}
if(m_shotLabel->isHidden())
{
m_shotLabel->show();
}
}
QListWidget::mouseMoveEvent(event);
}
void ApplicationListWidget::mouseReleaseEvent(QMouseEvent *event)
{
if(event->button() == Qt::LeftButton)
{
m_leftPress = false;
if(!m_mouseMoved)
{
emit ClickedItem(ItemWidget(m_dragItem));
return;
}
m_mouseMoved = false;
MouseRelease(event);
if(m_shotLabel)
{
m_shotLabel->close();
m_shotLabel->deleteLater();
m_shotLabel = nullptr;
}
if(m_shotLine)
{
m_shotLine->close();
m_shotLine->deleteLater();
m_shotLine = nullptr;
}
}
setCursor(Qt::ArrowCursor);
QListWidget::mouseReleaseEvent(event);
}
void ApplicationListWidget::InitShotLabel()
{
m_shotLabel = new QLabel;
m_shotLabel->setWindowOpacity(0.8);
m_shotLabel->setWindowFlags(Qt::FramelessWindowHint | Qt::Tool | Qt::WindowStaysOnTopHint);
m_shotLabel->setAttribute(Qt::WA_TransparentForMouseEvents, true);
if(ApplicationItem *oldWidget = ItemWidget(m_dragItem))
{
m_shotLabel->setPixmap(oldWidget->grab());
m_shotLabel->resize(visualItemRect(m_dragItem).size());
}
m_shotLabel->show();
}
void ApplicationListWidget::InitShotLine()
{
m_shotLine = new QLabel(this);
m_shotLine->setObjectName(QStringLiteral("ShotLine"));
m_shotLine->setWindowFlags(Qt::FramelessWindowHint | Qt::Tool | Qt::WindowStaysOnTopHint);
m_shotLine->setAttribute(Qt::WA_TransparentForMouseEvents, true);
m_shotLine->setStyleSheet("QLabel#ShotLine{background:blue;}");
if(ApplicationItem *oldWidget = ItemWidget(m_dragItem))
{
m_shotLine->resize(visualItemRect(m_dragItem).size().width(), 2);
}
m_shotLine->show();
}
void ApplicationListWidget::MouseRelease(QMouseEvent *event)
{
QListWidgetItem *item = itemAt(m_hoverRect.topLeft());
if(item == nullptr || m_dragItem == nullptr || item == m_dragItem)
{
return;
}
int insertPos = row(item);
int oldPos = row(m_dragItem);
if (oldPos < insertPos)
{
insertPos += 1;
}
if(ApplicationItem *oldWidget = ItemWidget(m_dragItem))
{
ApplicationItem *widgetItem = new ApplicationItem;
widgetItem->setData(oldWidget->GetData());
QListWidgetItem *newItem = new QListWidgetItem;
this->insertItem(insertPos, newItem);
this->setItemWidget(newItem, widgetItem);
this->setCurrentItem(newItem);
oldWidget->deleteLater();
}
m_dragItem = this->takeItem(row(m_dragItem));
if(m_dragItem)
{
delete m_dragItem;
m_dragItem = nullptr;
}
}
ApplicationItem *ApplicationListWidget::ItemWidget(QListWidgetItem *item)
{
return dynamic_cast<ApplicationItem *>(this->itemWidget(item));
}
没有合适的资源?快使用搜索试试~ 我知道了~
C++Qt实现拖拽按钮插入指定位置并重新排序
共49个文件
png:11个
cpp:9个
obj:9个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
5星 · 超过95%的资源 30 下载量 48 浏览量
2022-03-15
16:37:18
上传
评论 3
收藏 1.59MB ZIP 举报
温馨提示
1.效果类似于Windows桌面应用可以通过鼠标拖拽插入指定位置,并自动排序的效果。 2.开发环境Qt Creator,版本5.5.1。 3.可以实现响应点击信号。 4.有插入位置跟踪标线标志。 5.有鼠标选中拖拽过程中的截图效果。 6.通过MousePressed、MouseMoved、MouseReleased实现。 7.目标人群:想学习使用MousePressed、MouseMoved、MouseReleased实现拖拽功能、QListWidget深入功能的学者。
资源推荐
资源详情
资源评论
收起资源包目录
DragAndSort.zip (49个子文件)
DragAndSort
ApplicationCenter
applicationlistwidget.ui 426B
applicationcenterwidget.cpp 4KB
applicationitem.ui 3KB
applicationitem.h 697B
applicationlistwidget.h 1KB
applicationcenterwidget.h 532B
applicationcenterwidget.ui 2KB
applicationlistwidget.cpp 6KB
applicationitem.cpp 1KB
main.cpp 222B
mainwindow.ui 2KB
mainwindow.cpp 236B
mainwindow.h 349B
ApplicationCenter.pro 682B
ApplicationCenter.pro.user 18KB
build-ApplicationCenter-Desktop_Qt_5_5_1_MSVC2013_32bit-Debug
ui_applicationitem.h 3KB
Makefile.Debug 80KB
ui_applicationlistwidget.h 1KB
Makefile.Release 80KB
ui_mainwindow.h 3KB
debug
moc_applicationcenterwidget.obj 160KB
moc_applicationitem.cpp 3KB
moc_mainwindow.cpp 3KB
ApplicationCenter.ilk 1.87MB
mainwindow.obj 221KB
image
11.png 13KB
10.png 13KB
5.png 9KB
9.png 9KB
1.png 7KB
6.png 6KB
2.png 6KB
7.png 6KB
4.png 10KB
8.png 9KB
3.png 14KB
moc_applicationcenterwidget.cpp 4KB
applicationitem.obj 242KB
moc_mainwindow.obj 170KB
applicationcenter.pdb 3.21MB
main.obj 168KB
moc_applicationlistwidget.cpp 5KB
moc_applicationitem.obj 138KB
applicationcenterwidget.obj 268KB
applicationlistwidget.obj 234KB
moc_applicationlistwidget.obj 192KB
ApplicationCenter.exe 137KB
Makefile 23KB
ui_applicationcenterwidget.h 2KB
release
共 49 条
- 1
黑兔子JH
- 粉丝: 18
- 资源: 6
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 2013-2022vc运行命令库
- probleme.exe
- 基于python完成对csv文件的读取并且通过flask框架显示
- 基于SpringBoot的“体质测试数据分析及可视化”的设计与实现.zip
- c语言-c语言编程基础之leetcode题解第21题合并两个有序链表.zip
- 快速开发API服务的框架
- c语言-c语言编程基础之leetcode题解第20题有效的括号.zip
- c语言-c语言编程基础之leetcode题解第19题删除链表的倒数第N个结点.zip
- c语言-c语言编程基础之leetcode题解第17题电话号码的字母组合.zip
- c语言-c语言编程基础之leetcode题解第16题最接近的三数之和.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
- 4
- 5
- 6
前往页