在QT 5中拖动QWidget

Leo*_*Bor 6 qt drag-and-drop qwidget

我必须制作类似iOS界面,可以拖动以改变其位置的3x3图标字段,然后在XML文件中记住它.

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

现在我正在尝试学习如何为QWidget执行拖放操作,但看起来你只能放到QWidget上,但是无法拖动它.

这不可能吗?我该怎么搬这个东西?

Gre*_*low 5

拖动小部件并不容易。您必须自己编写大量代码。

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();
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

这意味着,当您的窗口小部件收到一条要拖动的消息时(例如,像按下鼠标一样),它必须创建一个QDrag对象。

在QDrag对象中,您可以设置一个像素图,该像素图表示您拖动的窗口小部件。如果此时隐藏小部件,则看起来就像鼠标指针“抓住”了小部件。

另外,您需要一个QMimeData对象。您可以在其中放置各种数据,这些数据描述了小部件。在您的用例中,可以识别您的小部件的东西。因为,这里出现了困难的部分:您必须自己动起来。

小部件是网格的父级,它接收放置事件并从mime数据中读取,该小部件希望我移动。从QDropEvent可以获取将小部件移动到的位置。那就是您必须编写的代码:网格布局中的实际重新定位。并且不要忘记更新xml。