Come ricevere il trascinamento della selezione dalla rubrica di Apple in Qt 4.4 su Mac OS X 10.5 / 10.6

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

  •  05-07-2019
  •  | 
  •  

Domanda

Sto cercando di intercettare gli eventi di trascinamento della selezione dall'app standard della rubrica di Apple alla mia app Qt. Questo codice funziona bene con Qt 4.4. su Mac OS X 10.4:

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

Posso quindi utilizzare l'URL per ottenere la vCard. Marvelous.

Ma da Mac OS X 10.5 la rubrica di Apple non sembra più supportare text / uri-list. Quindi e- > mimeData () - > urls () restituisce un elenco vuoto. Peggio ancora, e- > mimeData () - > format () restituisce un elenco vuoto. Come faccio a sapere quali vCard hanno trascinato?

Ecco un commento di un ingegnere Nokia Qt su questo problema:

  

" Adressbook ha smesso di fornire drop   dati come testo / uri-list compatibile   dati di sapore in OS 10.5. Non molto noi   posso fare al riguardo. Il loro sapore   fornire invece è "public.vcard". Noi   potrebbe sostenere questo come un   richiesta di implementazione, ma il mio istinto   la sensazione è che anche questo sia   applicazione specifica, e può proprio come   ben implementato dall'app   sviluppatore dalla sottoclasse di QMacMimeData "

Ma non c'è QMacMimeData nella documentazione di Qt 4.4 o 4.5. Qualche idea su come posso scoprire cosa hanno trascinato?

È stato utile?

Soluzione

richardmg di Qt / Nokia mi ha gentilmente fornito un codice di esempio. Ho colmato alcune lacune. Ora funziona perfettamente su 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();
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top