Viadeo Twitter Google Bookmarks ! Facebook Digg del.icio.us MySpace Yahoo MyWeb Blinklist Netvouz Reddit Simpy StumbleUpon Bookmarks Windows Live Favorites 
Logo Documentation Qt ·  Page d'accueil  ·  Toutes les classes  ·  Toutes les fonctions  ·  Vues d'ensemble  · 

Service Actions Example

Files:

This simple example demonstrates how to compose, send, show, query and retrieve messages, and also react to message store events using the Qt Mobility Messaging API.

Each of these actions is demonstrated in a separate sub example accessible from the "File" menu of each platform.

Send and Compose

Messages are sent and composed from a composition widget under the "Compose/Send" menu. Relevant message details such as sending account, recipients and message bodies (attachments for email accounts) can be entered by the user via corresponding UI elements. A QMessage is constructed using these details:

 QMessage ComposeSendWidget::constructQMessage(bool asHtml) const
 {
     QMessage message;

     if(m_accountsWidget->isEmpty())
     {
         QMessageBox::critical(const_cast<ComposeSendWidget*>(this),"No Accounts","Cannot send a message without any available accounts");
         return message;
     }

     QMessageAccountId selectedAccountId = m_accountsWidget->currentAccount();
     QMessageAccount selectedAccount(selectedAccountId);

     bool composingSms = (selectedAccount.messageTypes() & QMessage::Sms) > 0;

     QMessageAddressList toList;
     QMessageAddressList ccList;
     QMessageAddressList bccList;

     QMessageAddress::Type addressType = QMessageAddress::Email;
     if(composingSms)
     {
         addressType = QMessageAddress::Phone;
         message.setType(QMessage::Sms);
     }

     foreach(QString s, m_toEdit->text().split(QRegExp("\\s"),QString::SkipEmptyParts))
         toList.append(QMessageAddress(addressType, s));
     message.setTo(toList);

     if(!composingSms)
     {
         foreach(QString s, m_ccEdit->text().split(QRegExp("\\s"),QString::SkipEmptyParts))
             ccList.append(QMessageAddress(QMessageAddress::Email, s));
         message.setCc(ccList);

         foreach(QString s, m_bccEdit->text().split(QRegExp("\\s"),QString::SkipEmptyParts))
             bccList.append(QMessageAddress(QMessageAddress::Email, s));
         message.setBcc(bccList);
         message.setSubject(m_subjectEdit->text());

         message.setType(QMessage::Email);

         message.appendAttachments(m_attachmentList->attachments());
     }

     message.setParentAccountId(selectedAccountId);

     if(!composingSms && asHtml) {
         //create html body
         QString htmlBody("<html><head><title></title></head><body><h2 align=center>%1</h2><hr>%2</body></html>");
         message.setBody(htmlBody.arg(message.subject()).arg(m_bodyEdit->toPlainText()),"text/html");
     }
     else
         message.setBody(m_bodyEdit->toPlainText());

     return message;
 }

The message is then passed to the QMessageService::compose() or QMessageService::send() service actions to initiate sending of the message by the platform, or trigger display by the platforms' message composer with the QMessage contents:

 void ComposeSendWidget::composeButtonClicked()
 {
     QMessage message(constructQMessage());
     m_service->compose(message);
 }

 void ComposeSendWidget::sendButtonClicked()
 {
     bool asHtml = (sender() == m_sendAsHTMLAction);
     QMessage message(constructQMessage(asHtml));
     notifyResult(m_service->send(message),"Send message");
 }

Show

Messages are displayed by a show widget under the "Show" menu. This widget displays the users last 50 messages. (Ensure the platform has one or more messages in its mail accounts).

The last 50 messages (incoming/outgoing) are queried from the store using the QMessageService::queryMessages() service request:

 void RecentMessagesWidget::load()
 {
     m_ids.clear();
     m_state = Loading;
     bool b;

     b=m_service->queryMessages(QMessageFilter(),QMessageSortOrder::byReceptionTimeStamp(Qt::DescendingOrder),m_maxRecent);

Once the results of the query are returned via the QMessageService::messagesFound() signal, the widget loads each of the returned messages in turn and populates it's list with message subjects.

 void RecentMessagesWidget::messagesFound(const QMessageIdList& ids)
 {
     m_ids.append(ids);
 }
 void RecentMessagesWidget::processResults()
 {
     if(!m_ids.isEmpty())
     {
         QMessageId id = m_ids.takeFirst();
         QMessage message(id);

         QListWidgetItem* newItem = new QListWidgetItem(message.from().addressee()+QString(":")+message.subject());
         newItem->setData(MessageIdRole,id.toString());
         QFont itemFont = newItem->font();
         bool isPartialMessage = !message.find(message.bodyId()).isContentAvailable();
         itemFont.setItalic(isPartialMessage);
         newItem->setFont(itemFont);
         m_messageListWidget->addItem(newItem);
         m_indexMap.insert(id,newItem);
         m_messageListWidget->update();
         QTimer::singleShot(100,this,SLOT(processResults()));
     }
     else
     {
         m_state = Done;
         updateState();
     }
 }

Selecting "Show" from the action menu will display the selected message using the platforms' message viewer via the QMessageService::show() service action.

 void ShowWidget::showButtonClicked()
 {

     QMessageId id = m_recentMessagesWidget->currentMessage();

     if(id.isValid())
         m_service->show(id);
 }

Query and Retrieve

Message contents are displayed/retrieved by a retrieve widget under the "Query/Retrieve" menu. This example displays the last 50 messages, as in the "Show" example, but also displays message content in a QTextBrowser widget and provides the option to download messages that are incomplete.

After the message list is populated, the message display widget will attempt to load and display the currently selected message. The completeness of the message body is checked using the QMessageContentContainer::isContentAvailable function. If the message body is partially downloaded, a download link is displayed.

 void MessageViewWidget::loadMessage()
 {
     m_messageBrowser->clear();

     static const QString htmlTemplate("\
     <html>\
     <head>\
     </head>\
     <body>\
     <table border=\"0\" cellspacing=\"0\">\
         <tr><td><b>From: </b></td><td>%1</td></tr>\
         <tr><td><b>Subject: </b></td><td>%2</td></tr>\
         <tr><td><b>Date: </b></td><td>%3</td></tr>\
     </table>\
     <hr>%4\
     <\body>\
     </html>\
     ");

     if(m_messageId.isValid())
     {
         QMessage message(m_messageId);

         QMessageContentContainer bodyPart = message.find(message.bodyId());

         QString bodyText;

         //for partial message display a download link instead

         bool bodyAvailable = bodyPart.isContentAvailable();

         if(bodyAvailable)
         {
             if(bodyPart.contentType() == "text")
                 bodyText = bodyPart.textContent();
             else bodyText = "<Non-text content>";
         }
         else
             bodyText = QString("<p align=\"center\"><a href=\"%1\">Download</a></p>").arg(downloadLinkURL());
         m_messageBrowser->setHtml(htmlTemplate\
                                  .arg(message.from().addressee())\
                                  .arg(message.subject())\
                                  .arg(message.receivedDate().toString())\
                                  .arg(bodyText));
     }
 }

When the download link is clicked, the message body is retrieved using the QMessageService::retrieveBody() service action.

 bool MessageViewWidget::retrieveBody()
 {
     if(m_state != Loading && !m_loadTimer.isActive())
     {
         m_loadTimer.setSingleShot(true);
         m_loadTimer.start(LoadTimeLimit * 1000);
         m_state = Unloaded;

         return m_service->retrieveBody(m_messageId);
     }

     return false;
 }

Store Signals

This example displays the activities of the QMessageManager in a QListWidget by connecting to QMessageManager::message(Added/Updated/Removed) signals.

 void StoreSignalsWidget::messageAdded(const QMessageId& id, const QMessageManager::NotificationFilterIdSet& filterSet)
 {
     if(!filterSet.contains(m_notificationFilterId))
         return;

     QMessage message(id);

     QString msg = QString("Added: %1").arg(message.subject());
     m_activityListWidget->addItem(msg);
 }

 void StoreSignalsWidget::messageUpdated(const QMessageId& id, const QMessageManager::NotificationFilterIdSet& filterSet)
 {
     if(!filterSet.contains(m_notificationFilterId))
         return;

     QMessage message(id);

     QString msg = QString("Updated: %1").arg(message.subject());
     m_activityListWidget->addItem(msg);
 }

 void StoreSignalsWidget::messageRemoved(const QMessageId& id, const QMessageManager::NotificationFilterIdSet& filterSet)
 {
     if(!filterSet.contains(m_notificationFilterId))
         return;

     QString idString(id.toString());
     idString.truncate(10);

     QString msg = QString("Removed ID: %1 ...").arg(idString);
     m_activityListWidget->addItem(msg);
 }
X

Thank you for giving your feedback.

Make sure it is related to this specific page. For more general bugs and requests, please use the Qt Bug Tracker.

[0]; s.parentNode.insertBefore(ga, s); })();
Publicité

Best Of

Actualités les plus lues

Semaine
Mois
Année
  1. « Quelque chose ne va vraiment pas avec les développeurs "modernes" », un développeur à "l'ancienne" critique la multiplication des bibliothèques 82
  2. Apercevoir la troisième dimension ou l'utilisation multithreadée d'OpenGL dans Qt, un article des Qt Quarterly traduit par Guillaume Belz 0
  3. Les développeurs ignorent-ils trop les failles découvertes dans leur code ? Prenez-vous en compte les remarques des autres ? 17
  4. BlackBerry 10 : premières images du prochain OS de RIM qui devrait intégrer des widgets et des tuiles inspirées de Windows Phone 0
  5. Quelles nouveautés de C++11 Visual C++ doit-il rapidement intégrer ? Donnez-nous votre avis 10
  6. Adieu qmake, bienvenue qbs : Qt Building Suite, un outil déclaratif et extensible pour la compilation de projets Qt 17
  7. 2017 : un quinquennat pour une nouvelle version du C++ ? Possible, selon Herb Sutter 6
Page suivante

Le Qt Developer Network au hasard

Logo

La création de colonnes dans une ListView en QML

Le Qt Developer Network est un réseau de développeurs Qt anglophone, où ils peuvent partager leur expérience sur le framework. Lire l'article.

Communauté

Ressources

Liens utiles

Contact

  • Vous souhaitez rejoindre la rédaction ou proposer un tutoriel, une traduction, une question... ? Postez dans le forum Contribuez ou contactez-nous par MP ou par email (voir en bas de page).

Qt dans le magazine

Cette page est une traduction d'une page de la documentation de Qt, écrite par Nokia Corporation and/or its subsidiary(-ies). Les éventuels problèmes résultant d'une mauvaise traduction ne sont pas imputables à Nokia. Qt qtmobility-1.1
Copyright © 2012 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon, vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts. Cette page est déposée à la SACD.
Vous avez déniché une erreur ? Un bug ? Une redirection cassée ? Ou tout autre problème, quel qu'il soit ? Ou bien vous désirez participer à ce projet de traduction ? N'hésitez pas à nous contacter ou par MP !
 
 
 
 
Partenaires

Hébergement Web