#include "stdafx.h"
#include <QtGui/QDropEvent>
#include <QtGui/QMouseEvent>
#include <QtGui/QDragMoveEvent>
#include <QtGui/QDragEnterEvent>
#include <QtGui/QContextMenuEvent>
#include <QtWidgets/QStyle>
#include <QtWidgets/QHBoxLayout>
#include "DragList.h"
QVariant MimeData::retrieveData(const QString & format, QVariant::Type preferredType) const
{
return QMimeData::retrieveData(format, preferredType);
}
ListItem::ListItem(QWidget * parent /*= nullptr*/)
: QWidget(parent)
{
setObjectName(QStringLiteral("ItemWidgetBg"));
m_MainWidgetBg = new QWidget(this);
QVBoxLayout * mainLayout = new QVBoxLayout;
m_Name = new QLabel;
m_Count = new QLabel;
// m_MainWidgetBg->setObjectName(QStringLiteral("ItemWidgetBg"));
mainLayout->setContentsMargins(0, 0, 0, 0);
mainLayout->setSpacing(0);
mainLayout->addWidget(m_Name);
mainLayout->addWidget(m_Count);
m_MainWidgetBg->setLayout(mainLayout);
QHBoxLayout * fwLayout = new QHBoxLayout;
fwLayout->setContentsMargins(0, 0, 0, 0);
fwLayout->setSpacing(0);
fwLayout->addWidget(m_MainWidgetBg);
setLayout(fwLayout);
// setStyleSheet("QWidget{background:transparent;}"
// "QWidget[insertPos=1]{border:0;border-bottom:1 solid red;}");
}
ListItem::~ListItem()
{
}
void ListItem::SetData(const ItemData & data)
{
m_Data = data;
m_Name->setText(m_Data.name);
m_Count->setText(QString::number(m_Data.percent));
}
ItemData ListItem::GetData() const
{
return m_Data;
}
void ListItem::paintEvent(QPaintEvent * event)
{
if (m_bInsertPos)
{
QPainter painter(this);
painter.setPen(QPen(Qt::green, 1));
QLine line(rect().bottomLeft(), rect().bottomRight());
painter.drawLine(line);
}
// QWidget::paintEvent(event);
}
DragList::DragList(QWidget * parent)
: QListWidget(parent)
{
setAcceptDrops(true);//设置QListWidget的Item项可以被拖拽
setFocusPolicy(Qt::NoFocus);
ItemData data;
data.name = "test1";
data.percent = 1;
AddItem(data);
data.name = "test2";
data.percent = 2;
AddItem(data);
data.name = "test3";
data.percent = 3;
AddItem(data);
data.name = "test4";
data.percent = 4;
AddItem(data);
data.name = "test5";
data.percent = 5;
AddItem(data);
data.name = "test6";
data.percent = 6;
AddItem(data);
data.name = "test7";
data.percent = 7;
AddItem(data);
data.name = "test8";
data.percent = 8;
setCurrentItem(AddItem(data));
//setStyleSheet(QString("QListView::item{height:40px;}"
// "QListView::item{height:40px;border:0;border-bottom:1 solid red;}"
// "QListView::item:alternate {background: #EEEEEE;}"
// "QListView::item:selected{border: 1px solid #6a6ea9;}"
// "QListView::item:selected:!active{background: qlineargradient(x1 : 0, y1 : 0, x2 : 0, y2 : 1,stop : 0 #ABAFE5, stop: 1 #8588B2); }"
// "QListView::item:selected:active{background: qlineargradient(x1 : 0, y1:0, x2:0, y2:1,stop : 0 #6a6ea9, stop: 1 #888dd9);}"
// "QListView::item:hover {background: qlineargradient(x1 : 0, y1 : 0, x2 : 0, y2 : 1, stop : 0 #FAFBFE, stop: 1 #DCDEF1);}"));
setStyleSheet(QString("QListView::item{height:40px;}"
"QListView::item:alternate {background: #EEEEEE;}"
"QListView::item:selected:!active{background:blue; }"
"QListView::item:selected:active{background:red;}"
"QListView::item:hover {background:gray;}"
"QWidget#ItemWidgetBg{background:blue;}"
));
}
DragList::~DragList()
{
}
QListWidgetItem * DragList::AddItem(const ItemData & data)
{
ListItem * itemWidget = new ListItem;
itemWidget->SetData(data);
QListWidgetItem * item = new QListWidgetItem;
addItem(item);
setItemWidget(item, itemWidget);
return item;
}
void DragList::mousePressEvent(QMouseEvent * event)
{
if (event->button() == Qt::LeftButton)
{
m_LeftPress = true;
startPos = event->pos();
dragItem = itemAt(event->pos());
}
QListWidget::mousePressEvent(event);
}
void DragList::mouseMoveEvent(QMouseEvent * event)
{
QListWidgetItem * item = itemAt(event->pos());
if (dragItem == nullptr)
{
dragItem = itemAt(event->pos());
}
if (m_ShotPicture == nullptr)
{
InitShotLabel();
}
if (m_ShotLine == nullptr)
{
InitShotLine();
}
QRect rect = visualItemRect(dragItem);
if (ListItem * hoverWidget = ItemWidget(item))
{
QRect hoverRect = visualItemRect(item);
QPoint pos = hoverWidget->mapFromParent(event->pos());
if (hoverRect.size().height() / 2 < pos.y())
{
m_ShotLine->move(mapToGlobal(QPoint(2, hoverRect.y() + hoverRect.height() + 1)));
}
else
{
m_ShotLine->move(mapToGlobal(QPoint(2, hoverRect.y() + 1)));
}
m_ShotLine->setVisible(hoverRect.contains(event->pos()));
}
if (ListItem * newWidget = ItemWidget(dragItem))
{
m_ShotPicture->move(mapToGlobal(event->pos() - newWidget->mapFromParent(startPos)));
if (rect.contains(event->pos()) || event->pos().isNull())
{
setCursor(Qt::ForbiddenCursor);
}
else
{
setCursor(Qt::ArrowCursor);
}
if (m_ShotPicture->isHidden())
{
m_ShotPicture->show();
}
}
// QListWidget::mouseMoveEvent(event);
}
void DragList::mouseReleaseEvent(QMouseEvent * event)
{
if (event->button() == Qt::LeftButton)
{
m_LeftPress = false;
if (m_ShotPicture)
{
m_ShotPicture->close();
m_ShotPicture->deleteLater();
m_ShotPicture = nullptr;
}
if (m_ShotLine)
{
m_ShotLine->close();
m_ShotLine->deleteLater();
m_ShotLine = nullptr;
}
MouseRelease(event);
}
setCursor(Qt::ArrowCursor);
QListWidget::mouseReleaseEvent(event);
}
void DragList::dragEnterEvent(QDragEnterEvent * event)
{
DragList * source = (DragList *)((void *)(event->source()));
if (source && source == this)
{
if (m_ShotPicture)
{
m_ShotPicture->show();
}
event->accept();
}
}
void DragList::dragLeaveEvent(QDragLeaveEvent *event)
{
if (m_ShotPicture)
{
m_ShotPicture->hide();
}
}
void DragList::dragMoveEvent(QDragMoveEvent * event)
{
DragList * source = (DragList *)((void *)(event->source()));
if (source && source == this)
{
QListWidgetItem * item = itemAt(event->pos());
if (dragItem != nullptr && item != nullptr && m_Drag != nullptr)
{
if ((dragItem == item) != m_IsSelf)
{
m_IsSelf = dragItem == item;
if (m_IsSelf)
{
event->setDropAction(Qt::LinkAction);
}
else
{
event->setDropAction(Qt::MoveAction);
}
}
}
if (m_ShotPicture == nullptr)
{
InitShotLabel();
}
if (ListItem * newWidget = ItemWidget(dragItem))
{
m_ShotPicture->move(mapToGlobal(event->pos() - newWidget->mapFromParent(startPos)));
}
event->accept();
}
}
void DragList::dropEvent(QDropEvent * event)
{
DragList * source = (DragList *)((void *)(event->source()));
if (source && source == this)
{
endPos = event->pos();//得到鼠标移动到的坐标
QListWidgetItem * item = itemAt(endPos); //通过endPos获取鼠标位置所在的行
if (item == dragItem)
{
event->setDropAction(Qt::LinkAction);
}
else
{
int insertPos = row(item);
if (ListItem * oldWidget = ItemWidget(item))
{
QPoint pos = oldWidget->mapFromParent(endPos);
if (oldWidget->size().height() / 2 < pos.y())
{
insertPos += 1;
}
}
// if (const MimeData * mimeData = dynamic_cast<const MimeData *>(event->mimeData()))
{
if (dragItem)
{
if (ListItem * oldWidget = ItemWidget(dragItem))
{
// QListWidgetItem * newItem = new QListWidgetItem;
// ListItem * itemWidget = new ListItem;
// itemWidget->SetData(oldWidget->GetData());
//
// insertItem(insertPos, newItem);
// setItemWidget(newItem, itemWidget);
//
// setCurrentItem(newItem);
// oldWidget->deleteLater();
}
// dragItem = takeItem(row(dragItem));
// if (dragItem)
// {
// delete dra
Qt之QAbstractItemView视图项拖拽2
5星 · 超过95%的资源 需积分: 50 13 浏览量
2016-11-09
20:29:00
上传
评论 2
收藏 53KB ZIP 举报
一窝蜂117
- 粉丝: 472
- 资源: 43
最新资源
- 人工智能ai相关教学课程快
- Suno的冲击-AI音乐来了-学习备用.pdf
- KIMI大模型浏览器插件
- b61fa64a08a02de0e0d49d53bb84c444.amr
- 分布式系统中Java后端开发技术及其应用实践.pdf
- 5ffd9193f6aec31bbf16030a46680dc7.avi
- DA14531-蓝牙传感器连接传输数据固件
- 极限存在准则与两个重要极限
- logisim实验MIPS运算器(ALU)设计(内含4位先行进位74182、四位快速加法器、32位快速加法器)-Educoder_logisim里面连线,实现4位先行进位74182和4位快速加法器-C
- 高等数学第一章第二节数列的极限
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈