Wie ziehen zu empfangen und von Apple Adressbuch in Qt 4.4 auf Mac OS X 10.5 / 10.6 fallen
-
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?
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();
}