#include "MGroupBox.h"
#include "MToolButton.h"
#include <QPainter>
#include <QDragEnterEvent>
#define MDELETE(p) { if (p) delete p; p = NULL; }
// 初始化
MGroupBox::MGroupBox(QWidget *parent) : QGroupBox(parent)
{
// 设置虚线框
int x = 25;
int y = 35;
int size = 30;
int offset1 = 10;
int offset2 = 20;
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
box[4 * i + j] = QRect(x, y, size, size);
plygon[4 * i + j] = QRect(x - offset1, y - offset1, size + offset2, size + offset2);
x += 60;
}
x = 25;
y += 47;
}
// 接收拖拽事件
setAcceptDrops(true);
}
// 释放内存
MGroupBox::~MGroupBox()
{
deleteAll();
}
// 获取要放置的按钮的ID
// point 鼠标的位置
int MGroupBox::boxID(QPoint point)
{
int boxID = -1;
for (int i = 0; i < COUNT; i++)
{
if (plygon[i].contains(point))
{
boxID = i;
break;
}
}
return boxID;
}
// 判断有没有重复添加按钮
// id 按钮的ID
// button 返回已存在的按钮
MToolButton *MGroupBox::find(int id)
{
int count = listButton.count();
for (int i = 0; i < count; i++)
{
if (listButton[i]->buttonID() == id)
return listButton[i];
}
return NULL;
}
// 添加新按钮
// button 需要clone的按钮
// boxID 放置的位置
void MGroupBox::addButton(MToolButton *button, int boxID)
{
MToolButton* pButton = button->clone();
pButton->setBoxID(boxID);
pButton->setParent(this);
pButton->setAcceptDrops(true); // 可拖拉
// 移动到指定位置
moveButtonToBox(pButton);
// 把新建的按钮添加到列表
listButton << pButton;
}
// 按钮的BOX位置交换(只能是和空的位置交换)
// id Box框新的ID
void MGroupBox::swapButton(MToolButton *&button, int id)
{
// 如果本已存在的按钮,再次从左边拖动到右边的MyGroupBox中,
// 如果拖动到的位置上已存在有按钮,则丢弃这次操作
// 如果拖动到的位置上没有按钮,则把原本已经存在的按钮换一个位置
// 先判断iID这个位置是否为空
int count = listButton.count();
for (int i = 0; i < count; i++)
{
if (listButton[i]->boxID() == id) return;
}
// 把pButton移动到iID位置
button->setBoxID(id);
moveButtonToBox(button);
}
// 按钮和按钮交换(只能是两两按钮位置交换)响应
void MGroupBox::swapButton(MToolButton* pSrc, MToolButton* pDst)
{
// 两个按钮相互交换位置
int id1 = pSrc->boxID();
int id2 = pDst->boxID();
pSrc->setBoxID(id2);
pDst->setBoxID(id1);
moveButtonToBox(pSrc);
moveButtonToBox(pDst);
}
// 拖放到QGroupBox的时候放到各个Box
// pButton 要移动的ToolButton
// iID Box位置
// ptOffset 设置按钮的便宜值
void MGroupBox::moveButtonToBox(QToolButton *&button, int id, QPointF offset)
{
QPointF pt = box[id].topLeft() + offset;
button->move(pt.x(), pt.y());
button->show();
}
// 拖放到MyGroupBox的时候放到各个Box
// pButton 要移动的ToolButton
// ptOffset 设置按钮的便宜值
void MGroupBox::moveButtonToBox(MToolButton *&button, QPointF offset)
{
int iID = button->boxID();
QPointF pt = box[iID].topLeft() + offset;
button->move(pt.x(), pt.y());
button->show();
}
// 删除所有按钮
void MGroupBox::deleteAll()
{
for (int i = listButton.count() - 1; i >= 0; i--)
{
MToolButton *pButton = listButton.at(i);
MDELETE(pButton);
listButton.removeAt(i);
}
for (int i = listClear.count() - 1; i >= 0; i--)
{
MToolButton *pButton = listClear.at(i);
MDELETE(pButton);
listClear.removeAt(i);
}
}
// 删除指定按钮
void MGroupBox::remove(MToolButton *button)
{
for (int i = listButton.count() - 1; i >= 0; i--)
{
if (button == listButton.at(i))
{
// 先不要删除,窗口关闭时一起删除,否则会程序崩溃
listClear << button;
listButton.removeAt(i);
break;
}
}
}
// 拖拽按钮刚开始进入到QGroupBox的时候 设置允许通行
void MGroupBox::paintEvent(QPaintEvent *event)
{
QGroupBox::paintEvent(event);
//绘制虚框
QPainter painter(this);
painter.setPen(QPen(QColor(192, 192, 192, 255), 1, Qt::DashLine));
for (int i = 0; i < COUNT; i++)
{
painter.drawRect(box[i]);
// painter.drawRect(plygon[i]);
}
}
// 设置允许拖放
void MGroupBox::dragEnterEvent(QDragEnterEvent *event)
{
event->acceptProposedAction();
}
// 拖拽按钮到QGroupBox的时候发送新建通知
void MGroupBox::dropEvent(QDropEvent *event)
{
// 获取按钮要放置的位置
int id = boxID(event->pos());
if (id == -1) return;
// 判断当前拖动的ToolButton存在吗
MToolButton* pSrc = qobject_cast<MToolButton*>(event->source());
// 判断当前新拖动的按钮是否已存在,如果存在则换位置
MToolButton* pDest = find(pSrc->buttonID());
if (pDest)
{
swapButton(pDest, id);
}
// 如果是新的按钮,则clone一个新的移动到MGroupBox指定位置
else
{
addButton(pSrc, id);
}
QGroupBox::dropEvent(event);
}
- 1
- 2
- 3
前往页