рд╕реЗрд▓рдлрд┐рд╢ рдУрдПрд╕ рдХреЗ рд▓рд┐рдП VKontakte рдХреНрд▓рд╛рдЗрдВрдЯ рдореЗрдВ рд▓рд╛рдВрдЧ рдкреЛрд▓ рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди

рдкрд░рд┐рдЪрдп


рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЕрдм рднреА, рдЖрдзреБрдирд┐рдХ рджреБрдирд┐рдпрд╛ рдореЗрдВ, рдкреБрд╢ рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХреА рдХреЗ рд▓рд╛рднреЛрдВ рдХрд╛ рд▓рд╛рдн рдЙрдард╛рдирд╛ рд╣рдореЗрд╢рд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ , рдФрд░ рдХрднреА-рдХрднреА рдЖрдкрдХреЛ рд╡рд░реНрдХрдЖрд░реНрдб рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд▓реЛрдВрдЧ рдкреЛрд▓ рдХреЗ рд░реВрдк рдореЗрдВ, рдЬреЛ рдЖрдкрдХреЛ рдкреБрд╢ рд╕реВрдЪрдирд╛рдУрдВ рдХреЗ рддрдВрддреНрд░ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рд╕реЗрд▓рдлрд╝рд┐рд╢ рдУрдПрд╕ рдХреЗ рд▓рд┐рдП VKontakte рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╕рдордп рдРрд╕реА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЙрддреНрдкрдиреНрди рд╣реБрдИред

рдпрд╣ рдЖрд▓реЗрдЦ рд▓рд╛рдВрдЧ рдкреЛрд▓ VKontakte рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ - рдЗрд╕рдореЗрдВ рдмрд╣реБрдд рд╡рд┐рд╕реНрддреГрдд рджрд╕реНрддрд╛рд╡реЗрдЬ рд╣реИрдВ , рдФрд░ рдмреБрдирд┐рдпрд╛рджреА рдЙрджрд╛рд╣рд░рдг рдкрд╣рд▓реЗ рд╣реА рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдП рдЬрд╛ рдЪреБрдХреЗ рд╣реИрдВ ред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдордВрдЪ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдпрд╣ рд╕рдордЭрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдкрд╛рдардХ рди рдХреЗрд╡рд▓ QML рдореЗрдВ , рдмрд▓реНрдХрд┐ C ++ рдореЗрдВ рднреА рд╕реЗрд▓рдлрд┐рд╢ рдУрдПрд╕ рдХреЗ рд╡рд┐рдХрд╛рд╕ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИред

рд▓рдВрдмреА рдкреЛрд▓ рдЧреНрд░рд╛рд╣рдХ


рдореБрдЦреНрдп рдХреНрд▓рд╛рдЗрдВрдЯ рдХреНрд▓рд╛рд╕ LongPoll рдХреНрд▓рд╛рд╕ рд╣реИ, рдЬреЛ рд▓реЙрдиреНрдЧ рдкреЛрд▓ рд╕рд░реНрд╡рд░ рдкрд░ рд╕рд╡рд╛рд▓ LongPoll рд╣реИ рдФрд░ рдЕрдкрдиреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдПрдБ рджреЗрддрд╛ рд╣реИред

getLongPollServer рд╡рд┐рдзрд┐, рдЬрд┐рд╕рдХрд╛ рдХрд╛рд░реНрдп рд╕рд░реНрд╡рд░ рд╕реЗ рдХрдиреЗрдХреНрд╢рди рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реИ, рдХреЛ рдЖрд╡реЗрджрди рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рджреМрд░рд╛рди рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ рддреБрд░рдВрдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдкрдбреЗрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:

 /** *       Long Poll  . */ void LongPoll::getLongPollServer() { QUrl url("https://api.vk.com/method/messages.getLongPollServer"); //    API QUrlQuery query; query.addQueryItem("access_token", _accessToken); //  Access Token query.addQueryItem("v", "5.53"); //    API url.setQuery(query); //       _manager->get(QNetworkRequest(url)); //  GET-    } 

рдпрджрд┐ рдЕрдиреБрд░реЛрдз рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рддреЛ рд▓реЛрдВрдЧ рдкреЛрд▓ рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рдХрдиреЗрдХреНрд╢рди рдХреА рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рд╕рд╣реЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ doLongPollRequest рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрдиреЗрдХреНрд╢рди рдЦреЛрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ:

 /* *      . * @:param: reply --    . */ void LongPoll::finished(QNetworkReply* reply) { QJsonDocument jDoc = QJsonDocument::fromJson(reply->readAll()); //    JSON if (_server.isNull() || _server.isEmpty()) { //      QJsonObject jObj = jDoc.object().value("response").toObject(); _server = jObj.value("server").toString(); //    _key = jObj.value("key").toString(); //    _ts = jObj.value("ts").toInt(); //     doLongPollRequest(); //    Long Poll  } else { // ... //     // ... } reply->deleteLater(); //     } 

doLongPollRequest рд▓реЙрдиреНрдЧ рдкреЛрд▓ рд╡рд┐рдзрд┐ рдореЗрдВ, рд╕рд░реНрд╡рд░ рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рдХрдиреЗрдХреНрд╢рди рдкреИрд░рд╛рдореАрдЯрд░ рдкрд╛рд╕ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ:

 /* *     Long Poll . */ void LongPoll::doLongPollRequest() { QUrl url("https://" + _server); //    QUrlQuery query; query.addQueryItem("act", "a_check"); //     query.addQueryItem("key", _key); //   query.addQueryItem("ts", QString("%1").arg(_ts)); //    query.addQueryItem("wait", "25"); //  25   query.addQueryItem("mode", "10"); //       url.setQuery(query); //       _manager->get(QNetworkRequest(url)); //  GET-  Long Poll  } 

рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ mode рдлрд╝реАрд▓реНрдб рдХрд╛ рдореВрд▓реНрдп, 10 рдХреЗ рдмрд░рд╛рдмрд░, рдЕрдиреБрд▓рдЧреНрдирдХреЛрдВ (2) рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд▓реНрдк рдЬреЛрдбрд╝рдХрд░ рдФрд░ рдШрдЯрдирд╛рдУрдВ рдХреЗ рдПрдХ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рд╕реЗрдЯ (8) рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдХрдиреЗрдХреНрд╢рди рдЦреЛрд▓рдиреЗ рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд░реВрдк рдореЗрдВ, рд╕рд░реНрд╡рд░ рдПрдХ JSON рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдирд╡реАрдирддрдо рдШрдЯрдирд╛рдПрдБ рд╣реЛрддреА рд╣реИрдВред рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ finished рд╡рд┐рдзрд┐ рдореЗрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рд╣реЛрддреА рд╣реИ:

 /* *      . * @:param: reply --    . */ void LongPoll::finished(QNetworkReply* reply) { QJsonDocument jDoc = QJsonDocument::fromJson(reply->readAll()); //    JSON if (_server.isNull() || _server.isEmpty()) { // ... //    // ... } else { QJsonObject jObj = jDoc.object(); if (jObj.contains("failed")) { //       if (jObj.value("failed").toInt() == 1) { //    _ts = jObj.value("ts").toInt(); //      doLongPollRequest(); //    Long Poll  } else { _server.clear(); //    _key.clear(); //    _ts = 0; //     getLongPollServer(); //      } } else { //      _ts = jObj.value("ts").toInt(); //      parseLongPollUpdates(jObj.value("updates").toArray()); //     doLongPollRequest(); //    Long Poll  } } reply->deleteLater(); //     } 

рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ failed рдХреНрд╖реЗрддреНрд░ рдЪрд╛рд░ рдорд╛рди рд▓реЗ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдирдореЗрдВ рд╕реЗ рдХреЗрд╡рд▓ рдПрдХ, рдПрдХ рдХреЗ рдмрд░рд╛рдмрд░, рдХреЛ рд▓реЙрдиреНрдЧ рдкреЛрд▓ рд╕рд░реНрд╡рд░ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдмрд╛рд░-рдмрд╛рд░ рдЕрдиреБрд░реЛрдз рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред рдЗрд╕ рдХрд╛рд░рдг рд╕реЗ, рд╢рд░реНрдд рдХреЛ рдХреЛрдб рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ред

 jObj.value("failed").toInt() == 1 

parseLongPollUpdates рд╡рд┐рдзрд┐ рдЙрдирдХреЗ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдБрдЪ рдХреЗ рд╕рд╛рде рдЖрдиреЗ рд╡рд╛рд▓реА рд╕рднреА рдШрдЯрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рдЪрдХреНрд░ рд╣реИ:

 enum LONGPOLL_EVENTS { NEW_MESSAGE = 4, //   INPUT_MESSAGES_READ = 6, //    OUTPUT_MESSAGES_READ = 7, //    USER_TYPES_IN_DIALOG = 61, //      USER_TYPES_IN_CHAT = 62, //      UNREAD_DIALOGS_CHANGED = 80, //     }; /* *   ,   Long Poll . * @:param: updates --    . */ void LongPoll::parseLongPollUpdates(const QJsonArray& updates) { for (auto value : updates) { //     QJsonArray update = value.toArray(); //    switch (update.at(0).toInt()) { //    case NEW_MESSAGE: emit gotNewMessage(update.at(1).toInt()); break; case INPUT_MESSAGES_READ: emit readMessages(update.at(1).toInt(), update.at(2).toInt(), false); break; case OUTPUT_MESSAGES_READ: emit readMessages(update.at(1).toInt(), update.at(2).toInt(), true); break; case USER_TYPES_IN_DIALOG: emit userTyping(update.at(1).toInt(), 0); break; case USER_TYPES_IN_CHAT: emit userTyping(update.at(1).toInt(), update.at(2).toInt()); break; case UNREAD_DIALOGS_CHANGED: emit unreadDialogsCounterUpdated(update.at(1).toInt()); break; default: break; } } } 

рдХреЛрдб рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдирдП рд▓реЙрдиреНрдЧ рдкреЛрд▓ рдЗрд╡реЗрдВрдЯ рдХреЗ рд▓рд┐рдП, рдХреНрд▓рд╛рдЗрдВрдЯ рдПрдХ рд╕рд┐рдЧреНрдирд▓ рднреЗрдЬрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдХрд┐рд╕реА рдЕрдиреНрдп рднрд╛рдЧ рджреНрд╡рд╛рд░рд╛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕рдВрдХреЗрдд рддрд░реНрдХ рд╕рдВрдкреВрд░реНрдг рдШрдЯрдирд╛ рд╡рд╕реНрддреБ рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдХреЗрд╡рд▓ рдЗрд╕рдХреЗ рдЖрд╡рд╢реНрдпрдХ рдЕрдВрдЧ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, gotNewMessage рд╕рд┐рдЧреНрдирд▓ рдХреЗрд╡рд▓ рдПрдХ рдирдП рд╕рдВрджреЗрд╢ рдХреЗ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЛ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдЗрд╕рдХреА рдкреВрд░реНрдг рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ :

 void VkSDK::_gotNewMessage(int id) { _messages->getById(id); } 

рдЗрд╕ рдПрдХрд▓-рдкрдВрдХреНрддрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк , VKontakte рд╕рд░реНрд╡рд░ рд╕реЗ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рд╕рдВрджреЗрд╢ рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдЖрдЧреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд╕рд╛рде рдЗрд╕рдХреЗ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рд╕рдВрджреЗрд╢ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреВрд░реА рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред рдирд┐рд╖реНрдХрд░реНрд╖ рдореЗрдВ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрдХреЗрдд рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдПрдХ рдирдП рд╕рдВрджреЗрд╢ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдбреЗрдЯрд╛ рдкреНрд░реЗрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдкреИрдирд▓ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИ:

 import QtQuick 2.0 //      QML import Sailfish.Silica 1.0 //      Sailfish OS import org.nemomobile.notifications 1.0 //      ApplicationWindow //   { // ... //   // ... Notification { //     id: commonNotification //    category: "harbour-kat" //   remoteActions: [ //  -    { "name": "default", "service": "nothing", "path": "nothing", "iface": "nothing", "method": "nothing" } ] } Connections { //     target: vksdk //    SDK  onGotNewMessage: { //      commonNotification.summary = name //      commonNotification.previewSummary = name //     commonNotification.body = preview //      commonNotification.previewBody = preview //     commonNotification.close() //      commonNotification.publish() //    } } } 

рд╕рдВрд╡рд╛рдж рдЗрдВрдЯрд░рдлрд╝реЗрд╕


рдЕрдм, рд▓рд╛рдВрдЧ рдкреЛрд▓ рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рдХреНрд▓рд╛рдЗрдВрдЯ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╣рдо рдПрдХ рдЦреБрд▓реЗ рд╕рдВрд╡рд╛рдж рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдкрд╣рд▓реА рдЪреАрдЬ рдЬреЛ рдЖрдкрдХреА рдЖрдВрдЦ рдХреЛ рдкрдХрдбрд╝рддреА рд╣реИ рд╡рд╣ рд╣реИ Connections рдШрдЯрдХ:

 Connections { //     target: vksdk //    SDK  onSavedPhoto: { //       attachmentsList += name + ","; //       attachmentsBusy.running = false; //     } onUserTyping: { //       var tempId = userId; //      if (chatId !== 0) { //    tempId = chatId; //  ,     } if (tempId === historyId) { //       typingLabel.visible = true //      } } } 

onUserTyping рд╕реНрд▓реЙрдЯ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╕рдВрдмрдВрдзрд┐рдд рд╕реВрдЪрдирд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдХреЗ рд╕рдВрджреЗрд╢ рдХреЗ рд╡рд╛рд░реНрддрд╛рдХрд╛рд░ рджреНрд╡рд╛рд░рд╛ рдПрдХ рд╕реЗрдЯ рдХреА рдШрдЯрдирд╛ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрд╣рд╛рдВ, рдкрд╣рд▓реЗ рдЪрд░рдг рдореЗрдВ, рдХрдорд░рд╛ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдХрдорд░реЗ рдХрд╛ рдЕрд░реНрде рд╣реИ рд╕рдВрд╡рд╛рдж рдФрд░ рдЪреИрдЯ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рд╢рдмреНрдж), рдФрд░ рджреВрд╕рд░реЗ рдЪрд░рдг рдореЗрдВ, рдПрдХ рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ рдпрджрд┐ рдкреНрд░рд╛рдкреНрдд рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдФрд░ рд╡рд░реНрддрдорд╛рди рдХрдорд░реЗ рдХреЗ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИред

рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рдПрдХ рд╕реЗрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд╕реВрдЪрдирд╛ рджрд╕ рд╕реЗрдХрдВрдб рдХреЗ рд▓рд┐рдП рдкреНрд░рджрд░реНрд╢рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ, рдЕрдЧрд░ рдЗрд╕ рд╕рдордп рдХреЗ рджреМрд░рд╛рди рдПрдХ рдирдИ рдШрдЯрдирд╛ рдирд╣реАрдВ рдЖрдИ рд╣реИ рдЬреЛ рдлрд┐рд░ рд╕реЗ рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдХреЛ рд╕рдХреНрд░рд┐рдп рдХрд░реЗрдЧреАред рдпрд╣ Timer рдШрдЯрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

 Label { //     id: typingLabel //    anchors.bottom: newmessagerow.top //       width: parent.width //     horizontalAlignment: Text.AlignHCenter //      font.pixelSize: Theme.fontSizeExtraSmall //    color: Theme.secondaryColor //     text: qsTr("typing...") //    visible: false //      onVisibleChanged: if (visible) typingLabelTimer.running = true //     Timer { //    id: typingLabelTimer //    interval: 10000 //   --   onTriggered: typingLabel.visible = false //       } } 

onSavedPhoto рд╕реНрд▓реЙрдЯ рд╕рдВрджреЗрд╢реЛрдВ рдореЗрдВ рдЫрд╡рд┐ рд▓реЛрдбрд┐рдВрдЧ рдХреЗ рдЕрдВрдд рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ, рдЬреЛ рд╡рд░реНрддрдорд╛рди рд▓реЗрдЦ рдХреЗ рджрд╛рдпрд░реЗ рд╕реЗ рдкрд░реЗ рд╣реИред

рджреВрд╕рд░реА рдЪреАрдЬ рдЬреЛ рдмреНрдпрд╛рдЬ рдХреА рд╣реИ рд╡рд╣ рд╕рдВрджреЗрд╢ рд╕реВрдЪреА рд╣реИ:

 SilicaListView { //    id: messagesListView //    //        : anchors.left: parent.left anchors.right: parent.right //            : anchors.top: parent.top anchors.bottom: typingLabel.top verticalLayoutDirection: ListView.BottomToTop //      clip: true //   ,     model: vksdk.messagesModel //    delegate: MessageItem { //     //        : anchors.left: parent.left anchors.right: parent.right //     : userId: fromId //   date: datetime //    out_: out //    read_: read //    avatarSource: avatar //    bodyText: body //   photos: photosList //     videos: videosList //     audios: audiosList //     documents: documentsList //     links: linksList //     news: newsList //       geoTile: geoTileUrl //     geoMap: geoMapUrl //         fwdMessages: fwdMessagesList //    Component.onCompleted: { //      if (index === vksdk.messagesModel.size-1) { //       //      : vksdk.messages.getHistory(historyId, vksdk.messagesModel.size) } } } VerticalScrollDecorator {} //      } 

рдпрд╣рд╛рдБ, MessageItem рдШрдЯрдХ рдПрдХрд▓ рд╕рдВрджреЗрд╢ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред рдЗрд╕рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдЗрд╕ рд▓реЗрдЦ рдХреЗ рджрд╛рдпрд░реЗ рд╕реЗ рдкрд░реЗ рд╣реИред

рд╕рдВрджреЗрд╢ рд╕реНрд╡рдпрдВ vksdk.messagesModel рдореЙрдбрд▓ рд╕реЗ рд▓рд┐рдП рдЧрдП рд╣реИрдВред рдпрд╣ рдореЙрдбрд▓ Message рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИ рдЬреЛ рдХрд┐ add , prepend , addProfile , readMessages рдФрд░ clear рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рдореЗрдВ рдЕрдкрдбреЗрдЯ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ:

 /* *    . */ void MessagesModel::clear() { beginRemoveRows(QModelIndex(), 0, _messages.size()); //     _messages.clear(); //   _profiles.clear(); //    endRemoveRows(); //     //    : QModelIndex index = createIndex(0, 0, nullptr); emit dataChanged(index, index); } /* *      . * @:param: message --    . */ void MessagesModel::add(Message* message) { //   : beginInsertRows(QModelIndex(), _messages.size(), _messages.size()); _messages.append(message); //    endInsertRows(); //    //    : QModelIndex index = createIndex(0, 0, static_cast<void *>(0)); emit dataChanged(index, index); } /* *       . * @:param: message --    . */ void MessagesModel::prepend(Message* message) { //        : if (_messages.isEmpty()) return; if (message->chat() && _messages.at(0)->chatId() != message->chatId()) return; if (!message->chat() && _messages.at(0)->userId() != message->userId()) return; beginInsertRows(QModelIndex(), 0, 0); //    _messages.insert(0, message); //   endInsertRows(); //    //    : QModelIndex index = createIndex(0, _messages.size(), nullptr); emit dataChanged(index, index); } /* *       . * @:param: profile --    . */ void MessagesModel::addProfile(Friend* profile) { //   ,       if (_profiles.contains(profile->id())) return; _profiles[profile->id()] = profile; //    : QModelIndex startIndex = createIndex(0, 0, nullptr); QModelIndex endIndex = createIndex(_messages.size(), 0, nullptr); emit dataChanged(startIndex, endIndex); } /* *    . * @:param: peerId --  . * @:param: localId --    . * @:param: out --     . */ void MessagesModel::readMessages(qint64 peerId, qint64 localId, bool out) { //        : if (_messages.isEmpty()) return; if (_messages.at(0)->chat() && _messages.at(0)->chatId() != peerId) return; if (!_messages.at(0)->chat() && _messages.at(0)->userId() != peerId) return; foreach (Message *message, _messages) { //       if (message->id() <= localId && message->isOut() == out) //    message->setReadState(true); //    } //    : QModelIndex startIndex = createIndex(0, 0, nullptr); QModelIndex endIndex = createIndex(_messages.size(), 0, nullptr); emit dataChanged(startIndex, endIndex); } 

рд╕рднреА рдкрд╛рдВрдЪ рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП dataChanged рд╕рд┐рдЧреНрдирд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣реИ, рдЬреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдореЙрдбрд▓ рдореЗрдВ рдбреЗрдЯрд╛ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕ рд╕рд┐рдЧреНрдирд▓ рдХреЛ SilicaListView рд╕реЗ рд╕рдВрджреЗрд╢реЛрдВ рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП SilicaListView рддрддреНрд╡реЛрдВ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ SilicaListView ред SilicaListView рд▓рд┐рдП рд╕рдВрджреЗрд╢ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, SilicaListView рдХреЙрд▓ рдХрд░рдХреЗ рдкреНрд░рджрд╛рди SilicaListView рдЬрд╛рддреА рд╣реИ рдФрд░ endInsertRows рднреЗрдЬрддреА рд╣реИрдВ рдЬреЛ рдХреНрд░рдорд╢рдГ rowsAboutToBeInserted рдФрд░ rowsInserted рд╣реИрдВред рдирддреАрдЬрддрди, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рдВрд╡рд╛рдж рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рдореЗрдВ рдирдП рд╕рдВрджреЗрд╢ рдФрд░ рдЙрдирдХреА рд╕реНрдерд┐рддрд┐ рджреЗрдЦреЗрдЧрд╛ред

рдирд┐рд╖реНрдХрд░реНрд╖


рдЗрд╕ рд▓реЗрдЦ рдиреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рд╡реАрдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реЗрд▓рдлрд┐рд╢ рдУрдПрд╕ рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд╕рдордп рд▓рд╛рдВрдЧ рдкреЛрд▓ рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХреА рдЬрд╛рдВрдЪ рдХреАред рдХреНрд▓рд╛рдЗрдВрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдХреБрдЫ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рдФрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рдерд╛ред рдЗрд╕ рдЖрд▓реЗрдЦ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рдХреЛрдб GitHub рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИред

Source: https://habr.com/ru/post/hi413947/


All Articles