Come ricevere il trascinamento della selezione dalla rubrica di Apple in Qt 4.4 su Mac OS X 10.5 / 10.6
-
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?
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();
}