Mac OS X 10.5 / 10.6のQt 4.4でAppleアドレス帳からドラッグアンドドロップを受け取る方法
-
05-07-2019 - |
質問
標準の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()は空のリストを返します。ドラッグされたvCardを見つけるにはどうすればよいですか?
この問題に関するNokia Qtエンジニアのコメント:
&quot; Adressbookはドロップの提供を停止しました text / uri-list互換のデータ OS 10.5のフレーバーデータ。あまりない それについてはできます。フレーバー彼ら 代わりに「public.vcard」を提供します。我々 としてこれをサポートすることができます 実装リクエスト、しかし私の腸 気持ちはこれも アプリケーション固有であり、同様に アプリによってうまく実装される QMacMimeData&quot;
をサブクラス化することによる開発者
しかし、Qt 4.4または4.5のドキュメントにはQMacMimeDataはありません。ドラッグしたものを見つける方法についてのアイデアはありますか?
解決
Qt / Nokiaのrichardmgからいくつかのサンプルコードが提供されました。いくつかのギャップを埋めました。これは、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();
}