Ray
26th September 2006, 12:29
I am planning to build a tool bar like Dr.eye,when using the Qt's example D&D ,I set set the program like this:
MainWidget::MainWidget(QWidget *parent) : QLabel(parent)
{
setWindowState(this->windowState() ^ Qt::WindowFullScreen);
setFrameStyle(QFrame::Sunken | QFrame::StyledPanel);
setAcceptDrops(true);
toolbar = new ToolWidget(this);
toolbar->move(50, 50);
toolbar->show();
toolbar->setAttribute(Qt::WA_DeleteOnClose);
}
void MainWidget::dragEnterEvent(QDragEnterEvent *event)
{
if (event->mimeData()->hasFormat("MyToolBar"))
{
if (event->source() == this)
{
event->setDropAction(Qt::MoveAction);
event->accept();
} else
{
event->acceptProposedAction();
}
}
else
{
event->ignore();
}
}
void MainWidget::dragMoveEvent(QDragMoveEvent *event)
{
if (event->mimeData()->hasFormat("MyToolBar"))
{
if (children().contains(event->source()))
{
event->setDropAction(Qt::MoveAction);
event->accept();
}
else
{
event->acceptProposedAction();
}
printf("this is the test\n");
}
else
{
event->ignore();
}
}
void MainWidget::dropEvent(QDropEvent *event)
{
if (event->mimeData()->hasFormat("MyToolBar"))
{
QByteArray itemData = event->mimeData()->data("MyToolBar");
QDataStream dataStream(&itemData, QIODevice::ReadOnly);
QPixmap pixmap;
QPoint offset;
dataStream >> pixmap >> offset;
ToolWidget *Transfer = new ToolWidget(this);
Transfer->setPixmap(pixmap);
Transfer->move(event->pos() - offset);
Transfer->show();
Transfer->setAttribute(Qt::WA_DeleteOnClose);
if (event->source() == this)
{
event->setDropAction(Qt::MoveAction);
event->accept();
} else {
event->acceptProposedAction();
}
}
else
{
event->ignore();
}
}
void MainWidget::mousePressEvent(QMouseEvent *event)
{
if(Qt::LeftButton == event->button ())
{
ToolWidget *child = static_cast<ToolWidget*>(childAt(event->pos()));
if (!child)
return;
QPixmap pixmap = *child->pixmap(); //get the pixmap on the label
QByteArray itemData;
QDataStream dataStream(&itemData, QIODevice::WriteOnly);
dataStream << pixmap << QPoint(event->pos() - child->pos());
QMimeData *mimeData = new QMimeData;
mimeData->setData("MyToolBar", itemData);
child->hide();
QDrag *drag = new QDrag(this);
drag->setMimeData(mimeData);
drag->setPixmap(pixmap);
drag->setHotSpot(event->pos() - child->pos());
if (drag->start(Qt::MoveAction) == Qt::MoveAction)
child->close();
else
child->show();
}
}
this is following the example,but I create a class ToolWidget,
it contains several button's。
the question is,when i drag and move the toolbar, all of the object except toolbar'r 's icon
are invisiable
is it possible make the label visible,and how to do it??
MainWidget::MainWidget(QWidget *parent) : QLabel(parent)
{
setWindowState(this->windowState() ^ Qt::WindowFullScreen);
setFrameStyle(QFrame::Sunken | QFrame::StyledPanel);
setAcceptDrops(true);
toolbar = new ToolWidget(this);
toolbar->move(50, 50);
toolbar->show();
toolbar->setAttribute(Qt::WA_DeleteOnClose);
}
void MainWidget::dragEnterEvent(QDragEnterEvent *event)
{
if (event->mimeData()->hasFormat("MyToolBar"))
{
if (event->source() == this)
{
event->setDropAction(Qt::MoveAction);
event->accept();
} else
{
event->acceptProposedAction();
}
}
else
{
event->ignore();
}
}
void MainWidget::dragMoveEvent(QDragMoveEvent *event)
{
if (event->mimeData()->hasFormat("MyToolBar"))
{
if (children().contains(event->source()))
{
event->setDropAction(Qt::MoveAction);
event->accept();
}
else
{
event->acceptProposedAction();
}
printf("this is the test\n");
}
else
{
event->ignore();
}
}
void MainWidget::dropEvent(QDropEvent *event)
{
if (event->mimeData()->hasFormat("MyToolBar"))
{
QByteArray itemData = event->mimeData()->data("MyToolBar");
QDataStream dataStream(&itemData, QIODevice::ReadOnly);
QPixmap pixmap;
QPoint offset;
dataStream >> pixmap >> offset;
ToolWidget *Transfer = new ToolWidget(this);
Transfer->setPixmap(pixmap);
Transfer->move(event->pos() - offset);
Transfer->show();
Transfer->setAttribute(Qt::WA_DeleteOnClose);
if (event->source() == this)
{
event->setDropAction(Qt::MoveAction);
event->accept();
} else {
event->acceptProposedAction();
}
}
else
{
event->ignore();
}
}
void MainWidget::mousePressEvent(QMouseEvent *event)
{
if(Qt::LeftButton == event->button ())
{
ToolWidget *child = static_cast<ToolWidget*>(childAt(event->pos()));
if (!child)
return;
QPixmap pixmap = *child->pixmap(); //get the pixmap on the label
QByteArray itemData;
QDataStream dataStream(&itemData, QIODevice::WriteOnly);
dataStream << pixmap << QPoint(event->pos() - child->pos());
QMimeData *mimeData = new QMimeData;
mimeData->setData("MyToolBar", itemData);
child->hide();
QDrag *drag = new QDrag(this);
drag->setMimeData(mimeData);
drag->setPixmap(pixmap);
drag->setHotSpot(event->pos() - child->pos());
if (drag->start(Qt::MoveAction) == Qt::MoveAction)
child->close();
else
child->show();
}
}
this is following the example,but I create a class ToolWidget,
it contains several button's。
the question is,when i drag and move the toolbar, all of the object except toolbar'r 's icon
are invisiable
is it possible make the label visible,and how to do it??