Comment recevoir un glisser-déposer du carnet d'adresses Apple sous Qt 4.4 sous Mac OS X 10.5 / 10.6

StackOverflow https://stackoverflow.com/questions/1804728

  •  05-07-2019
  •  | 
  •  

Question

J'essaie de capturer des événements de glisser-déposer de l'application de carnet d'adresses Apple standard vers l'application Qt. Ce code fonctionne bien avec Qt 4.4. sous Mac OS X 10.4:

void 
MyView::contentsDropEvent( QDropEvent* e )
{
    QList<QUrl> urls = e->mimeData()->urls();
    ...

Je peux ensuite utiliser l'URL pour obtenir la vCard. Merveilleux.

Mais à partir de Mac OS X 10.5, le carnet d’adresses d’Apple ne semble plus prendre en charge text / uri-list. Ainsi, e- > mimeData () - > urls () renvoie une liste vide. Pire encore, e- > mimeData () - > formats () renvoie une liste vide. Comment savoir quelles vCards ont été traînées?

Voici un commentaire d'un ingénieur Nokia Qt sur ce problème:

  

" Le carnet d'adresses a cessé de fournir le dépôt   données compatibles texte / liste uri   données de saveur sous OS 10.5. Pas grand chose nous   peut faire à ce sujet. La saveur qu'ils   fournir à la place est 'public.vcard'. nous   pourrait mettre en place un soutien pour cela en tant que   demande de mise en œuvre, mais mon instinct   le sentiment est que c'est trop   application spécifique, et peut tout aussi   bien être mis en œuvre par l'application   développeur en sous-classant QMacMimeData "

Mais il n'y a pas de QMacMimeData dans la documentation de Qt 4.4 ou 4.5. Des idées sur la façon dont je peux savoir ce qu'ils ont traîné?

Était-ce utile?

La solution

richardmg de Qt / Nokia m'a gentiment fourni un exemple de code. J'ai comblé certaines des lacunes. Cela fonctionne désormais très bien sous Mac OS X 10.5.

#include <QtGui>

class VCardMime : public QMacPasteboardMime
{
    public:
    VCardMime() : QMacPasteboardMime(MIME_ALL)
    { }

    QString convertorName()
    {
        return QString("VCardMime");
    }

    bool canConvert(const QString &mime, QString flav)
    {
        return mimeFor(flav) == mime;
    }

    QString mimeFor(QString flav)
    {
        if (flav == QString("public.vcard"))
            return QString("application/x-mycompany-VCard");
        return QString();
    }

    QString flavorFor(const QString &mime)
    {
        if (mime == QString("application/x-mycompany-VCard"))
            return QString("public.vcard");
        return QString();
    }

    QVariant convertToMime(const QString &mime, QList<QByteArray> data, QString flav)
    {
        QByteArray all;
        foreach ( QByteArray i, data )
        {
            all += i;
        }
        return QVariant( all );
    }

    QList<QByteArray> convertFromMime(const QString &mime, QVariant data, QString flav)
    {
        // Todo: implement!
        return QList<QByteArray>();
    }

};

class TestWidget : public QWidget
{

public:
    TestWidget() : QWidget(0)
    {
        new VCardMime();
        setAcceptDrops(true);
    }

    void contentsDropEvent(QDropEvent* e)
    {
        if ( e->mimeData()->hasFormat( "application/x-mycompany-VCard" ) )
        {                
            QString s = QString( e->mimeData()->data( "application/x-mycompany-VCard" ) );

            // s now contains text of vcard

            e->acceptProposedAction();
        }
    }
};

int main(int argc, char **argv)
{
    QApplication app(argc, argv);
    TestWidget wid1;
    wid1.show();
    return app.exec();
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top