Mac OS X 10.5/10.6의 QT 4.4의 Apple 주소록에서 드래그 앤 드롭을받는 방법

StackOverflow https://stackoverflow.com/questions/1804728

  •  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();
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top