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에서 Apple 주소록은 더 이상 Text/Uri-List를 지원하지 않는 것 같습니다. 따라서 e-> mimedata ()-> urls ()는 빈 목록을 반환합니다. 더 나쁜 것은 e-> mimedata ()-> formats ()가 빈 목록을 반환합니다. 그들이 드래그 한 Vcards를 어떻게 알 수 있습니까?
다음은이 문제에 대한 Nokia QT 엔지니어의 의견입니다.
"Adressbook은 OS 10.5에서 텍스트/Uri-List 호환 향미 데이터로 드롭 데이터 제공을 중단했습니다. 우리가 그에 대해 할 수있는 것은 많지 않습니다. 대신 제공하는 맛은 'public.vcard'입니다. 우리는이를 구현 요청으로 지원할 수 있습니다. 그러나 내 직감은 이것이 너무 응용 프로그램에 따라 다르며 QMacmimedata를 서브 클래스를 통해 앱 개발자가 구현할 수 있다는 것입니다. "
그러나 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();
}