QContactManager *manager = new QContactManager();
QContact contact = manager->contact(contactLocalId);
При таком способе получения контакта, на реальном устройстве вы получите большие временные задержки и конфликты приложений одновременно использующих адресную книгу.В debug версии такого приложения вы даже получите ATTENTION, о том что не рекомендуется использользовать этот метод. В замен Qt Mobility предлагает Contacts Asynchronous API, который позволяет вытянуть контакты никому не мешая отфильтровав их по нужным критериям. Все классы используемые в этом API являются наследниками QContactAbstractRequest
Соответсвенно, если вы хотите получить контакт по его идентификатору "православным" методом, код нужно переписать примерно следущим образом:
QContactManager *manager = new QContactManager();
QContactFetchByIdRequest *request = new QContactFetchByIdRequest();
QList<QContactLocalId> localIds;
localIds.append(contactLocalId);
request->setLocalIds(localIds);
connect(request, SIGNAL(resultsAvailable()), this, SLOT(contactReceived()));
request->start();... ... ...
void AsyncApiExampleClass::contactReceived()
{
QContactFetchByIdRequest *senderRequest = qobject_cast<QContactFetchByIdRequest *>(sender())
QList<QContact> results = senderRequest->contacts();
//...
}
Конечно, пример выше самый простой, обратившись к документации вы сможете, найти гораздо больше возможностей данного API.
Что интересно среди Qt Mobility examples я нашел пример только для синхронного API, посмотреть же живую реализацию асинхронного API можно в плагине declarative_contacts.
А почему manager в "правильном" методе не используется явно?
ReplyDelete