【问题标题】:Drag and drop issue in Qt: Pass parameter to receiving dropEventQt中的拖放问题:将参数传递给接收dropEvent
【发布时间】:2012-12-20 11:39:02
【问题描述】:

healthPackButton 被丢弃在 mysquare 上。现在我想为这个按钮添加一个值(因为我有许多 healthPackButtons 并且我希望能够区分它们)。我已尝试更改 makeDrag 函数以使其接受额外的参数,但我的 SIGNAL 不再匹配。

问题:如何将附加信息(=> int 值)传递给另一个类中的 dropEvent 处理程序。

Dialog

    for (int i=0; i<healthPks.size(); i++){
        int value = healthPks.at(i);
        QPushButton *healthPackButton = new QPushButton(title,this);
        connect(healthPackButton,SIGNAL(pressed()),this,SLOT(makeDrag()));
    }



    void Dialog::makeDrag(){
        QDrag *drag = new QDrag(this);
        QMimeData *mime = new QMimeData;
        mime->setText("This is a test");
        drag->setMimeData(mime);
        drag->start();
    }

mysquare

void MySquare::dropEvent(QGraphicsSceneDragDropEvent *event){
    isHealthPack=true;
    int xCoord = curX/width;
    int yCoord = curY/height;
    int value = 0; //what's the value??
    const QMimeData *mimeData = event->mimeData();
    emit healthMapChanged(xCoord,yCoord,value);
    update();
}

【问题讨论】:

    标签: c++ qt drag-and-drop


    【解决方案1】:

    要将附加参数添加到您的插槽中,您可以使用QSignalMapper – 文档中有一个添加QString const&amp; 参数的示例,但您可以使用int 以完全相同的方式传递值到makeDrag(int)

    然后您可以使用QMimeTypesetData(例如,使用QByteArray::number 将您的int 转换为QByteArray)将该值传递给放置目标。

    【讨论】:

    • 我应该使用什么样的 mime 类型?文本/纯文本?
    • text/plain 如果您将其作为文本传递。一些通用的二进制类型,如果你像我上面所说的那样传递它(application/octet-stream 或其他任何名称)。
    • 这个例子没有说清楚,但我可以发送多个数据吗?因为我还想发送一个指向按钮的指针,所以我可以在它被放下时禁用它。
    • 单个 QMimeData 对象可以同时使用多种不同格式存储相同的数据。 - Qt 文档非常好,但需要阅读它们才能获得赞赏:)
    • 是的,谢谢,但我的意思是 QSignalMapper 而不是 QMimeData。我想向 makeDrag() 发送一个(按钮的)指针,以便禁用该按钮。
    猜你喜欢
    • 2011-05-08
    • 2020-06-26
    • 1970-01-01
    • 1970-01-01
    • 2016-07-02
    • 1970-01-01
    • 2021-10-18
    • 1970-01-01
    • 2019-02-20
    相关资源
    最近更新 更多