void ConfigWidget::mousePressEvent(QMouseEvent *event)
{
QByteArray itemData;
QDataStream dataStream(&itemData, QIODevice::WriteOnly);
dataStream << m_pixmap << QPoint(217, 102) << m_pixName << m_url << m_Uuid << m_action;
QMimeData *mimeData = new QMimeData;
mimeData->setData(DragWidget::puzzleMimeType(), itemData);
QDrag *drag = new QDrag(this);
drag->setMimeData(mimeData);
int iW1 = m_pixmap.width();
int iG1 = m_pixmap.height();
QPixmap pixmap = m_pixmap.scaled(m_positionW - 55, m_positionH - 40);
int iW = pixmap.width();
int iG = pixmap.height();
drag->setHotSpot(QPoint(pixmap.width() / 2, pixmap.height() / 2));
//m_HotsPos = QPoint(pixmap.width() / 2, pixmap.height() / 2) - m_pTile->pos();
drag->setPixmap(pixmap);
if (!(drag->exec(Qt::MoveAction) == Qt::MoveAction)) {
m_pTile->show();
QApplication::processEvents();
}
}
void ConfigWidget::dropEvent(QDropEvent *event)
{
clock_t startALL, finish;
double totaltimeALL;
startALL = clock();
if (event->mimeData()->hasFormat(DragWidget::puzzleMimeType()))
{
QByteArray pieceData = event->mimeData()->data(DragWidget::puzzleMimeType());
QDataStream dataStream(&pieceData, QIODevice::ReadOnly);
QPoint point = event->pos();
//QRect square = targetSquare(event->pos());
QPixmap pixmap;
QPoint location;
QString pieName;
QString strImageUrl;
QString uid;
QString netModel;
QString action;
dataStream >> pixmap >> location >> pieName >> strImageUrl >> uid >> netModel >> action;
if (pieName == QString::fromLocal8Bit("场景"))
......
......
}
void ConfigWidget::dragMoveEvent(QDragMoveEvent *event)
{
//QRect updateRect = highlightedRect.united(targetSquare(event->pos()));
if (event->mimeData()->hasFormat(DragWidget::puzzleMimeType()))
{
QByteArray pieceData = event->mimeData()->data(DragWidget::puzzleMimeType());
QDataStream dataStream(&pieceData, QIODevice::ReadOnly);
QPoint point = event->pos();
//QRect square = targetSquare(event->pos());
QPixmap pixmap;
QPoint location;
QString pieName;
QString strImageUrl;
QString uid;
QString netModel;
dataStream >> pixmap >> location >> pieName >> strImageUrl >> uid >> netModel;
if (pieName == QString::fromLocal8Bit("场景"))
{
event->accept();
highlightedRect = QRect();
update();
}
else if (pieName == QString::fromLocal8Bit("选项卡"))
{
event->accept();
highlightedRect = QRect();
update();
}
//功能
else
{
if (event->source() == this)
{
if (m_strLayout == QString::fromLocal8Bit("自动布局"))
{
if (event->mimeData()->hasFormat(DragWidget::puzzleMimeType())
&& pieceRects.indexOf(targetSquare(event->pos())) == -1) {
highlightedRect = targetSquare(event->pos());
event->accept();
}
else {
highlightedRect = QRect();
event->ignore();
}
}
else
{
if (event->mimeData()->hasFormat(DragWidget::puzzleMimeType()))
{
event->accept();
}
else {
highlightedRect = QRect();
event->ignore();
}
}
}
else
{
if (m_strLayout == QString::fromLocal8Bit("自动布局"))
{
if (event->mimeData()->hasFormat(DragWidget::puzzleMimeType()))
{
highlightedRect = targetSquare(event->pos());
event->setDropAction(Qt::MoveAction);
event->accept();
}
else {
highlightedRect = QRect();
event->ignore();
}
}
else
{
if (event->mimeData()->hasFormat(DragWidget::puzzleMimeType()))
{
event->accept();
}
else {
highlightedRect = QRect();
event->ignore();
}
}
}
update();
}
}
}
void ConfigWidget::dragEnterEvent(QDragEnterEvent *event)
{
if (event->mimeData()->hasFormat(DragWidget::puzzleMimeType()))
{
event->accept();
}
else
event->ignore();
}
void ConfigWidget::dragLeaveEvent(QDragLeaveEvent *event)
{
}
使用事件过滤器
ui.listWidget->viewport()->installEventFilter(this);
//每一个itemWidget也要installEventFilter(this);
bool DragWidget::eventFilter(QObject *watched, QEvent *event)
{
if (event->type() == QEvent::MouseButtonPress && watched == ui.listWidget->viewport())
{
moussEvent(event);
}
else if (event->type() == QEvent::MouseButtonPress && watched != ui.listWidget->viewport())
{
QListWidgetItem *item = NULL;
for (int i = 0; i < ui.listWidget->count(); i++)
{
Tile * pTile = static_cast<Tile*>(watched);
QWidget * pWidget = ui.listWidget->itemWidget(ui.listWidget->item(i));
Tile * pTileW = static_cast<Tile*>(pWidget);
if (pTileW == pTile)
{
item = ui.listWidget->item(i);
}
}
if (item == NULL)
{
return false;
}
QByteArray itemData;
QDataStream dataStream(&itemData, QIODevice::WriteOnly);
QPixmap pixmap = qvariant_cast<QPixmap>(item->data(Qt::UserRole));
QPoint location = item->data(Qt::UserRole + 1).toPoint();
QString strName = item->data(Qt::UserRole + 2).toString();
QString strImageUrl = item->data(Qt::UserRole + 3).toString();
dataStream << pixmap << location << strName << strImageUrl;
m_mimeData = new QMimeData;
m_mimeData->setData(DragWidget::puzzleMimeType(), itemData);
m_mimeData->setText(strName);
m_drag = new QDrag(this);
m_drag->setMimeData(m_mimeData);
QPixmap pixmapD = pixmap.scaled(160, 160);
m_drag->setHotSpot(QPoint(pixmapD.width() / 2, pixmapD.height() / 2));
m_drag->setPixmap(pixmapD);
m_drag->setDragCursor(style()->standardPixmap(QStyle::SP_TitleBarMinButton), Qt::LinkAction);
m_drag->setDragCursor(style()->standardPixmap(QStyle::SP_TitleBarMaxButton), Qt::MoveAction);
m_drag->exec(Qt::MoveAction);
}
return QWidget::eventFilter(watched, event); //将事件传递给父类
}
void DragWidget::moussEvent(QEvent *event)
{
QMouseEvent *mEvent = static_cast<QMouseEvent *>(event);
QMenu *menu = new QMenu(this);
QAction *pAction = new QAction(menu);
pAction->setText(QString::fromLocal8Bit("设置启动项"));
menu->addAction(pAction);
bool bRet = connect(pAction, SIGNAL(triggered()), this, SLOT(slotConfigStart()));
menu->exec(mEvent->globalPos());
}