Pull to refresh

Comments 16

UFO just landed and posted this here
Было бы замечательно!
Это ты был в рассылке Qt? :) Без, пока, заинтересованности со стороны Qt — получится?
UFO just landed and posted this here
Я нашла способ избежать конфликта и подружить все ОС c Sailfish путём подстановки некоторых файлов для Sailfish и всех остальных. Это позволило в коде приложения выделить слои пользовательского интерфейса под каждую ОС.

Мне не хватает подробностей по этому пункту!
Разные main.cpp и ApplicationWindow для Sailfish и остальных. При этом ApplicationWindow Практически копипаста, если не считать файлы, которые все-таки пришлось с помощью Silica или QtQuick.Controls писать
Этот инструмент меня заинтересовал больше всего, потому что аналога в других ОС я не встречала

В UWP темы искаропки.
В моменте про ассинхронность.
Попробуйте библиотеку github.com/simonbrunel/qtpromise
Позволяет реорганизовать код в стиле
Говнокод из реального проекта
QPromise<void> IEXApi::post(const QByteArray &payload){
    return QPromise<void>([=](auto resolve, auto reject) {
        closeReply();

        QNetworkRequest req("https://ws-api.iextrading.com/socket.io/?EIO=3&transport=polling&sid=" + sid);

        req.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::AlwaysNetwork);
        req.setHeader(QNetworkRequest::ContentTypeHeader, "text/plain;charset=UTF-8");
        req.setHeader(QNetworkRequest::ContentLengthHeader, QByteArray::number(payload.size()));
        req.setRawHeader(":scheme", "https");
        req.setRawHeader(":path", ("/socket.io/?EIO=3&transport=polling&sid=" + sid).toLatin1());
        req.setRawHeader(":authority", "ws-api.iextrading.com");
        req.setRawHeader(":method", "POST");

        reply = nmanager->post(req, payload);

        connect(reply, &QNetworkReply::finished, [=](){
            if(reply->error() == QNetworkReply::NoError){
                QString data = reply->readAll();
                if(data.trimmed() == "ok"){
                    return resolve();
                }
            }
            reject(reply->error());
        });
    });
}

QPromise<QByteArray> IEXApi::get(){
    return QPromise<QByteArray>([=](auto resolve, auto reject) {
        closeReply();

        QNetworkRequest req;
        if(sid.isEmpty()){
            req.setUrl(QString("https://ws-api.iextrading.com/socket.io/?EIO=3&transport=polling"));
        }else{
            req.setUrl("https://ws-api.iextrading.com/socket.io/?EIO=3&transport=polling&sid=" + sid);
        }

        req.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::AlwaysNetwork);
        req.setRawHeader(":scheme", "https");
        if(sid.isEmpty()){
            req.setRawHeader(":path", "/socket.io/?EIO=3&transport=polling");
        }else{
            req.setRawHeader(":path", ("/socket.io/?EIO=3&transport=polling&sid=" + sid).toLatin1());
        }
        req.setRawHeader(":authority", "ws-api.iextrading.com");
        req.setRawHeader(":method", "GET");

        reply = nmanager->get(req);

        connect(reply, &QNetworkReply::finished, [=](){
            if(reply->error() == QNetworkReply::NoError){
                if(reply->bytesAvailable() > 0){
                    return resolve(reply->readAll());
                }
            }
            reject(reply->error());
        });
    });
}

void IEXApi::open(){
    close();
    if(!nmanager){
        nmanager = new QNetworkAccessManager(this);
    }else if(nmanager->networkAccessible() != QNetworkAccessManager::Accessible){
        //если изменились настройки соединения, пересоздадим QNetworkAccessManager
        nmanager->deleteLater();
        //delete nmanager;
        nmanager = new QNetworkAccessManager(this);
    }
    get().then([=](const QByteArray &info){
        int i = 0;
        while(i < info.size() && info.at(i) != '{'){
            ++i;
        }
        auto doc = QJsonDocument::fromJson(QByteArray::fromRawData(info.constData() + i, info.size() - i)).object();
        sid = doc.value("sid").toString();
        pingTimer.setInterval(doc.value("pingInterval").toInt());
    }).then([=](){
        return post(R"(12:40/1.0/tops,)");
    }).then([=](){
        return get();
    }).then([=](const QByteArray &){
        closeSocket();
        socket.open("wss://ws-api.iextrading.com/socket.io/?EIO=3&transport=websocket&sid=" + sid);
    /*}).then([=](){
        return get();
    }).then([=](const QByteArray &){*/
    }).fail([=](QNetworkReply::NetworkError v){
        iexWarning << "NetworkError: " << v;
        openDelayed();
    }).fail([=](){
        iexWarning << "Uncaught Exception";
        openDelayed();
    });
}

написала свой шедевр на чистой Qt, без использования QtQuick.Controls и Silica

Интересно было бы взглянуть как это выглядит на Sailfish. Может добавите gif-демо такого приложения в статью?

Попробую об этом подумать. Но визуально оно совершенно не отличается от стандартных приложений на андроиде, разве что чуть больше косяков в дизайне (но это пока) :)

Эмулируемые Android-приложения на Sailfish получают внизу стандартную кнопку назад. Нативные Sailfish-приложения обходятся без нее: используются swipe или навигацию между последовательными страницами. Интересно насколько удобно для пользователя чистое Qt приложением, если вообще не используется Silica.


Продолжение следует.

Если есть возможность, выложите (на github например), минимальный скелет такого приложения (с разными контроллами, наполненными тестовыми данными), что бы иметь возможность его повертеть в руках.

Эмулируемые Android-приложения на Sailfish получают внизу стандартную кнопку назад. Нативные Sailfish-приложения обходятся без нее: используются swipe или навигацию между последовательными страницами. Интересно насколько удобно для пользователя чистое Qt приложением, если вообще не используется Silica.


Действительно, с этим есть определенные проблемы. Например, горизонтальное перелистывание айтемов в ListView на всю страницу в Sailfish — не самая удачная идея, хотя на андроиде так делать можно. Все-таки это приложение — прототип, попытки пощупать новую платформу. Естественно, все эти грабли в дальнейшем будут учтены. Другое дело, что нативный интерфейс Sailfish слишком сильно отличается от стандартных Android и ios, так что совместить в себе все три платформы — задача очень нетривиальная :)

Если есть возможность, выложите (на github например), минимальный скелет такого приложения (с разными контроллами, наполненными тестовыми данными), что бы иметь возможность его повертеть в руках.

Да, отличная идея для следующей статьи, думаю, кому-то будет интересно потрогать этого Франкенштейна :)

Сразу вопрос: какой аппарат с Sailfish использовали? :)

Для Sailfish inoi R7 и T8, еще несколько андроидов, айпад и айфон)
UFO just landed and posted this here
Sign up to leave a comment.