ãã®æçš¿ã¯ãã³ã³ãã¹ãã
Smart Posts for Smart Posts ãã«åå ããŠããŸã
ã¯ããã«
NFCãšã¯äœã§ããïŒ

ãŠã£ãããã£ã¢ã«ãããšã
NFCïŒè¿è·é¢ç¡ç·
éä¿¡ïŒã¯ãçŽ10ã»ã³ãã®è·é¢ã«ããããã€ã¹éã§ããŒã¿ã亀æã§ããçè·é¢ç¡ç·é«åšæ³¢éä¿¡æè¡ã§ãã
æºåž¯é»è©±ã§ã®
NFCãã¯ãããžãŒã®æãäžè¬çãªçšéã¯3ã€ãããŸãã
ã«ãŒããšãã¥ã¬ãŒã·ã§ã³-é»è©±ã¯ããã¹ãŸãã¯æ¯æãã«ãŒããªã©ã®ã«ãŒãã®ãµããããŸãã
èªã¿åãã¢ãŒã-é»è©±ã¯ãããšãã°ãã€ã³ã¿ã©ã¯ãã£ãåºåã®ããã«ããã·ãã¿ã°ïŒã¿ã°ïŒãèªã¿åããŸãã
P2Pã¢ãŒã-2å°ã®é»è©±ãéä¿¡ããŠæ
å ±ã亀æããŸãã
2çªç®ã®äœ¿ç𿹿³ãã€ãŸãããã·ãã¿ã°ã®èªã¿åããæ€èšããŸããããã«ãé»è©±ã䜿çšããŠãã®ãããªã¿ã°ã®æ
å ±ãèšé²ããæ¹æ³ãåŠç¿ããŸãã
ã¹ããŒãªãŒã¯äœã§ããïŒ
NFCã®æäœæ¹æ³ã ãã§ãªãããã®èšäºã®ããã«ç§ãéçºãããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã«ã€ããŠã説æããŸãã ã€ãŸããèªã¿åãããã»ã¹äžã«ãMeeGo Harmattanã®NFCã¿ã°ãæäœããããã®ã¢ããªã±ãŒã·ã§ã³ãäœæããããã®å®å
šãªæ¹æ³ã䜿çšããŸãã
ç®æ¬¡
æŽæ°ïŒæ¬æ¥ã
2011幎
12æ20æ¥ã
Qt Ambassadorã§ç³è«ãåçããããšããæçŽãå±ããŸãã
æŽæ°ïŒæšå€ããããžã§ã¯ãã¯ããã°ã©ã ã§å
¬éãããŸããïŒ
Qt Ambassador ShowcaseNFCã¿ã°ãšã¯äœã§ããïŒ
NFCã¿ã° -ããã¯ããã·ãã¿ã°ã§ãã åçã¯ã©ã®ããã«èŠãããã®å€èгã瀺ããŠããŸããã€ãŸããååãšããŠããã€ã¯ãããããšãã©ã€ã«ã¢ã³ãããçµã¿èŸŒãŸããåãçŽã§ã§ããã¹ããã«ãŒã§ãã NFCã¿ã°ã«ã¯ããã€ãã®ã¿ã€ãããããæå€§èš±å®¹ããŒã¿ãµã€ãºãã¿ã€ãã«ãã£ãŠç°ãªããŸãã ç§ã¯ã
Qt Developer Days 2011ããæã£ãŠãã192ãã€ãã®ããã€ãã®Type 2ã¿ã°ã®å¹žéãªææè
ã§ãã 192ãã€ãã¯å€ªããããŸããããå®éšã«ã¯ååã§ãã
ããã°ã©ã ããžãã¯
ã¢ããªã±ãŒã·ã§ã³ãNFCã¿ã°ã®åŠçãã€ã³ã¿ãŒã»ãããã
ãããã£ãŠãã¿ã°ã®åŠçãéå§ããã«ã¯ã
QNdefManagerã¯ã©ã¹ã®ãªããžã§ã¯ããå¿
èŠã§ã
NfcManager::NfcManager(QObject *parent) : QObject(parent), m_manager(new QNearFieldManager(this)), m_cachedTarget(0), m_mode(NfcManager::Read) { connect(m_manager, SIGNAL(targetDetected(QNearFieldTarget*)), this, SLOT(targetDetected(QNearFieldTarget*))); connect(m_manager, SIGNAL(targetLost(QNearFieldTarget*)), this, SLOT(targetLost(QNearFieldTarget*))); m_manager->setTargetAccessModes(QNearFieldManager::NdefReadTargetAccess | QNearFieldManager::NdefWriteTargetAccess); }
NfcManagerã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ãŒã§äœæããŠã¿ãŸããããããã¯ãNFCãæäœããããã«äœ¿çšããŸãã ãã®ãªããžã§ã¯ãã®
targetDetectedä¿¡å·ãš
targetLostä¿¡å·ãã¹ãããã«æ¥ç¶ããå¿
èŠããããŸããå®éã«ã¯ãã¿ã°ã¯é»è©±ã®èŠéã«è¡šç€ºãããã€ãã³ãã®ã¡ã€ã³ãã³ãã©ãŒã«ãªããŸãã ã³ã³ã¹ãã©ã¯ã¿ãŒã®3è¡ç®ã§ã¯ãèªã¿åãã¢ãŒããšæžã蟌ã¿ã¢ãŒããèšå®ããŠãã¿ã°ã®èªã¿åãã ãã§ãªãæžã蟌ã¿ãã§ããããã«ããŸãã
ã€ã³ã¿ãŒã»ãã¿ãŒ
次ã«ã説æãããŠããã¹ããããæ€èšããŸãã
void NfcManager::targetDetected(QNearFieldTarget *target) { if (m_cachedTarget) delete m_cachedTarget; m_cachedTarget = target; if (m_mode == Read) readTarget(m_cachedTarget); if (m_mode == Write) writeTarget(m_cachedTarget); }
ã¿ã°ãèŠã€ãã£ãå Žåã
念ã®ãããã¿ã°èªäœãžã®ããã°ã©ã ã€ã³ã¿ãŒãã§ã€ã¹ã§ãã
QNearFieldTargetåã®ãªããžã§ã¯ããžã®ãã€ã³ã¿ãŒãä¿åããŸãã
2ã€ã®æ¡ä»¶ãç¶ããã¢ãŒãïŒèªã¿åããŸãã¯æžã蟌ã¿ïŒã«å¿ããŠã察å¿ããåŠçã¡ãœãããåŒã³åºããŸãã çŸããã¢ãŒããã¯ãã£ã®èгç¹ããèŠããšãããã¯æè¯ã®è§£æ±ºçã§ã¯ãããŸããããã³ãŒããè€éã«ããªãããã«æå³çã«è¡ããŸããã
void NfcManager::targetLost(QNearFieldTarget *target) { m_cachedTarget = 0; target->deleteLater(); }
ã¿ã°ã倱ããããšã䜿ãæãããããªãœãŒã¹ãè§£æŸãããŸãã
èªæž
次ã«ãã¿ã°ã®èªã¿åãæ¹æ³ãèŠãŠã¿ãŸãããã
void NfcManager::readTarget(QNearFieldTarget *target) { connect(target, SIGNAL(error(QNearFieldTarget::Error,QNearFieldTarget::RequestId)), this, SLOT(errorHandler(QNearFieldTarget::Error,QNearFieldTarget::RequestId))); connect(target, SIGNAL(ndefMessageRead(QNdefMessage)), this, SLOT(readRecords(QNdefMessage))); target->readNdefMessages(); }
èªã¿åãã¯éåæã¢ãŒãã§è¡ãããããããã®æ¹æ³ã§ã¯ããšã©ãŒåŠçä¿¡å·ãšèªã¿åãå®äºä¿¡å·ãæ¥ç¶ããŸããèªã¿åãå®äºä¿¡å·ã¯ãèªã¿åãããšã©ãŒãªãã§çºçããå Žåã«ã®ã¿åŒã³åºãããŸãã
ãã®åŸãã¡ãœãããåŒã³åºããŠèªã¿åããŸãã
void NfcManager::readRecords(const QNdefMessage &message) { if (message.isEmpty()) return; QNdefRecord record = message.at(0);
èªã¿åããæåããå Žåããã®ã¹ãããã«ç§»åããã¿ã°ã«ååšãããšã³ããªã®ãªã¹ãããæåã®ã¬ã³ãŒããååŸããŸãã
ã¯ãã仿§ã«ãããšãã¿ã°ã«ã¯è€æ°ã®ã¬ã³ãŒããå«ããããšãã§ããŸãããããã¥ã¡ã³ãã«èšèŒãããŠããããã«ã
Symbianãš
Harmattanã§ã¯ 1ã€ã®ã¬ã³ãŒãã®ã¿ãèªã¿æžãã§ããŸãã
void NfcManager::readRecord(const QtMobility::QNdefRecord &record) { DataContainer *result = 0; if (record.isRecordType<QNdefNfcUriRecord>()) { QNdefNfcUriRecord uriRecord(record); result = new UriDataContainer(uriRecord.payload(), uriRecord.uri().toString()); } else if (record.isRecordType<QNdefNfcTextRecord>()) { QNdefNfcTextRecord textRecord(record); result = new TextDataContainer(textRecord.payload(), textRecord.text()); } else if (record.isRecordType<NdefNfcSmartPosterRecord>()) { NdefNfcSmartPosterRecord smartPosterRecord(record); result = new SmartPosterDataContainer(smartPosterRecord.payload(), smartPosterRecord.uri().toString(), smartPosterRecord.title()); } else { result = new DataContainer(record.payload()); } emit tagReadFinished(result); }
ãããŠãè£å©ã¡ãœããã®ããã€ãã®ç§»è¡ã®åŸãæãéèŠãªã¡ãœããã«å°éããŸããããã®ã¡ãœããã¯ãã¿ã°ã«ãšã³ã³ãŒããããæ
å ±ã䜿ãæ
£ããæåã«å€æããŸãã
çŸæç¹ã§ã¯ã
Qt Mobilityã¯ããã«äœ¿çšã§ããã®ã§ããªã³ã¯ïŒ
Uri ïŒãšããã¹ãïŒ
Text ïŒã®2çš®é¡ã®ã¬ã³ãŒãã®ã¿ããµããŒãããŠããŸãã3çªç®ã®çš®é¡ã§ãã
ã¹ããŒããã¹ã¿ãŒã«æ»ããŸãã
ã芧ã®ãšãããã¬ã³ãŒãã®ããŒã¿ã¯ããã«æ°ãããªããžã§ã¯ãã«é
眮ãããŸãããããã¯ã
QMLã§ã®ããŒã¿è»¢éã容æã«ããããã«ç¹å¥ã«äœæããåçŽãªãªããžã§ã¯ãã§ã
æåŸã«ãããŒã¿ãæã€ãªããžã§ã¯ããå«ãä¿¡å·ãåŒã³åºãããŸãã å°æ¥ããã®ä¿¡å·ãQMLã§ãã£ããããŸãã
èšé²
void NfcManager::setDataForWrite(const QString &text, const QString &uri) { m_textForWrite = text; m_uriForWrite = uri; }
ãã®ã¡ãœããã¯ãæ°ããUriãTextã®å€ãèšå®ããããã«ãæžã蟌ã¿ã詊ã¿ãåã«åŒã³åºãå¿
èŠããããŸãã ã¿ã°ã§åŒã³åºããªãå Žåã以åã®ããŒã¿ãæžã蟌ãŸããŸãïŒãã®ã¢ãããŒãã¯ãåãã¿ã€ãã®ã¿ã°ãããããæžãå¿
èŠãããå Žåã«äŸ¿å©ã§ãïŒ
void NfcManager::writeTarget(QNearFieldTarget *target) { if (m_textForWrite.isEmpty() && m_uriForWrite.isEmpty()) return; m_cachedTarget = target; QNdefMessage message; if (!m_textForWrite.isEmpty() && !m_uriForWrite.isEmpty()) { NdefNfcSmartPosterRecord smartPosterRecord; smartPosterRecord.setTitle(m_textForWrite); smartPosterRecord.setUri(QUrl(m_uriForWrite)); message.append(smartPosterRecord); } else if (!m_textForWrite.isEmpty()) { QNdefNfcTextRecord textRecord; textRecord.setText(m_textForWrite); message.append(textRecord); } else { QNdefNfcUriRecord uriRecord; uriRecord.setUri(QUrl(m_uriForWrite)); message.append(uriRecord); } connect(target, SIGNAL(error(QNearFieldTarget::Error,QNearFieldTarget::RequestId)), this, SLOT(errorHandler(QNearFieldTarget::Error,QNearFieldTarget::RequestId))); connect(target, SIGNAL(ndefMessagesWritten()), this, SIGNAL(tagWriteFinished())); target->writeNdefMessages(QList<QNdefMessage>() << message); }
ã¡ã€ã³ã®æžãèŸŒã¿æ¹æ³ã¯ãèªã¿åãæ¹æ³ã»ã©è€éã§ã¯ãããŸããã æ¡ä»¶ãããã¯ã§ã¯ãåã«ã¬ã³ãŒãã®ã¿ã€ããéžæããŸãã UriãŸãã¯Textã®ã¿ãååšããå Žåã察å¿ããã¿ã€ããäœæãããäž¡æ¹ã®ãã£ãŒã«ããå
¥åããããšãã¹ããŒããã¹ã¿ãŒã¿ã€ãã®ã¬ã³ãŒããäœæãããŸãã
ãã®åŸããšã©ãŒãã³ãã©ã忥ç¶ããŸãã ãã ããããã¯ãšã³ãã§ã¯èªã¿åãã®æ£åžžãªå®äºãåŠçããããã®ããžãã¯ã¯å¿
èŠãªããããã·ã°ãã«ãã·ã°ãã«ã«è»¢éããŸããããã¯åŸã§QMLã§ãã£ããããŸãã
ã¹ããŒããã¹ã¿ãŒãããã¯äœã§ããïŒ
ãã®ãããã¹ããŒããã¹ã¿ãŒã¯ç¹æ®ãªã¿ã€ãã®NFCèšé²ã§ããããªã³ã¯ãããã¹ãèŠåºãïŒè€æ°ã®èšèªïŒã
jpegãŸãã¯
png圢åŒã®ã°ã©ãã£ãã¯ã¢ã€ã³ã³ãããã«ã¯mpeg圢åŒã®ã¢ãã¡ãŒã·ã§ã³ã¢ã€ã³ã³ã®äž¡æ¹ãå«ããããšãã§ããŸãã
ããã«ãããã«2ã€ã®ãã£ãŒã«ããååšããå ŽåããããŸãã
ã¢ã¯ã·ã§ã³ -uriRecordãåŠçããããã«ã©ã®ã¢ããªã±ãŒã·ã§ã³ãšã©ã®ããã«éãããé»è©±ã«äŒããŸã
ãµã€ãº -ããŠã³ããŒãããã³ã³ãã³ãã®ãµã€ãºãåç
§ã«ãã£ãŠè¡šç€ºããåçŽãªæŽæ°ã
ã¹ããŒããã¹ã¿ãŒã®ã¯ã©ã¹ãæžã
以äžã«ãã¹ããŒããã¹ã¿ãŒã¬ã³ãŒãã®ã¿ã€ããäœæããäŸã
䜿çšã㊠ãç¬èªã®
NDEFã¬ã³ãŒãã¿ã€ã
ãäœæããæ¹æ³ã説æããŸãã
ããã«ç§ã®ã¿ã€ããç°¡ç¥åãããããã«äºçŽããŠãã ããã ã¢ã¯ã·ã§ã³ããµã€ãºãã¢ã€ã³ã³ã®ãããããµããŒãããŠããŸããããããã¹ããšãªã³ã¯ãåæã«ä¿åã§ããŸãã
ã¹ããŒããã¹ã¿ãŒã¯ã©ã¹ã®çºè¡šã¯æ¬¡ã®ããã«ãªããŸãã
class NdefNfcSmartPosterRecord : public QNdefRecord { public: Q_DECLARE_NDEF_RECORD(NdefNfcSmartPosterRecord, QNdefRecord::NfcRtd, "Sp", QByteArray()) void setTitle(const QString &title, const QString &locale = "en"); void setUri(const QUrl &uri); QString title(const QString &locale = "en") const; QUrl uri() const;
ãã®ãããQt Mobilityã®éçºè
ã¯ãç§ãã¡ãäœã¿ãããããã«ãã§ã«äžè©±ãããŠããããã¹ãŠã®å€§ãŸããªäœæ¥ãè¡ã2ã€ã®ç¹å¥ãªãã¯ããäœæããŠããŸãã
ãã¯ãã®ãã©ã¡ãŒã¿ãŒã¯æ¬¡ã®ãšããã§ããã¯ã©ã¹åãã¬ã³ãŒãã¿ã€ãïŒã¹ããŒããã¹ã¿ãŒã®å Žåã¯
QNdefRecord :: NfcRtd ïŒããã³ãã¿ã€ãåã-ã¿ã°ã§ã®èªèã®çç¥åœ¢ã ãŸãã
Q_DECLARE_NDEF_RECORDã®æåŸã®ãã©ã¡ãŒã¿ãŒã¯ãåæããŒã¿åæåã®ããŒã¿ã§ãããã®å Žåã空ã®ãã€ãé
åã§ãã
次ã«ãèªã¿åãããã³æžã蟌ã¿ã¡ãœããã®å®è£
ãèŠãŠã¿ãŸãããã
ã¬ã³ãŒãã®è§£æãããéšåãä¿åããããã®åçŽãªæ§é ïŒ
struct RecordPart { enum Type { Uri, Text, Action, Icon, Size, Unknown }; Type type; QString text; QString locale;
ãŸããèªã¿åãæ¹æ³ãæ€èšããŸãã
static const char * const abbreviations[] = { 0, "http://www.", "https://www.", "http://",
仿§ã§ãµããŒããããŠããããŸããŸãª
URIãã¬ãã£ãã¯ã¹ã®é
åã
QUrl NdefNfcSmartPosterRecord::uri() const { const QByteArray p = payload(); if (p.isEmpty()) return QUrl(); if (p.isEmpty()) return QString(); int offset = 0; QString uri; while (offset < p.size()) { RecordPart part = readPart(offset); if (part.type == RecordPart::Uri) { if (part.prefix > 0 && part.prefix < (sizeof(abbreviations) / sizeof(*abbreviations))) uri = QString(abbreviations[part.prefix]) + part.text; } } if (uri.isEmpty()) return QUrl(); return QUrl(uri); }
uriã®èªã¿åãæ¹æ³ã¯äžèŠéåžžã«åçŽã§ããã¬ã³ãŒãããèªã¿åã£ããã¹ãŠã®ãã€ãã
pã«ããŒãããUriåã®éšåãèŠã€ãããŸã§é
åå
ã®éšåãèªã¿åããŸãïŒä»æ§ã§ã¯ã1ã€ã®ã¿ååšã§ããŸãïŒ
ãéæ³ã®ã
readPartã¡ãœããã«ã€ããŠã¯ã以äžã§èª¬æããŸãã
QString NdefNfcSmartPosterRecord::title(const QString &locale) const { const QByteArray p = payload(); if (p.isEmpty()) return QString(); int offset = 0; QMap<QString, QString> title; while (offset < p.size()) { RecordPart part = readPart(offset); if (part.type == RecordPart::Text) { title.insert(part.locale, part.text); } } if (title.isEmpty()) return QString(); if (title.contains(locale)) return title.value(locale); if (title.contains("en")) return title.value("en"); return title.constBegin().value(); }
ã¿ã€ãã«ã®æ¹æ³ã¯ãç°ãªãèšèªã§å€ãã®ã¿ã€ãã«ãååšã§ãã
ãšããç¹ã§ã®ã¿ç°ãªããŸãã ãããã£ãŠãæåã«ãã¹ãŠãéžæããŠãããæ£ãããã®ãèŠã€ããããšããŸãã
ãã¹ãŠã®éæ³ã¯readPartã¡ãœããã§çºçããŸãããã®ã¡ãœããã¯ãå
éšèšé²åœ¢åŒãã·ã³ãã«ã§ãããããã
RecordPartæ§é ã«
倿ããŸã
RecordPart NdefNfcSmartPosterRecord::readPart(int &offset) const { RecordPart result; const QByteArray p = payload(); .....
åãããã¯ã®ã¿ã€ãã«ã¯ä»¥äžã§æ§æãããŠããŸãïŒ
1ãã€ãããã¯ãã«ã«ãã©ã°ãç°¡ç¥åãããã¯ã©ã¹ã§ã¯ãæŽåæ§ãªã©ããã§ãã¯ããªãããããã®ãã€ããã¹ãããããŸãã
2ãã€ãã ãã¿ã€ãåããå«ãã¹ããªã³ã°é·ã
3ãã€ããæ
å ±ãå«ãã¡ã€ã³ãã£ãŒã«ãã®é·ãã
4-nãã€ãã ãã¿ã€ãåãã®æåå-æååã¿ã€ãèå¥åãããã¹ãã®å Žåã¯ãTãããŠãªã®å Žåã¯ãUã
次ã¯ã¡ã€ã³ããŒã¿ãããã¯ã§ãã
ãŠãªã®å Žåããããã¯2ã€ã®ãã£ãŒã«ãã«ãããŸãã
äžèšã®é
åã®ã»ãããªã³ã¯æ¬äœãžã®ãã¹ãŠã®ãã¬ãã£ãã¯ã¹çªå·ããšã«1ãã€ãã
ããã¹ãã®å Žåããããã¯3ã€ã®ãã£ãŒã«ãã§ãã
远å ã®ãã©ã°ãšãã±ãŒã«ã®é·ããå«ã1ãã€ãã®ã¹ããŒã¿ã¹ãã£ãŒã«ãã
ã
en ããã
ru-RU ããªã©ã®ãã±ãŒã«æåå
ãããŠãå®éã«ã¯ãããã¹ãèªäœã
ãã®ã¡ãœããã¯ãé宿°ã®åç
§ã«ãã£ãŠãªãã»ãããååŸãã倿Žãããããã«ãŒãå
ã§ããã¬ã³ãŒãããå¥ã®ã¬ã³ãŒãã«ç§»åã§ããããšã«æ³šæããŠãã ããã
次ã«ãé²é³æ¹æ³ã«ã€ããŠèª¬æããŸãã ç°¡åã«ããããã«ã
setUriã®ã¿ãèæ
®ããŸãã ã¿ã€ãã«ã®ã¡ãœããã¯æ¯èŒçåãã§ãã
void NdefNfcSmartPosterRecord::setUri(const QUrl &uri) {
ã€ã³ã¹ããŒã«æ¹æ³ã®è€éãã¯ãSmart Posterã®äžéšïŒããã¹ããªã©ïŒãæ¢ã«ã€ã³ã¹ããŒã«ãããŠããå Žåãèæ
®ããå¿
èŠãããããšã§ãããŸããä»åºŠã¯Uriãã€ã³ã¹ããŒã«ããå¿
èŠããããŸãã ããã¯ãå€ããã€ããŒããä¿åããŠæ°ãããã€ããŒãã远å ããå¿
èŠãããããšãæå³ããŸãã 2ã€ã®
QByteArrayãé£çµããŠãåé¡ã¯ãªãããã«èŠããŸãããããã§ã¯ãã©ã°ä»ãã®æåã®ãã€ãã
äœçšããŸããäºå®ãæ°ãããã®ã远å ãããšãã«æåã®éšåïŒ
MB ïŒã®ãã©ã°ã倿Žããå¿
èŠããããŸãã
ãã®ã³ãŒãè¡ã¯ãããè¡ããŸãïŒ
ã芧ã®ãšãããæ°ããããŒããå€ãããŒãã®åã«è¿œå ããåŸã«ã¯è¿œå ããŸããã ããã¯ãæåŸã«è¿œå ããå ŽåãæåŸã®éšåã®ãã©ã°ãšãã®å€æŽïŒ
ME ïŒãæ€çŽ¢ããå¿
èŠãããããã§ãã
å€ããã€ããŒããåé¿ããå¿
èŠããããŸãã
ããã¯ãã¹ãŠãã¹ããŒããã¹ã¿ãŒãšäžè¬çãªNFCã«ã€ããŠã§ãã
ããã°ã©ã ã€ã³ã¿ãŒãã§ãŒã¹
Pageããã³PageStack
QMLã®ã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ã®äž»ãªã¢ã€ãã¢ã¯ããã¥ãŒå
ã®ç»é¢ãåãæ¿ããããšã§ãã Qtã³ã³ããŒãã³ãã«é¢ããŠã¯ãç»é¢ã¯ããŒãžãšåŒã°ããã¡ã€ã³ã³ã³ããã¯ãŠã£ã³ããŠã§ãã
import QtQuick 1.1 import com.nokia.meego 1.0 PageStackWindow { id: appWindow initialPage: mainPage MainPage { id: mainPage } }
main.qmlã¯ããã«ã³ã³ãããŠã£ã³ããŠãäœæããã¡ã€ã³ããŒãžãåæåããŒãžãšããŠæå®ãããŸãã
Page { id: mainPage ..... Header { id: header anchors { top: parent.top right: parent.right left: parent.left } } .....
ããã¯ããŒãžã®èª¬æã§ãã ãšããã§ãæ°ãã€ãããªããããã¢ã®ãã¹ãŠã®æšæºã¢ããªã±ãŒã·ã§ã³ã«ã¯ããããªè²ã®ããããŒããããŸãã
UIã¬ã€ãã©ã€ã³ã®ã©ãã§ã䜿çšããããšãæšå¥šããŠããã«ããããããããã®ããããŒã«ã¯æšæºã³ã³ããŒãã³ãã¯ãããŸããã
ããŒãžéãç§»åããã«ã¯ãã¿ã€ã
PageStackã®ãªããžã§ã¯ã
ã䜿çšãã ããã¹ãŠã®ããŒãžã«ã¯
pageStackãšããååã®ãã®ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãžã®ãã€ã³ã¿ãŒããããŸãã ãããã£ãŠãæ°ããããŒãžã«ç§»åããã«ã¯ãæ¬¡ã®æ§é ã䜿çšããå¿
èŠããããŸã
pageStack.push(Qt.resolvedUrl("NewPage.qml"))
åã®ãã®ã«æ»ãã«ã¯ïŒ
pageStack.pop()
ãšããã§ãpopã¡ãœããã«ç¹å®ã®ããŒãžã®èå¥åãèšå®ãããšãããŒãžã«æ»ãã ãã§ãªããã¹ã¿ãã¯äžã®ä»»æã®ããŒãžã«æ»ãããšãã§ããŸãã
ãªã¹ããã¥ãŒ

ã¡ã€ã³ç»é¢ã§ãå®è¡å¯èœãªã¢ã¯ã·ã§ã³ã®ãªã¹ãã確èªã§ããŸããåæ§ã®ãªã¹ããæ¬¡ã®ããã«å®è¡ãããŸãã
ListView { id: actionList .... delegate: ListDelegate { anchors { left : parent.left leftMargin: 20 } onClicked: { pageStack.push(Qt.resolvedUrl(model.source)) } MoreIndicator { anchors { verticalCenter: parent.verticalCenter right: parent.right rightMargin: 30 } } } model: ListModel { ListElement { title: "Read Tag" subtitle: "" source: "ReadPage.qml" } ...... } }
ListViewèŠçŽ ã¯å®éã®ãªã¹ãèªäœã§ããã2ã€ã®éèŠãªããããã£ããããŸãã
ããªã²ãŒãã¯1ã€ã®ãªã¹ãã¢ã€ãã ãã¬ã³ããªã³ã°ããããã®ããªã²ãŒãã§ããã
ã¢ãã«ã¯ãªã¹ãã®ããŒã¿ã¢ãã«ã§ãã
com.nokia.extrasããã±ãŒãžã«ã¯ãåçŽãªããªã²ãŒããäœæããããã®æ¢è£œã®
ListDelegateã³ã³ããŒãã³ããå«ãŸããŠããŸãã
ListModelèŠçŽ ã䜿çšãããšãåçŽãªããŒã¿ã¢ãã«ãæå®ã§ããŸãã ãŸãã
ListElementã¯ãã®ã¢ãã«ã®1ã€ã®ã¬ã³ãŒãã«ãããŸããã
ããŒã«ããŒ

ããŸããŸãªã¢ã¯ã·ã§ã³ã®ããã«ãã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ã«ã¯ã¢ã€ã³ã³ä»ãã®
ããŒã«ããŒããããŸããç§ã®ã¢ããªã±ãŒã·ã§ã³ã¯ã·ã³ãã«ã§ãå
éšããŒãžã®ããŒã«ããŒã«ã¯æ»ããã¿ã³ãããããŸãã
Page { id: readPage ..... tools: ToolBarLayout { ToolIcon { iconId: "toolbar-back" onClicked: { pageStack.pop() } } } .....
ããŒã«ããŒãããŒãžã«æ¥ç¶ããã«ã¯ãããã©ã«ãã§
nullã§ãã
toolsããããã£ã«ããŒã«ããŒãå²ãåœãŠãå¿
èŠããã
ãŸãã©ãã«ãšããã¹ããã£ãŒã«ã

ããã¹ãã衚瀺ããã«ã¯ã
Labelã³ã³ããŒãã³ãã䜿çšã§ããŸããããã¯ãæšæºã®
TextèŠçŽ ã®å®ååãããã©ãããŒã«ãããŸããã
Label { id: touchLabel ..... font.pixelSize: 60 text: qsTr("Touch a tag") }

ãŸããå
¥åãã£ãŒã«ãã«ã¯
TextFieldã䜿çšããå¿
èŠããã
ãŸã -ããã¯æšæºã®
TextInputã®é«åºŠãªã©ãããŒã§ã
TextField { id: textEdit ..... placeholderText: qsTr("Text") text: "yandex" }
ã€ã³ãã©ãããŒ

ã¿ã°ã®èªã¿åã/æžã蟌ã¿äžã«ãšã©ãŒãçºçããå Žåãäœããã®æ¹æ³ã§ãŠãŒã¶ãŒã«éç¥ããå床ã¿ã°ãé»è©±ã«æã£ãŠããããã«èŠæ±ããå¿
èŠããããŸããInfoBannerèŠçŽ ã䜿çšã§ããŸã
InfoBanner{ id: errorBanner timerEnabled: true timerShowTime: 3 * 1000 topMargin: header.height + 20 leftMargin: 20 }
ãã¹ãŠããŸãšãã
ã¢ããªã±ãŒã·ã§ã³ã«å¿
èŠãªãã¹ãŠã®ã¡ã€ã³QMLã³ã³ããŒãã³ããšãå¿
èŠãªãã¹ãŠã®ããã°ã©ã ããžãã¯ãåå¥ã«èª¿ã¹ãŸããã äž¡æ¹ã®éšåããŸãšããŸãã
setContextProperty
QMLã³ãŒããèªã¿åãããã³æžã蟌ã¿ã³ã³ãããŒã«ã®ã¯ã©ã¹ã確èªããã«ã¯ããã®ã¯ã©ã¹ã®ãªããžã§ã¯ãã®ååšã«ã€ããŠå®£èšãšã³ãžã³ã«éç¥ããå¿
èŠããããããmain.cppã«æ¬¡ã®ããã«èšè¿°ããŸãã
NfcManager *nfcManager = new NfcManager(); viewer->rootContext()->setContextProperty("NfcManager", nfcManager);
ã€ãŸããNfcManagerãªããžã§ã¯ããäœæããQMLããã¢ã¯ã»ã¹ããå¿
èŠãããããšããšã³ãžã³ã«äŒããŸãã
ãšããã§ãææ°ã®
QtSDKã¢ããããŒãã§äœããå£ããŸããããã®ã³ãŒããæ£ããæ©èœããããã«
ã¯ããã°ãã©ãã«ãŒã§èª¬æãããŠããåé¿çã䜿çšããå¿
èŠããããŸãã
qmlRegisterType
ãã¡ãããã©ãã«ãèªã¿åã£ãåŸãåä¿¡ããŒã¿ãå«ããªããžã§ã¯ããå«ãä¿¡å·ãéä¿¡ããããšãå¿ããªãã§ãã ããã ãã®ãªããžã§ã¯ããQMLã§äœ¿çšå¯èœã«ããã«ã¯ããã®ãªããžã§ã¯ãã®ã¯ã©ã¹ãQMLã«ç»é²ããå¿
èŠããããŸã
qmlRegisterType<DataContainer>(); qmlRegisterType<UriDataContainer>(); qmlRegisterType<TextDataContainer>(); qmlRegisterType<SmartPosterDataContainer>();
ãã®ã³ãŒãã
main.cppã«æ¿å
¥ã
ãã ãææãããã¹ãŠã®ã¿ã€ãã®ããŒã¿ã®ããŒã¿ã¯ã©ã¹ãç»é²ããŸãã
ãã ãããã®ãããªãªããžã§ã¯ããQMLããçŽæ¥äœæããããšã¯çŠæ¢ãããŠããŸãã
çžäºäœçš
ãŠãŒã¶ãŒãããŒãžã«ã¢ã¯ã»ã¹ããŠã¿ã°ã®æžã蟌ã¿ãŸãã¯èªã¿åããè¡ãå Žåãæ¬¡ã®ã³ãŒããå®è¡ããå¿
èŠããããŸãã
èªãããã« function tagWasRead(container) { NfcManager.stopDetection() readPage.dataContainer = container pageStack.push(Qt.resolvedUrl("ReadResultPage.qml"), {dataContainer: readPage.dataContainer}) } function readError(string) { errorBanner.text = string errorBanner.show() } Component.onCompleted: { NfcManager.tagReadFinished.connect(readPage.tagWasRead) NfcManager.accessError.connect(readPage.readError) NfcManager.setReadMode() NfcManager.startDetection() }
Component.onCompletedã¡ãœããã¯ãããŒãžãå®å
šã«äœæããããšå®è¡ãããŸãã ãã®ã¡ãœããã§ã¯ããšã©ãŒããã³æåããçµæã®ãã³ãã©ãŒãNfcManagerããã®ã·ã°ãã«ã«ããã¯ããŸãïŒC ++ã·ã°ãã«ãQMLã¹ãããã«æ¥ç¶ããããã®æ§æã«æ³šæããŠãã ããïŒ
ãã®åŸãèªã¿åãã¢ãŒããèšå®ããã¿ã°ãæ·»ä»ããããšããããŒãžã£ãŒã«éç¥ããŸãã
ããã·ã¥ã³ãŒã«ã«ã泚æããŠãã ãã
pageStack.push(Qt.resolvedUrl("ReadResultPage.qml"), {dataContainer: readPage.dataContainer})
2çªç®ã®ãã©ã¡ãŒã¿ãŒã«ãããããŒã¿ã³ã³ãããŒã次ã®ããŒãžã«æž¡ãããšãã§ããŸãã

äŸïŒ
..... Label { id: rawDataLabel width: parent.width font.pixelSize: 30 font.family: "Courier New" text: readPage.dataContainer.rawHexData() wrapMode: Text.WrapAnywhere } .....
èšé²ãã function tagWasWritten() { ..... } function writeError(string) { ..... } Component.onCompleted: { NfcManager.tagWriteFinished.connect(writePage.tagWasWritten) NfcManager.accessError.connect(writePage.writeError) NfcManager.setWriteMode() NfcManager.setDataForWrite(writePage.text, writePage.uri) NfcManager.startDetection() }
ãã䌌ãŠããŸãããïŒ å¯äžã®éãã¯ãæžã蟌ã¿çšã®ããŒã¿ãæž¡ã
setDataForWriteã¡ãœããã®åŒã³åºãã§ãã
ãããã«
ãããã£ãŠãMeeGo Harmattanãã©ãããã©ãŒã çšã®ã·ã³ãã«ã§æ©èœçãªã¢ããªã±ãŒã·ã§ã³ãã§ããŸããã ãã ããæå°éã®åŽåã§Symbianã®ã¢ããªã±ãŒã·ã§ã³ã«å€ããããšãã§ããŸãã ç§ã®ç¥ãéããäžéšã®Symbianæºåž¯é»è©±ïŒ
C7ãªã©ïŒã«ã¯NFCããããçµã¿èŸŒãŸããŠããŸãã
ãŸããNFCã¿ã°ã«æ£åŒã«è¿œå ãããã®ã§ãã¢ããªã±ãŒã·ã§ã³ã§ããçè§£ã§ããªããããªåœ¢åŒã§æ
å ±ãæžã蟌ãããšãã§ããŸãã ãããã£ãŠããã®æè¡ã䜿çšããããå€ãã®æ¹æ³ãæãä»ãããšãã§ããŸãã
äœãèªã
ãã®ãããã¯ã«èå³ãããå Žåã¯ãNFCããã³NDEFã®å
¬åŒä»æ§ã«ç²Ÿéããããšããå§ãããŸãã ãããã¯
ããã®ããŒãžããå®å
šã«ç¡æã§ãªã³ããã³ãã§ããŠã³ããŒãã§ã
ãŸã ã
Qt Connectivityã®ããã¥ã¡ã³ãã¯QtSDKã«å«ãŸããŠããŸãããããšãã°ãç¬èªã®QNdefRecord圢åŒãéçºããå Žåãããã ãã§ã¯äžååãªå ŽåããããŸããQtMobilityãœãŒã¹ãæè¿ããŸã-å€ãã®è峿·±ãããšãèŠã€ãããŸãã
MeeGo Qt Componentsã«ãããšãQtSDK
ã®å
¬åŒããã¥ã¡ã³ããå
±åããŸãããæã«ã¯å€ãã®ããšãæãŸããå Žåã
ãããŸã ã
ãªãã·ã§ãã«
ç§ã¯ã¢ããªã±ãŒã·ã§ã³ã®éçºãç¶ããŸãããããã¯ããããNFCã¿ã°ã®æåŸã®æçš¿ã§ã¯ãããŸããã
ææ°æ
å ±ãå
¥æããã«ã¯ã
ã®ããªãŠã¹ã®ãããžã§ã¯ãã
ã芧ãã ãããŸãã¯ãç§ã®ããã°ã賌èªããŠãã ããããã®ãªã³ã¯ã¯ãããã¡ã€ã«ã«ãããŸãã
è¿ãå°æ¥ã
Nokia Storeã«ã¢ããªã±ãŒã·ã§ã³ãé
眮ããäºå®ãªã®ã§ããããæ¢ããŠãã ããã
debããã±ãŒãžã¯
ããããããŠã³ããŒãã§ã
ãŸã ã
è¬èŸ
ãŠãŒã¶ãŒã®ãšã©ãŒã誀æ€ã«ã€ããŠèšäºã®ããã¹ããæ ¡æ£ããŠãããããšã«æè¬ããŸãã
dreary_eyesãš
tass ã