在QT 5中拖动QWidget

时间:2013-08-18 12:29:48

标签: qt drag-and-drop qwidget

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

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

现在我正在努力学习如何执行拖拽和放大为QWidget丢弃,但看起来你只能放到QWidget上,但是无法拖动它。

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

3 个答案:

答案 0 :(得分:4)

拖动小部件并不容易。你必须自己做很多编码。

来自Qt Docs

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();
        ...
    }
}

这意味着,当您的窗口小部件收到要拖动它的消息时,例如与使用mousepress一样,它必须创建一个QDrag对象。

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

此外,您还需要一个QMimeData对象。在此,您可以放置​​描述窗口小部件的各种数据。在您的用例中,您可以识别您的小部件。因为,这里有困难的部分:你必须自己动手。

小部件是网格的父节点,它接收drop事件并从mime数据中读取,哪个小部件希望我移动。从QDropEvent中获取移动小部件的点。这就是你需要编码的东西:网格布局中的实际重新定位。并且不要忘记更新xml。

答案 1 :(得分:3)

做一个技巧,然后你也可以拖动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();
    ...
   }
}

答案 2 :(得分:0)

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

你可以找到它here