рдЙрдмрдВрдЯреВ рдЯрдЪ рдХреЗ рд▓рд┐рдП Google рдХрд╛рд░реНрдп

рдЫрд╡рд┐

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

рд╕реНрдерд╛рдкрдирд╛


рд╡рд░реНрддрдорд╛рди рдореЗрдВ, Ubuntu рдХреЗ рд▓рд┐рдП рдкреИрдХреЗрдЬ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рддреМрд░ рдкрд░ 12.04 рд╕реЗ рд╢реБрд░реВ рд╣реЛ рд░рд╣реЗ рд╣реИрдВ ред
рд╕реНрдерд╛рдкрдирд╛ рдХреЗ рдмрд╛рдж, рдХреНрдпреВрдЯреА рдирд┐рд░реНрдорд╛рддрд╛ рдЙрдмрдВрдЯреВ рд╕реЗ рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рдХрд╛рд╕ рдЙрдкрдХрд░рдг рдФрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд▓рд┐рдП рдШрдЯрдХреЛрдВ рдХреЗ рдПрдХ рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рдЙрдкрд▓рдмреНрдз рд╣реЛрдЧрд╛ред рдореИрдВ рд╕рд╛рдЗрдЯ рдкрд░ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкрд░рд┐рдЪрд┐рдд рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ ред
рдореИрдВрдиреЗ рдЕрдзрд┐рдХ рд▓рдЪреАрд▓реЗрдкрди рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдХреНрдпреВрдЯреА рдХреНрд╡рд┐рдХ 2 рдПрдкреНрд▓реАрдХреЗрд╢рди рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдпрд╛ред рдЖрдк рдХреЛрдб рдХреЛ main.qml рдореЗрдВ рдХреЙрдкреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВред QQmlComponent рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯ : рдШрдЯрдХ рддреИрдпрд╛рд░ рдирд╣реАрдВ рд╣реИ рдХрдВрд╕реЛрд▓ рдПрдХ рдЫреЛрдЯрд╛ рдмрдЧ рд╣реИ , рд▓реЗрдХрд┐рди SDK рдЕрднреА рднреА рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣реИред

рдкреНрд░рд╛рдзрд┐рдХрд░рдг


рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЪрд░рдг 2 рдореЗрдВ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд░рдг : рдЕрдкрдирд╛ рдЖрд╡реЗрджрди рдкрдВрдЬреАрдХреГрдд рдХрд░реЗрдВ
рд╣рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдкреГрд╖реНрда рджрд┐рдЦрд╛рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред QML рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдЖрд╕рдкрд╛рд╕ рд╣реИ рдФрд░ рдПрдХ рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдореИрдВрдиреЗ qml-google-рдЯрд╛рд╕реНрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗ рдХреЛрдб рд▓рд┐рдпрд╛ред рджреЛ GoogleOuth.qml рдлрд╝рд╛рдЗрд▓реЗрдВ рдкреНрд░рд╛рдзрд┐рдХрд░рдг - рдЬреАрдпреВрдЖрдИ рдФрд░ google_oauth.js - рддрд░реНрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреА рд╣реИрдВред
QtQuick 2 рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдФрд░ рдЙрдмрдВрдЯреВ рдХреЗ рдШрдЯрдХреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХреАрдХрд░рдг рдХреЗ рд▓рд┐рдП GoogleOuth.qml рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реЗрдВ ред
рдХреЛрдб
import QtQuick 2.0 import QtWebKit 3.0 import Ubuntu.Components 0.1 import "google_oauth.js" as OAuth Page { id: google_oauth title: i18n.tr("Login") anchors.fill: parent property string oauth_link: "https://accounts.google.com/o/oauth2/auth?" + "client_id=" + OAuth.client_id + "&redirect_uri=" + OAuth.redirect_uri + "&response_type=code" + "&scope=https://www.googleapis.com/auth/tasks" + "&access_type=offline" + "&approval_prompt=force" property bool authorized: accessToken != "" property string accessToken: "" property string refreshToken: "" signal loginDone(); onAccessTokenChanged: { console.log('onAccessTokenChanged'); if(accessToken != ''){ console.log("accessToken = ", accessToken) loginDone(); } } function login(){ loginView.url = oauth_link } function refreshAccessToken(refresh_token){ OAuth.refreshAccessToken(refresh_token) } Flickable { id: web_view_window property bool loading: false anchors.fill: parent WebView { id: loginView anchors.fill: parent onUrlChanged: OAuth.urlChanged(url) } } } 

Google_oauth.js рдореЗрдВ рд╣рдо рдХрдВрд╕реЛрд▓ рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЗ рд▓рд┐рдП client_id client_secret рдФрд░ redirect_uri рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВред
рд╣рдо GoogleOuth.qml рдХреЛрдб рдХреЛ рдереЛрдбрд╝рд╛ рдмрджрд▓рдХрд░ рдХрд╛рдо рдХреА рдЬрд╛рдБрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
рдХреЛрдб
 import QtQuick 2.0 import QtWebKit 3.0 import Ubuntu.Components 0.1 import "google_oauth.js" as OAuth Page { id: google_oauth title: i18n.tr("Login") anchors.fill: parent property string oauth_link: "https://accounts.google.com/o/oauth2/auth?" + "client_id=" + OAuth.client_id + "&redirect_uri=" + OAuth.redirect_uri + "&response_type=code" + "&scope=https://www.googleapis.com/auth/tasks" + "&access_type=offline" + "&approval_prompt=force" property bool authorized: accessToken != "" property string accessToken: "" property string refreshToken: "" signal loginDone(); onAccessTokenChanged: { console.log('onAccessTokenChanged'); if(accessToken != ''){ console.log("accessToken = ", accessToken) loginDone(); } } function login(){ loginView.url = oauth_link } function refreshAccessToken(refresh_token){ OAuth.refreshAccessToken(refresh_token) } Flickable { id: web_view_window property bool loading: false //anchors.fill: parent //  width: 800 height: 800 WebView { id: loginView anchors.fill: parent onUrlChanged: OAuth.urlChanged(url) } } //  Component.onCompleted: { console.log("onCompleted") login() } } 

рдФрд░ qmlscene рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, GoogleOuth.qml рдлрд╝рд╛рдЗрд▓ (рдХреНрдпреВрдЯреА рдирд┐рд░реНрдорд╛рддрд╛ рдореЗрдВ рдпрд╣ рдореЗрдиреВ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИ: рдЙрдкрдХрд░рдг > рдмрд╛рд╣рд░реА > рдХреНрдпреВрдЯреА рдХреНрд╡рд┐рдХ > рдХреНрдпреВрдЯреА рдХреНрд╡рд┐рдХ 2 рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди , рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЦреБрд▓реА рд╣реБрдИ рдлрд╝рд╛рдЗрд▓ рд▓реЙрдиреНрдЪ рдХрд░рддрд╛ рд╣реИ)
рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рдмрд╛рдж, рд▓реЙрдЧ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрдВрдХреНрддрд┐рдпрд╛рдБ рджрд┐рдЦрд╛рдИ рджреЗрдиреА рдЪрд╛рд╣рд┐рдП:
onAccessTokenChanged
accessToken = xxxx.xxxxxxxxxxxxxxxxxxxxxxxxxxxx

рдиреЗрд╡рд┐рдЧреЗрд╢рди

рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рд░реВрдк рд╕реЗ, рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдПрдХ MainView рдкреЗрдЬ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реИ , рдЬреЛ рдПрдВрдбреНрд░реЙрдЗрдб рдореЗрдВ рдЯреБрдХрдбрд╝реЛрдВ рдХреЗ рд╕рдорд╛рди рд╣реИред рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рдкреЗрдЬ рдмрдирд╛рдпрд╛, main.qml рдореЗрдВ рдкреЗрдЬрд╕реНрдЯреИрдХ, рдкреЗрдЬреЛрдВ рдХреЗ рдмреАрдЪ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдФрд░ рд╕реНрд╡рд┐рдЪрд┐рдВрдЧ рдкреЗрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдмрдирд╛ рд░рд╣рд╛ред
рдХреЛрдб
 import QtQuick 2.0 import Ubuntu.Components 0.1 import "tasks_data_manager.js" as TasksDataManager MainView { objectName: "mainView" applicationName: "UTasks" id: root width: units.gu(60) height: units.gu(80) PageStack { id: pageStack Component.onCompleted: push(taskLists) //   TaskLists { id: taskLists visible: false onItemClicked: { var item = taskLists.curItem console.log("onItemClicked: ", item) tasks.title = item["title"] TasksDataManager.getMyTasks(item["id"]) pageStack.push(tasks) } } //    Tasks { id: tasks visible: false } //    GoogleOAuth { id: google_oauth visible: false onLoginDone: { pageStack.clear() pageStack.push(taskLists) console.log("Login Done") //tasks.refreshToken = refreshToken settings.setValueFor("accessToken", accessToken) settings.setValueFor("refreshToken", refreshToken) TasksDataManager.getMyTaskLists() } } } //       Component.onCompleted: { console.log("onCompleted") if (settings.getValueFor("refreshToken") === "") { pageStack.push(google_oauth) console.log("google_oauth") google_oauth.login() } else { pageStack.push(taskLists) google_oauth.refreshAccessToken(settings.getValueFor("refreshToken")) } } } 



рдкрд░рд┐рд░рдХреНрд╖рдг

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХрд╛ рдЕрдиреБрд░реЛрдз рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рд░ рдмрд╛рд░ рдЯреЛрдХрди рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред QML 2 рдореЗрдВ, SQLite рдХреЗ рд╕рд╛рде рдХрд╛рдо рдЙрдкрд▓рдмреНрдз рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдкрдВрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП, рдореИрдВ SQL рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдореИрдВрдиреЗ рдПрдХ рдЫреЛрдЯрд╛ C ++ рдХреНрд▓рд╛рд╕ рдЯрд╛рд╕реНрдХрд╕реЗрдЯрд┐рдВрдЧ рд▓рд┐рдЦрд╛ - QSettings рдкрд░ рдПрдХ рд░реИрдкрд░ред C ++ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде QML рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ Q_INVOKABLE рдХреЗ рд░реВрдк рдореЗрдВ рдХреЙрд▓ рдХреА рдЧрдИ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛:
 viewer.rootContext()->setContextProperty("settings", &settings); 

рдЙрд╕рдХреЗ рдмрд╛рдж, QML рдореЗрдВ, рдЖрдк getValueFor рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдорд╛рди рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП ValueFor рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
 settings.setValueFor("refreshToken", refreshToken) if (settings.getValueFor("refreshToken") === "") { 


рдХрд╛рд░реНрдп рд╕реВрдЪреА


рдЗрдВрдЯрд░рдлрд╝реЗрд╕ TaskLists.qml рд╣реИ ред
Ubuntu рд╕реЗ ListItems рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рд╕рд░рд▓ рд╕реВрдЪреА рджреГрд╢реНрдп
рдХреЛрдб
 import QtQuick 2.0 import QtQuick.XmlListModel 2.0 import Ubuntu.Components 0.1 import Ubuntu.Components.ListItems 0.1 import Ubuntu.Components.Popups 0.1 Page { id: taskLists title: i18n.tr("Lists") anchors.fill: parent ListModel { id: taskListsModel ListElement { title: "My" } } Flickable { id: flickable anchors.fill: parent ListView {// id: taskListsView model: taskListsModel anchors.fill: parent delegate: Standard { text: title //    progression: true //  onClicked: { console.log("index: ", index); taskListsView.currentIndex = index curItem = taskListsModel.get(index) itemClicked() } } } } } 

рдХрд╛рд░реНрдп рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рддрд░реНрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ_рдбреЗрдЯрд╛_рдордирдЧрд░ ред Js , рд╣рдореЗрдВ getMyTaskLists () рдлрд╝рдВрдХреНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред Onload рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдЗрд╕рдореЗрдВ рдмрджрд▓реЗрдВ
 taskLists.itemsList = result["items"]; 

TaskLists.qml рдореЗрдВ рд╣рдо рддрддреНрд╡реЛрдВ рдХреА рд╕реВрдЪреА рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреЗ рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░рддреЗ рд╣реИрдВ:
  property variant itemsList; signal itemClicked(); onItemsListChanged: { taskListsModel.clear() if(itemsList === undefined) return for(var i = 0; i < itemsList.length; ++i) { console.log("append:", itemsList[i]["title"], itemsList[i]["id"]); var item = itemsList[i] taskListsModel.append( item ); //    } } 

рдФрд░ рдЕрдВрдд рдореЗрдВ, рд╕реВрдЪреА рдЖрдЗрдЯрдо рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реИрдВрдбрд▓рд░ рдЬреЛрдбрд╝реЗрдВ
 property variant curItem; onClicked: { console.log("index: ", index); taskListsView.currentIndex = index curItem = taskListsModel.get(index) itemClicked() } 

рдЬрдм рдЖрдк рдХрд┐рд╕реА рддрддреНрд╡ рдХреЛ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ main.qml рдореЗрдВ рд╣рдо рд╕реВрдЪреА рдореЗрдВ рд╕реНрд╡рд┐рдЪ рдХрд░рдирд╛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ
 onItemClicked: { var item = taskLists.curItem console.log("onItemClicked: ", item) tasks.title = item["title"] TasksDataManager.getMyTasks(item["id"]) pageStack.push(tasks) } 


рдХрд╛рд░реНрдп рд╕реВрдЪреА рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдирд╛ рд╕реВрдЪреА рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд╕рдорд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХреЛрдб рдХреЛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдбреЗрд╕реНрдХрдЯреЙрдк рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ:





рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП ...

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


All Articles