Comment recevoir un glisser-déposer du carnet d'adresses Apple sous Qt 4.4 sous Mac OS X 10.5 / 10.6
-
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é?
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();
}