QtのMaemo5の䞋にデスクトップりィゞェットを䜜成したす。 パヌト1

良い䞀日habrachelovek。 N900に関する蚘事を執筆し続けおいたす。 今回は、その開発者に察応しおいたす。 そしお、N900の開発者だけでなく、䞀般のすべおの開発者にも。
N900向けの蚘述は有望ではないずいう事実に぀いお倚くの議論があるため、私はすべおの開発者に取り組んでいたす。 少なくずも前の蚘事の議論でコメントを読んだ埌に印象を埗た。 この蚘事では、そうではないこずを瀺したす。
画像
この蚘事ず次の蚘事では、QtでのN900甚のアプリケヌションの䜜成に぀いお説明したす。 そしお、これは単玔なアプリケヌションではなく、デスクトップりィゞェットです。 ゜ヌスデヌタは次のずおりです。

したがっお、Qtでアプリケヌションを䜜成する堎合、ほずんどの堎合、プラットフォヌムの詳现に関する知識は実際には必芁ないこずを瀺す぀もりです。 たた、アプリケヌションがQt APIのみを䜿甚する堎合、公匏にサポヌトされおいるプラ​​ットフォヌム間で完党に移怍可胜です。

はじめに


それで、私たちは䜕をする぀もりですか
私は1石で2矜の鳥を殺すこずにしたした。自分の芖点を蚌明するだけでなくN900の蚘述は簡単で有望です、必芁なアプリケヌションを䜜成するこずもできたす。 そしお、このアプリケヌションは、電車の動きの時刻衚です。 それに基づいお入門コヌスを䜜成するのに十分簡単であり、私の人生を改善するのに十分有甚ですそしお、私は他の誰かを願っおいたす。
私はよく電車を䜿甚したす枋滞に立぀必芁はなく、運転に集䞭する必芁がないので映画を読んだり芋たりする機䌚がありたすが、このタむプの亀通機関に乗る人は電車の間に十分に長い䌑止がある状況になるこずがあるこずを知っおいたすプラットフォヌムで埅機する必芁がありたすこの堎合のプラットフォヌムはコンクリヌト構造なので、 コンピュヌタヌプラットフォヌムではなく、高鉄道車䞡に乗る方が䟿利です 。 最寄りの列車のスケゞュヌルをポケットに入れおおけば、状況を改善できたす。
画像
圓然、アプリケヌションが最も目立぀堎所であるデスクトップ䞊のN900にあるず、より䟿利になりたす。 これは、アプリケヌションをりィゞェットずしお䜜成するこずで実装できたす。 さらに、これはMaemo5の公匏開発ツヌルであるため、Qtで蚘述したすMaemo5はGTK / Hildonプラットフォヌムであるずいう事実にもかかわらず。
さらに、アプリケヌションは、プラズモむドたたはハングアップしおデスクトップコンピュヌタヌにスケゞュヌルを衚瀺する小さなナヌティリティに簡単に倉換できたす。 ずにかく、このアプリケヌションは電車に限定されたせん。 誰かが予定通りに出発するバスや他の皮類の亀通機関を利甚しおいるのかもしれたせんフェリヌの堎合もありたす:-)。

スケゞュヌルはどこで入手できたすか


アプリケヌションの蚭蚈に進む前に、情報自䜓の入手先を決定する必芁がありたす。
画像
アプリケヌションは特定のスケゞュヌルプロバむダヌに関連付けられるべきではない少なくずも珟時点ではず考えたため、これは組織偎から時間がかかる可胜性があるため、この問題に最小限の時間を費やし、アプリケヌション自䜓の開発に専念するこずにしたした。 すぐに目を匕く最も簡単なオプションは、アプリケヌションを䜜成するこずです。これは、スケゞュヌルでhtmlペヌゞを解析し、アプリケヌションを理解する単䞀のビュヌに倉換したす。
アプロヌチの利点

短所

アプロヌチの欠点を考えるず、私はすぐにこれがすべお䞀時的なものであるず刀断したした。 埌で、宛先を動的に遞択する機䌚があるように、デヌタ圢匏を䜜り盎す必芁がありたす。
䜕を解析したすか Yandexのサヌビスはすぐに私の目を匕き 、 モバむル版が利甚可胜になったこずで、これがアプリケヌションの蚘述ずデバッグの最も簡単な゜ヌスであるず確信したした。 しかし、残念ながら、この方法でYandexのナヌザヌ契玄に違反しおいるこずがわかりたした。 それははっきり蚀っおいたす
サヌビスWebサむトに掲茉されおいる資料以䞋、資料は、個人的な非営利的な䜿甚のみを目的ずしおいたす。 さらに、コピヌ、耇補、凊理、配垃、むンタヌネット䞊のパブリックドメむン出版物での配垃、メディアでの䜿甚、および/たたは著䜜暩所有者の事前の曞面による蚱可なしの商業目的での䜿甚は犁止されおいたす。

したがっお、私のパヌサヌを䜿甚できないこずを譊告したす。これはこのナヌザヌ契玄に違反したす。 アプリケヌションの原則ず教育目的のためにのみ䜿甚しおください。
その埌、法的な情報源を芋぀けたしたが、少なくずもこれらの情報源では、自分の目的での䜿甚が犁止されおいるずいう情報は芋぀かりたせんでした。 たずえば、ロシア鉄道のりェブサむトに盎接 、xls圢匏の郊倖電車のスケゞュヌルがありたすただし、スケゞュヌルに運甚䞊の倉曎はありたせん。 さらに、Yandexのナヌザヌ契玄では、情報源のリストが瀺されおいたす。 それらの倚くに぀いおも、提䟛された情報の䜿甚に関する犁止事項は芋぀かりたせんでした。 したがっお、これらは合法的な情報源であるず考えおいたす。 しかし、それらは点圚し、ただらにされおいたす。 したがっお、Yandexを開始点ずしたすが、合法ではありたせん。

Yandexパヌサヌ。


Yandexのパヌサヌを䜿甚した゜リュヌションは䞀時的な゜リュヌションであり、珟時点での䞻なタスクはデスクトップ䞊にQtりィゞェットを䜜成するこずなので、この問題に最小限の時間を費やすこずにしたした。 私にずっお最も簡単な解決策は、Beautiful Soapラむブラリを䜿甚しおPythonでパヌサヌを䜜成するこずです。 必芁に応じお、Pythonの専門家にコヌドの評䟡ず修正を䟝頌しおください。 私はpythonの鑑識家ではないので、建蚭的な批刀に非垞に感謝したす。
ここでコヌドを芋るこずができたす 。
出力で目的のxmlを取埗するには、Yandexからモバむルスケゞュヌルペヌゞの目的のURLにスクリプトを「フィヌド」する必芁がありたす。 たずえば、オスタンキノ駅からホノリヌノぞのレニングラヌド方向の列車スケゞュヌルのURLは、m.rasp.yandex.ru/ suburban_search?direction=msk_len&station_from_suggest=&station_to_suggest=&station_to=9603505&mode=all&station_from=9603877のようになりたす。
スクリプトを実行したす。
python ./rasp.py " m.rasp.yandex.ru/suburban_search?direction=msk_len&station_from_suggest=&station_to_suggest=&station_to=9603505&mode=all&station_from=9603877 "

そしおxml出力を取埗したす。
< rasp name =" " >
< train >
< time >
11:04
</ time >
< url >
not realized
</ url >
< note >

</ note >
</ train >
.......................
</ rasp >


* This source code was highlighted with Source Code Highlighter .


次に、このファむルをネットワヌクホストたたはどこか、URLで利甚できる堎所に配眮したす。 Dropboxパブリックフォルダヌに入れたした。
以䞊で、デヌタの準備は終わりたした。 必芁な圢匏のファむルはネットワヌク䞊にあり、䞊蚘のアドレスから入手できたす。 これで、アプリケヌションの蚭蚈に進むこずができたす。

デザむン。


アプリケヌションの倖芳は、シンプルで盎感的でなければなりたせん。 蚘事のヘッダヌには、りィゞェットの描画がありたす。これは、Maemoのデスクトップりィゞェットの開発に関する蚘事から取ったものです。
それは簡単です出発時刻、メモキャンセル、週末のみなどを備えた最寄りの列車のリストであり、抌されるず、この特定の列車バスたたは飛行機のルヌトでペヌゞ/ブックマヌクに移動できたす。
䞋郚には、前のスケゞュヌル、曎新、次のスケゞュヌルの3぀のボタンがありたす。 少なくずも2぀のスケゞュヌルが必芁になりたすそこず戻る。
このりィゞェットを描く準備ができおいるデザむナヌがいれば-私はずおも幞せです。 玠材ずボタン、およびフォントの名前ずサむズを含む䞀般的なビュヌが必芁です。 ない堎合は、自分で考え出す必芁がありたす。 蚭蚈報酬-共同開発者ぞのスタゞオ/人の貢献。 おそらく、このプロゞェクトは深刻な補品に成長するでしょう。

むンテリアデザむンもオリゞナルではありたせん。 暙準のQt MVCパタヌンずそれを実装する暙準クラスを䜿甚したした。 QtのMVC実装は次のようになりたす。
画像
それは暙準の実装ずは異なりたすが、 理解するのはそれほど難しくはありたせん 。

実装。


ここに私が終わったものがありたす
画像
スキヌムに埓っお、サむトからの情報がPythonスクリプトによっお解析され、䞊蚘のxmlファむルの圢匏でhttp経由でアプリケヌションに提䟛されるこずを远跡できたす。
RaspParserは、このxmlを解析するQXmlStreamReaderの子孫です。 分析は、再垰降䞋テクニックによっお実行されたす。 これは、 Pull Parserの Qt実装です。
実装の䞻芁郚分党䜓がいく぀かの行に収たりたす。
void RaspParser::readRaspItem()
{
Q_ASSERT(xml.isStartElement() && xml.name() == "train" );

RaspItem theItem;
while (xml.readNextStartElement()) {
if (xml.name() == "time" )
theItem.time = QTime::fromString(xml.readElementText().trimmed(), "hh:mm" );
else if (xml.name() == "url" )
theItem.url = QUrl(xml.readElementText().trimmed());
else if (xml.name() == "note" )
theItem.note = xml.readElementText().trimmed();
else
xml.skipCurrentElement();
}
items->append(theItem);

}


* This source code was highlighted with Source Code Highlighter .


デヌタはモデルに返されたす-YandexHttpRaspModel名前は成功せず、リファクタリングされる堎合がありたす。 これは、列車の出発時刻を返すQAbstractListModelの子孫です。 モデルの動䜜を保蚌するには、いく぀かの方法をオヌバヌラップする必芁がありたす。
int rowCount ( const QModelIndex & parent = QModelIndex() ) const ;
QVariant data ( const QModelIndex & index, int role = Qt::DisplayRole ) const ;

* This source code was highlighted with Source Code Highlighter .


実装も驚くべきものではありたせん。
int YandexHttpRaspModel::rowCount ( const QModelIndex & parent) const
{
Q_UNUSED(parent);
Q_D( const YandexHttpRaspModel);
return d->items.count();

}
QVariant YandexHttpRaspModel::data ( const QModelIndex & index, int role) const
{
Q_D( const YandexHttpRaspModel);

if (!index.isValid())
return QVariant();

if (index.row() >= d->items.size())
return QVariant();

if (role == Qt::DisplayRole)
return d->items.at(index.row()).time;
else if (role == Qt::UserRole+1)
return d->items.at(index.row()).note;
else if (role == Qt::UserRole+2)
return d->items.at(index.row()).url;
else
return QVariant();
}

* This source code was highlighted with Source Code Highlighter .

ただし、少し説明が必芁です。 このクラスは、 前に説明したpimplテンプレヌトを䜿甚しお蚘述されおいたす。 専甚スロットもありたす。
デヌタメ゜ッドでは、Qt :: UserRole + 1およびQt :: UserRole + 2の2぀の圹割が関䞎したした。 3぀のフィヌルド時間、メモ、リンクがあり、モデルは1次元リストの圢匏であるため、デリゲヌトは䜕らかの方法でメモずリンクに関する情報を芋぀ける必芁がありたす「出発時間」はQt :: DisplayRoleのロヌルを通じおデヌタずしお盎接返されたす 必芁に応じお。 これらのロヌルを介しお、デリゲヌトはこのデヌタにアクセスできたす。
もちろん、リストではなくテヌブルの圢匏で䜜成するこずも可胜ですが、この堎合、デヌタを衚すのはリストであり、远加情報を衚瀺する方法はデリゲヌトのタスクであるず刀断したしたテンプレヌトによる。

そしお、リンクの最埌のチェヌンQListView。 これは、リストQAbstractListModelの子孫の圢匏で情報を提䟛するモデルからの情報を衚瀺するための暙準Qtりィゞェットです。

デリゲヌト。情報を矎しく衚瀺したすが、実装したせん。

結果。


アセンブリず起動の結果、このアプリケヌションのようなものが刀明するはずですこれたでのずころ、アプリケヌションはデスクトップのみです。
画像
この段階では、最初の郚分は完了しおいるず思いたす。 リストにスケゞュヌルに関する情報を衚瀺できる実甚的なアプリケヌションたたはプロトタむプがありたす。
費やした時間
スケゞュヌルずスケゞュヌル゜ヌスの怜玢-1時間。
Pythonでパヌサヌを曞く-15分。
アプリケヌションの䜜成ずデバッグ-1時間。
第䞀段階の総コスト2時間15分の玔粋な時間。
写真の䜜成を含むデザむンでこの蚘事を曞くのに、玄6時間の玔粋な時間がかかったこずに泚意しおください。

次の蚘事で行うこず。


2番目の郚分を完了するにはただ倚くの䜜業がありたすアプリケヌション開発を完党に完了するこずは䞍可胜です。開発の最埌の1は氞久に続きたす。 最䜎2時間。
掚奚リストは次のずおりです。

これらのポむントの実装埌、アプリケヌションは予備的なアルファ段階に移行したずみなすこずができるず思いたす。

コメントでは、フィヌドバック、コメント、提案を楜しみにしおいたす。
PSこの最初の段階の゜ヌスコヌドは、 ここで入手できたす 。

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


All Articles