在QT 5中拖动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图标界面。

你可以在这里找到它。

最新更新