Wie ziehen zu empfangen und von Apple Adressbuch in Qt 4.4 auf Mac OS X 10.5 / 10.6 fallen

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

  •  05-07-2019
  •  | 
  •  

Frage

ich zu stoppen ziehen versuchen und Ereignisse aus dem Standard-Apple-Adressbuch App zu meinem Qt App fallen. Dieser Code funktioniert mit Qt 4.4 in Ordnung. auf Mac OS X 10.4:

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

Ich kann dann die URL verwenden, um die vCard zu bekommen. Marvelous.

Aber von Mac OS X 10.5 das Apple Adressbuch scheint nicht mehr text / uri-Liste zu unterstützen. So e-> mimeData () -> Urls () gibt eine leere Liste. Schlimmer noch, e-> mimeData () -> Formate () gibt eine leere Liste. Wie finde ich heraus, welche vCards sie gezogen?

Hier ist ein Kommentar von einem Nokia Qt Ingenieure auf diesem Problem:

  

"Adressbook gestoppt Abfall   Daten als Text / uri-list kompatibel   Geschmack Daten in OS 10.5. Nicht viel wir   kann über das tun. Der Geschmack sie   bieten stattdessen ‚public.vcard‘. Wir   Aufmachungen könnte die Unterstützung für diese als   Umsetzung Anfrage, aber mein Bauch   Gefühl ist, dass auch dies ist   anwendungsspezifisch und kann nur als   auch von der App implementiert werden   Entwickler von Subklassen QMacMimeData "

Aber es gibt keine QMacMimeData in Qt 4.4 oder 4.5-Dokumentation. Alle Ideen, wie kann ich herausfinden, was sie gezogen?

War es hilfreich?

Lösung

richardmg von Qt / Nokia geliefert mir freundlich mit einigem Beispiel-Code. Ich habe in einigen der Lücken gefüllt. Diese jetzt funktioniert auf 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();
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top