我必须制作类似于 iOS 界面的东西,3x3 的图标字段可以拖动以更改其位置,然后将其记住在 XML 文件中。
我决定使用 Grid 类(QWidget 是父级)作为容器,我自己的类(继承自 QWidget)作为元素。
现在我正在尝试学习如何为 QWidget 执行拖放操作,但似乎您只能拖放到 QWidget 上,但无法拖动它。
这是不可能的吗?我该如何移动这个东西?
我必须制作类似于 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 图标界面。
你可以在这里找到它。