7

我必须制作类似于 iOS 界面的东西,3x3 的图标字段可以拖动以更改其位置,然后将其记住在 XML 文件中。

我决定使用 Grid 类(QWidget 是父级)作为容器,我自己的类(继承自 QWidget)作为元素。

现在我正在尝试学习如何为 QWidget 执行拖放操作,但似乎您只能拖放到 QWidget 上,但无法拖动它。

这是不可能的吗?我该如何移动这个东西?

4

3 回答 3

6

拖动小部件并不容易。大量的编码你必须自己做。

来自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。

于 2013-08-18T14:48:27.580 回答
4

做一个技巧然后你也可以拖动 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();
    ...
   }
}
于 2015-02-18T03:32:54.780 回答
0

Qt wiki 包含一个 QtQuick 示例,说明如何使用少于 80 行代码模拟 iOS 图标界面。

你可以在这里找到它。

于 2013-08-18T13:29:02.483 回答