[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