我必须制作一些类似iOS界面的东西,3x3个图标字段,可以拖动它们来更改它们的位置,然后在XML文件中记住它。
我决定使用Grid类(QWidget是父类)作为容器,并使用从QWidget继承的我自己的类作为元素。
现在我正在努力学习如何执行拖动&为QWidget拖放,但看起来你只能拖放到QWidget上,但不可能拖动它。
这不可能吗?我该如何移动这个东西?
拖动小部件并不是那么容易。大量的编码你必须自己完成。
来自Qt文档:
void MainWindow::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton
&& iconLabel->geometry().contains(event->pos())) {
QDrag *drag = new QDrag(this);
QMimeData *mimeData = new QMimeData;
mimeData->setText(commentEdit->toPlainText());
drag->setMimeData(mimeData);
drag->setPixmap(iconPixmap);
Qt::DropAction dropAction = drag->exec();
...
}
}
这意味着,当您的小部件收到要拖动的消息时,例如使用鼠标按压,它必须创建一个QDrag对象。
在QDrag对象中,您可以设置一个像素映射,它表示您拖动的小部件。如果你在这一点上隐藏了你的小部件,看起来就像你的鼠标指针"拿走"了小部件。
此外,您还需要一个QMimeData对象。在这里,您可以放置各种数据,这些数据描述了您的小部件。在您的用例中,允许您识别小部件的东西。因为,困难的部分来了:你必须自己搬家。
这个小部件是网格的父级,它接收drop事件并从mime数据中读取,小部件希望我移动它。从QDropEvent中,它获得要移动小部件的位置。这就是您必须编写的代码:网格布局中的实际重新定位。别忘了更新xml。
做一个技巧,然后你也可以拖动QWidget,
QPixmap *widgetPixmap = new QPixmap;
yourWidget->render(widgetPixmap); // rendering the current widget to t_iconTPixmap
现在使用此widgetPixmap
作为yourDragObject->setPixmap();
的像素图
例如,
void MainWindow::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton
&& iconLabel->geometry().contains(event->pos())) {
QDrag *drag = new QDrag(this);
QMimeData *mimeData = new QMimeData;
mimeData->setText(commentEdit->toPlainText());
QPixmap *widgetPixmap = new QPixmap;
yourWidget->render(widgetPixmap);
drag->setMimeData(mimeData);
drag->setPixmap(widgetPixmap);
Qt::DropAction dropAction = drag->exec();
...
}
}
Qt wiki包含一个QtQuick示例,介绍如何用不到80行的代码模拟iOS图标界面。
你可以在这里找到它。