Qual é a maneira correta de abrir uma url de um escopo em c ++?

0

Qual é a maneira correta de abrir uma url de um escopo em c ++?

Isso é o que eu tentei (essa função é chamada de ActivationResponse.):

static void open_url(std::string const& uri) {
//    url_dispatch_send(uri.c_str(), NULL, NULL);
/*    
 *    I found this in the libertine-scope, but I wasn't able to import
 *    the right libraries
 */

//    Qt.openUrlExternally(uri.c_str());
/*    
 *    I found this at https://developer.ubuntu.com/en/phone/platform/guides/url-dispatcher-guide/ 
 *    and https://developer.ubuntu.com/en/phone/apps/qml/tutorials/register-your-app-url-dispatcher/
 *    but it is actually meant to be used in QML, so it isn't recognized.
 *    I hoped it would work by using QtQuick or QtQml
 */

//    QDesktopServices::openUrl(QUrl(QString(uri), QUrl::TolerantMode));
//    QDesktopServices::openUrl(QUrl("http://www.google.com", QUrl::TolerantMode));
/*    
 *    I found this at https://developer.ubuntu.com/en/phone/platform/guides/url-dispatcher-guide/ 
 *    and http://doc.qt.io/qt-5/qdesktopservices.html#openUrl
 *    this compiles, but the scope crashes on execution.
 *    
 */
}

edite: Para ser mais específico, as três funções que comentei são as três opções diferentes que encontrei e experimentei. Nenhum deles funcionaria. No comentário das funções, tentei explicar o que não funcionou.

A função open_url é chamada da ActivationResponse assim:

Action::Action(unity::scopes::Result const&         result,
               unity::scopes::ActionMetadata const& metadata,
               Action::OpenUriAction                open_uri)
        : sc::ActivationQueryBase(result, metadata)
        , open_uri_(open_uri)
{
}

sc::ActivationResponse
Action::activate()
{
    open_uri_(result().uri());
    return sc::ActivationResponse(sc::ActivationResponse::Status::NotHandled);
}
    
por EddieG 16.08.2016 / 13:06

1 resposta

0

Como eu suspeitava, há uma boa maneira de fazer isso.

1: na classe de escopo você deve sobrescrever o método activate

unity::scopes::ActivationQueryBase::UPtr NewsScope::activate(const sc::Result &result,
                                              const unity::scopes::ActionMetadata &metadata) {
    return unity::scopes::ActivationQueryBase::UPtr(new NewsAction(result, metadata));
}

2: Na classe unity :: scopes :: ActivationQueryBase (aqui NewsAction) você define o método activate, por exemplo, assim:

sc::ActivationResponse NewsAction::activate()
{
    initScope();

    if (openWithoutPreview) {
        return sc::ActivationResponse(sc::ActivationResponse::Status::NotHandled);
    }

    return sc::ActivationResponse(sc::ActivationResponse::Status::ShowPreview);
}

(observe a resposta de ativação: NotHandled diz ao osciloscópio para enviá-lo ao distribuidor externo).

3: Finalmente, se criar as cartas (CategorisedResult) na classe de pesquisa, você tem que dizer-lhes para interceptar a ativação. (Result.set_intercept_activation ()) Por exemplo, assim:

for (const Result &result : results) {
    sc::CategorisedResult card(category);

    fillCard(card, result);
    card.set_intercept_activation();

    // Push the result
    if (!reply->push(card)) {
        // If we fail to push, it means the query has been cancelled.
        // So don't continue;
        return;
    }
}

Encontrei a solução (oculta) neste manual: link

    
por EddieG 10.09.2016 / 09:29