我正在尝试将标准Apple地址簿应用中的拖放事件陷入我的Qt应用。这个代码适用于Qt 4.4。在Mac OS X 10.4上:
void
MyView::contentsDropEvent( QDropEvent* e )
{
QList<QUrl> urls = e->mimeData()->urls();
...
然后我可以使用该URL来获取vCard。非凡。
但是从Mac OS X 10.5开始,苹果通讯录似乎不再支持text / uri-list。所以e-&gt; mimeData() - &gt; urls()返回一个空列表。更糟糕的是,e-&gt; mimeData() - &gt; formats()返回一个空列表。如何找出他们拖动的哪些电子名片?
以下是诺基亚Qt工程师对此问题的评论:
“Adressbook停止提供下降 数据与text / uri-list兼容 OS 10.5中的风味数据。我们不多 可以做到这一点。他们的味道 而是提供'public.vcard'。我们 可以支持这个作为一个 实施请求,但我的直觉 感觉是这也是 应用程序特定的,可以像 很好地由应用程序实现 开发人员通过继承QMacMimeData“
但是Qt 4.4或4.5文档中没有QMacMimeData。关于如何找出他们拖拽的内容的任何想法?
答案 0 :(得分:2)
#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();
}