#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)
{
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: 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);}"
));
}
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)
{
startPos = event->pos();
dragItem = itemAt(event->pos());
}
QListWidget::mousePressEvent(event);
}
void DragList::mouseMoveEvent(QMouseEvent * event)
{
QListWidgetItem * item = itemAt(event->pos());
if (dragItem == nullptr)
{
return;
}
m_Drag = new QDrag(this);
ListItem * itemWidget = nullptr;
if (itemWidget = ItemWidget(dragItem))
{
MimeData * mimeData = new MimeData(itemWidget->GetData());
m_Drag->setMimeData(mimeData);
}
m_Drag->setDragCursor(style()->standardPixmap(QStyle::SP_TitleBarMinButton), Qt::LinkAction);
m_Drag->setDragCursor(style()->standardPixmap(QStyle::SP_TitleBarMaxButton), Qt::MoveAction);
m_Drag->setHotSpot(QPoint(0, -m_Drag->pixmap().height() * 2));
Qt::DropAction dropAction = m_Drag->exec(Qt::MoveAction | Qt::LinkAction, Qt::LinkAction);
if (dropAction == Qt::MoveAction)
{
if (itemWidget)
{
itemWidget->deleteLater();
}
delete dragItem;
}
QListWidget::mouseMoveEvent(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)
{
if (m_ShotPicture)
{
m_ShotPicture->close();
m_ShotPicture->deleteLater();
m_ShotPicture = nullptr;
}
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()))
{
QListWidgetItem * newItem = new QListWidgetItem;
ListItem * itemWidget = new ListItem;
ItemData data = mimeData->GetData();
itemWidget->SetData(data);
insertItem(insertPos, newItem);
setItemWidget(newItem, itemWidget);
setCurrentItem(newItem);
}
event->setDropAction(Qt::MoveAction);
}
m_IsSelf = false;
event->accept();
}
}
void DragList::contextMenuEvent(QContextMenuEvent * event)
{
if (m_ContextMenu == nullptr)
{
m_ContextMenu = new QMenu;
QAction * delAct = m_ContextMenu->addAction(QIcon(), QStringLiteral("删除自选股"));
QAction * topAct = m_ContextMenu->addAction(QIcon(), QStringLiteral("置顶"));
QAction * bottomAct = m_ContextMenu->addAction(QIcon(), QStringLiteral("置低"));
QAction * upAct = m_ContextMenu->addAction(QIcon(), QStringLiteral("上移一位"));
QAction * downAct = m_ContextMenu->addAction(QIcon(), QStringLiteral("下移一位"));
connect(delAct, &QAction::triggered, this, &DragList::DeleteSotck);
connect(topAct, &QAction::triggered, this, &DragList::TopSotck);
connect(bottomAct, &QA