微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何将特定的QPixmap拖放到QGraphicsView中?

如何解决如何将特定的QPixmap拖放到QGraphicsView中?

在子类QListWidget上,我有几个项目。下面显示的每个QListWidget项目(例如“ ROS Init”,“ Images”等)都与一个特定的图标相关联。

问题,我要尝试拖放与该QListWidget项目相对应的特定图标,但是什么也没发生。

在负责拖动的功能下方:

void ListView::startDrag(Qt::DropActions supportedActions)
{
    QMap<int,QString> icons;
    icons.insert(IT_RosInit,"ROS Init");
    icons.insert(IT_Images,"Images");
    icons.insert(IT_Path,"Path");
    icons.insert(IT_RosShutDown,"ROS Shutdown");

    if (supportedActions & Qt::copyAction)
    {
        const QList<QListWidgetItem *> &m_items(selectedItems());
        if (m_items.isEmpty())
            return;

        Qpixmap pixmapLaser("/home/images/laserscan.png");
        Qpixmap pixmapPCloud2("/home/images/pcloud2.png");
        // etc ...

        QStringList iconImages;

        for(int i = 0; i < icons.count(); ++i)
        {
            for (const QString &tableType : iconImages) {
                if (tableType == "ROS Init")
                {
                    auto *data = mimeData(m_items);
                    auto *drag = new QDrag(this);
                    drag->setpixmap(pixmapLaser);
                    drag->setMimeData(data);
                    drag->setHotSpot(pixmapLaser.rect().center());
                    drag->exec(Qt::copyAction);
                 }
                else if(tableType == "Images")
                {
                    auto *data2 = mimeData(m_items);
                    auto *drag2 = new QDrag(this);
                    drag2->setpixmap(pixmapPCloud2);
                    drag2->setMimeData(data2);
                    drag2->setHotSpot(pixmapPCloud2.rect().center());
                    drag2->exec(Qt::copyAction);
                }
            }
        }
    }
    else
    {
        QListWidget::startDrag(supportedActions);
    }
}

子类化QListWidget之后,我重新实现了通常的拖放功能。除startDrag以外的所有其他功能均正常运行,实际上,当我尝试拖动适当的Qpixmap时,实际上看不到任何拖动。

我咨询了有用的this source,还有this other source,这虽然有用,但它没有重新实现startDrag,而是dropEvent,这对我来说不是问题,因为效果很好。

我还咨询了this sourcethis other source,但这也无助于解决问题。

感谢您在此问题上的解决,以解决问题

解决方法

解决方案

我将通过以下方式解决此问题:

  1. 设置QListWidgetItem 的{​​{3}}标志以启用要拖动的项目:

     item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsDragEnabled);
    
  2. 为每个项目设置所需的数据:

     item->setData(Qt::UserRole,type);
    

其中type是枚举值IT_RosInitIT_Images等之一。

  1. 启用ListWidget的拖动功能:

     setDragEnabled(true);
     setDragDropMode(QAbstractItemView::DragOnly);
    
  2. 使用项目设置来设置在QDrag中创建的startDrag对象。

示例

以下是我为您准备的一个示例,以演示如何实现建议的解决方案:

MainWindow.cpp

MainWindow::MainWindow(QWidget *parent) :
    QWidget(parent)
{
    auto *l = new QVBoxLayout(this);
    auto *list = new ListView(this);

    list->addItem(createItem(":/pix/images/laserscan.png",tr("RosInit"),IT_RosInit));
    list->addItem(createItem(":/pix/images/icons/pcloud2.png",tr("Images"),IT_Images));
    list->addItem(createItem(":/pix/images/icons/some_icon.png",tr("Path"),IT_Path));
    list->addItem(createItem(":/pix/images/icons/another_icon.png",tr("RosShutDown"),IT_RosShutDown));

    l->addWidget(list);

    resize(300,400);
    setWindowTitle("IconDrag");
}

QListWidgetItem *MainWindow::createItem(const QString &pm,const QString &text,int type)
{
    auto *item = new QListWidgetItem(QIcon(QPixmap(pm)),text);

    item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsDragEnabled);
    item->setData(Qt::UserRole,type);

    return item;
}

ListView.cpp

ListView::ListView(QWidget *parent) :
    QListWidget(parent)
{
    setDragEnabled(true);
    setDragDropMode(QAbstractItemView::DragOnly);
    setSelectionBehavior(QAbstractItemView::SelectRows);
    setSelectionMode(QAbstractItemView::SingleSelection);
}

void ListView::startDrag(Qt::DropActions supportedActions)
{
    if (supportedActions & Qt::CopyAction) {
        const QList<QListWidgetItem *> &items(selectedItems());

        if (items.isEmpty())
            return;

        const QPixmap &pm(items.first()->icon().pixmap(64));
        auto *item = items.first();
        auto *mimeData = new QMimeData();
        auto *drag = new QDrag(this);

        mimeData->setData("text/plain",item->data(Qt::UserRole).toByteArray());

        drag->setPixmap(pm);
        drag->setMimeData(mimeData);
        drag->setHotSpot(pm.rect().center());
        drag->exec(Qt::CopyAction);
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。