如何在Mac OS X 10.5 / 10.6的Qt 4.4中从Apple地址簿中接收拖放

时间:2009-11-26 16:44:15

标签: c++ macos qt mime-types

我正在尝试将标准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。关于如何找出他们拖拽的内容的任何想法?

1 个答案:

答案 0 :(得分:2)

Qt /诺基亚的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();
}