[Qt-interest] How can I drag a QPushButton?

Kermit Mei kermit.mei at gmail.com
Thu Jul 9 10:50:45 CEST 2009


Hello community!
I wrote my DragWidget as the following, and I want to drag some
QPushButton objects whose father is DragWidget.

But, when I pressed mouse on the QPushButton objects, the
DragWidget::mousePressEvent(...) never call.
If the objects in Dragwidget is QLabel, then everything goes well.

I don't know what cause it, and how to solve it?

Thanks.

Kermit 


ATTACH THE CODE OF DragWidget.cpp

#include <QtGui>

#include "dragwidget.h"

DragWidget::DragWidget(QWidget *parent)
    : QFrame(parent)
{
    setMinimumSize(200, 200);
    setFrameStyle(QFrame::Sunken | QFrame::StyledPanel);
    setAcceptDrops(true);

    QPushButton *boatIcon = new QPushButton(this);
    boatIcon->setIcon(QPixmap(":/images/boat.png"));
    boatIcon->move(20, 20);
    boatIcon->show();
    boatIcon->setAttribute(Qt::WA_DeleteOnClose);

    QPushButton *carIcon = new QPushButton(this);
    carIcon->setIcon(QPixmap(":/images/car.png"));
    carIcon->move(120, 20);
    carIcon->show();
    carIcon->setAttribute(Qt::WA_DeleteOnClose);

    QPushButton *houseIcon = new QPushButton(this);
    houseIcon->setIcon(QPixmap(":/images/house.png"));
    houseIcon->move(20, 120);
    houseIcon->show();
    houseIcon->setAttribute(Qt::WA_DeleteOnClose);
}

void DragWidget::dragEnterEvent(QDragEnterEvent *event)
{
    if (event->mimeData()->hasFormat("application/x-dnditemdata")) {
      qDebug("         dragEnterEvent() called!");
        if (event->source() == this) {
            event->setDropAction(Qt::MoveAction);
            event->accept();
        } else {
            event->acceptProposedAction();
        }
    } else {
        event->ignore();
    }
}

void DragWidget::dragMoveEvent(QDragMoveEvent *event)
{
    if (event->mimeData()->hasFormat("application/x-dnditemdata")) {
      qDebug("                   dragMoveEvent() called!");
      if (event->source() == this) {
	event->setDropAction(Qt::MoveAction);
	event->accept();
      } else {
	event->acceptProposedAction();
      }
    } else {
      event->ignore();
    }
}

void DragWidget::dropEvent(QDropEvent *event)
{
    if (event->mimeData()->hasFormat("application/x-dnditemdata")) {
      qDebug("dropEvent() called!");
      QByteArray itemData =
event->mimeData()->data("application/x-dnditemdata");
      QDataStream dataStream(&itemData, QIODevice::ReadOnly);
      
      QPixmap pixmap;
      QPoint offset;
      dataStream >> pixmap >> offset;
      
      QPushButton *newIcon = new QPushButton(this);
      newIcon->setIcon(pixmap);
      newIcon->move(event->pos() - offset);
      newIcon->show();
      newIcon->setAttribute(Qt::WA_DeleteOnClose);

      if (event->source() == this) {
	event->setDropAction(Qt::MoveAction);
	event->accept();
      } else {
	event->acceptProposedAction();
      }
    } else {
      event->ignore();
    }
}

void DragWidget::mousePressEvent(QMouseEvent *event)
{
  qDebug("\n\n\n*****mousePressEvent*** in *****");

  QPushButton *child = static_cast<QPushButton*>(childAt(event->pos()));
  if (!child)
    return;
  qDebug("Here!");
  QPixmap pixmap = QPixmap::grabWidget(child);
  
  QByteArray itemData;
  QDataStream dataStream(&itemData, QIODevice::WriteOnly);
  dataStream << pixmap << QPoint(event->pos() - child->pos());
  
  QMimeData *mimeData = new QMimeData;
  mimeData->setData("application/x-dnditemdata", itemData);
        
  QDrag *drag = new QDrag(this);
  drag->setMimeData(mimeData);
  drag->setPixmap(pixmap);
  drag->setHotSpot(event->pos() - child->pos());
  

  QPixmap tempPixmap = pixmap;
  QPainter painter;
  painter.begin(&tempPixmap);
  painter.fillRect(pixmap.rect(), QColor(127, 127, 127, 127));
  
  painter.end();

  child->setIcon(tempPixmap);

  if (drag->exec(Qt::CopyAction | Qt::MoveAction, Qt::CopyAction) ==
Qt::MoveAction) {
    qDebug("close()");
    child->close();
  }
  else {
    qDebug("show()");
    child->show();
    child->setIcon(pixmap);
  }
  qDebug("*****mousePressEvent*** out *****");
}





More information about the Qt-interest-old mailing list