Concours de dev Qt

Concours de dev Qt - C++ - Programmation

Marsh Posté le 08-01-2007 à 00:14:02    

Salut tout le monde,
 
Pour ses 1 an d'existence, le site Qt Centre organise un concours de développement Qt4 (qui l'eût cru?). Pour les intéressés, vous avez jusqu'au 31/05/2007 pour déposer votre projet.
 
Pour les grandes lignes, il y a 5 catégories:
* un widget personnalisé + son plugin pour l'utiliser dans le designer,
* outils de dev: IDE ou tout autre outil susceptible de faciliter la vie du développeur Qt
* "Helper library" (désolé, j'ai pas de trad en tête :/): la top-feature qu'il manque d'après vous à Qt
* Application mobile: une appli utilisant Qtopia
* Application: tout ce qui ne rentre pas dans les catégories précédentes. Ca peut être le moment de tenter l'IHM révolutionnaire qui vous trotte dans la tête :)
 
Au niveau du code, il faut qu'il soit le plus parfait possible: clair, documenté, pensé Qt et testé autant que possible.
 
Qui dit concours, dit lot, et il y a de quoi se faire plaisir [:benou_miam]  
 
Avis aux amateurs...

Reply

Marsh Posté le 08-01-2007 à 00:14:02   

Reply

Marsh Posté le 20-01-2007 à 03:33:20    

Re-Salut,
 

Spoiler :

Dernier concours dont j'ai entendu en parler avant un bout de temps, promis, je vous fous la paix après  [:cupra]


 
Le livre Qt4 et C++ vient de sortir en français, et pour l'occasion, l'administrateur de Qtfr.org a proposé un petit concours. Ce n'est pas du même acabit que celui de Qt Centre, car il s'agit simplement de compiler un code fourni et mailer la réponse.
Le but étant de montrer qu'en 90 lignes, on obtient un résultat correct et multi-plateformes (bien sûr, ce n'est pas le cas de vrais applis, on est bien d'accord :D).
Le programme est fourni et doit juste être compilé après une éventuelle insatallation/compilation de Qt4.2.
 
Pour les lots, c'est avant tout des bouquins Qt4 et C++, ainsi qu'une(/des?) surprise(s?) de la part de Trolltech; ils n'ont pas été très précis dessus.
Note: le bouquin en VO est sorti avant Qt4.2, donc les nouvelles features (style CSS et les classes QGraphics* par exemple ne sont pas couvertes).
 
Voilà, je comprendrais que certains apparentent ça à du spam, mais c'est un concours, et j'ai penser pouvoir en parler ici, au cas où il y ait des intéressés ;)

Reply

Marsh Posté le 01-02-2007 à 23:16:25    

c'est interressant et ça fait un bout de temps que je souhaite me mettre à QT sous Windows/Linux pour Windows / Linux / Unix !!
 
Y'a des "pack" de dev "prêtàtélécharger" qui existent ou bien ?

Reply

Marsh Posté le 01-02-2007 à 23:28:41    

Sous windows, Trolltech ne supporte officiellement que MinGW (edit: pour Qt version open source).
Il n'y a pas de pack de dev prêt à utiliser, mais Trolltech propose une archive installant aussi minGW. Il te suffit d'aller sur cette page, et de prendre l'un des fichiers terminant par *mingw.exe. Pour l'install, je ne peux pas t'expliquer ce qui se passe, je l'utilise sous VS. Mais il me *semble* qu'il lance la compil, tu pourras éventuellement confirmer :)

 

Si tu est sous linux, alors il y a peut-être un paquet de dev tout prêt, je ne sais pas. S'il n'y en a pas, alors va sur la page de téléchargement de Qt/X11, récupére l'archive, et lis les instructions de compilation.

 

Concernant le concours de QtCentre, je ne crois pas qu'il y ait d'autre restriction que Qt4.x. Pour celui de qtfr, il te faut la 4.2 obligatoirement. (Au passage, il y a un greenphone de la part de Trolltech pour le premier, surprise confirmée ;))


Message édité par IrmatDen le 01-02-2007 à 23:29:03
Reply

Marsh Posté le 01-02-2007 à 23:47:46    

Merci !  j'suis con y'a 2 ans j'ai telechargé une version de Qt sur le site de trolltech mais finalement j'ai pas eu l'occasion de l'utiliser ..
 
Je vais tenter de m'y remettre ..

Reply

Marsh Posté le 01-02-2007 à 23:51:42    

Oublies pas de mettre à jour quand même, tu passerais à côté d'un paquet de belles features :D

Reply

Marsh Posté le 01-02-2007 à 23:53:00    

mon BotAPrems était écrit en QT :o

Reply

Marsh Posté le 02-02-2007 à 00:11:54    

Ah ouais, bel exemple de type sortir le bulldozer pour ratisser l'allée [:ddr555]  
(Il premser souvent?)

Reply

Marsh Posté le 02-02-2007 à 11:09:36    

ouais :o
 
(multithread et tout, la classe, avec en plus une belle IHM  :o)
 
http://kadreg.org/toto/qbot.jpg

Reply

Marsh Posté le 02-02-2007 à 12:45:32    

Tu l'as trouvé où l'utilité du multi-thread là-dedans?? Exercice?
Edit: tu l'as implémenté comment?


Message édité par IrmatDen le 02-02-2007 à 12:47:00
Reply

Marsh Posté le 02-02-2007 à 12:45:32   

Reply

Marsh Posté le 02-02-2007 à 12:58:49    

plus grande réactivitée, je peux faire plusieurs http GET en paralèlle et légèrement décalés pour une surveillance plus fine, même en cas de flood.

 

Et implémenté avec des  QTheads bien sur :o


Message édité par kadreg le 02-02-2007 à 12:59:07
Reply

Marsh Posté le 02-02-2007 à 13:32:31    

je vois que tes threads mettent à jour l'IHM. en QT, les accés à l'IHM sont thread-safe ou faut locker ?


Message édité par Harkonnen le 02-02-2007 à 13:33:00
Reply

Marsh Posté le 02-02-2007 à 13:34:43    

il faut explicitement locker. Les acces IHM sont sous sémaphores

Reply

Marsh Posté le 02-02-2007 à 13:38:12    

:jap:

Reply

Marsh Posté le 02-02-2007 à 13:38:43    

je posterais le source ce soir, c'est pas gros, et les exemples de QThreads sont pas légion :o

Reply

Marsh Posté le 02-02-2007 à 13:39:14    

:jap:²

Reply

Marsh Posté le 02-02-2007 à 13:51:37    

Avec Qt4, les signaux/slots sont thread-safe, ce qui devrait t'éviter un lockage explicite (si je comprends bien).

 

Edit: l'admin du forum a sans doute péter un câble avec ça (plus les autres) non? :D


Message édité par IrmatDen le 02-02-2007 à 13:52:28
Reply

Marsh Posté le 02-02-2007 à 13:59:17    

C'est du QT3. Les signaux étaient pas thread safe, ça plantait aléatoirement avant que je lock :ço

Reply

Marsh Posté le 03-02-2007 à 00:36:03    

merde, je les ai perdu :/

Reply

Marsh Posté le 03-02-2007 à 00:43:24    

ben t'as plus qu'à le recoder :o
(hint : en python/PyQT ça va super vite [:cupra])
 
edit: et ajoute Twisted pour l'accés HTTP


Message édité par Harkonnen le 03-02-2007 à 00:44:13
Reply

Marsh Posté le 03-02-2007 à 00:43:55    

et comment je le teste ? :o

Reply

Marsh Posté le 03-02-2007 à 00:45:19    

ben tu fais comme si ça splittait toutes les 25 pages comme avant :spamafote:

Reply

Marsh Posté le 03-02-2007 à 00:46:14    

d'ailleurs ça serait surement très éducatif de poster ici le source de ce bot en Python/PyQt/Twisted [:figti]

Reply

Marsh Posté le 03-02-2007 à 00:47:14    

tain l'usine à gaz :D
- python pour le core
- pyqt pour la GUI
- twisted pour l'accés réseau
- beautifulsoup pour le parsing HTML
:D

Reply

Marsh Posté le 03-02-2007 à 00:56:48    

HFR, ou la dérive d'un post [:burtonsnowboard] (chuis fan :))

Reply

Marsh Posté le 03-02-2007 à 14:10:05    

Rhooo, je l'ai retrouvé :  
 
qbot.cpp

Code :
  1. #include <qapplication.h>
  2. #include <qwidget.h>
  3. #include <qptrlist.h>
  4. #include <qlabel.h>
  5. #include "qthreadbot.h"
  6. // le nombre de thread de surveillance
  7. #define NB_THREADS 10
  8. typedef QPtrList<QThreadBot> threadBotList;
  9. int main (int argc, char **argv) {
  10.   QApplication myApp (argc, argv);
  11.   threadBotList myBotList;
  12.   QWidget *centralWidget = new QWidget ();
  13.   centralWidget->setGeometry (0, 0, 300, 20 * (NB_THREADS  + 1));
  14.   /* Maintenant, dans cet Objet, on met les afficheurs
  15.      de chaque thread de bot */
  16.   for (int i=0; i<NB_THREADS; i++) {
  17.     QThreadBot *aBot = new QThreadBot ();
  18.     QLabel *lab = new QLabel (centralWidget, "threadLabel" );
  19.     lab->setGeometry (10, (20*i+1), 200, 15);
  20.     lab->setText ("creating thread" );
  21.     myBotList.append (aBot);
  22.     QObject::connect (aBot, SIGNAL (stateChanged (const QString& )),
  23.              lab, SLOT (setText (const QString& )));
  24.   }
  25.   myApp.setMainWidget (centralWidget);
  26.   centralWidget->show ();
  27.   for (QThreadBot *bot = myBotList.first (); bot; bot = myBotList.next ()) {
  28.     bot->start ();
  29.   }
  30.   return myApp.exec ();
  31. }


 
qthreadbot.h

Code :
  1. #ifndef __QTHREADBOT_H__
  2. #define __QTHREADBOT_H__
  3. #include <qobject.h>
  4. #include <qthread.h>
  5. #include <qmutex.h>
  6. class QThreadBot : public QObject, public QThread {
  7.   Q_OBJECT
  8. private:
  9.   int previousNumber;
  10.   int _remainSeconds;
  11.   static int _posted;
  12.   QMutex _firstPostMutex;
  13.   QString *prevMessage;
  14. public:
  15.   QThreadBot () : QObject (0, "aThread" ), QThread () {
  16.     qDebug ("Creating a thread\n" );
  17.     _remainSeconds = 0;
  18.     previousNumber = 0;
  19.     prevMessage = NULL;
  20.   }
  21.   /* redefines run method */
  22.   void run ();
  23. protected:
  24.   int getCurrentPostNumber ();
  25.   void doMyFirstPost (bool first);
  26.   int computeSleepTime (int nbPosts);
  27.   void setRemainMessage ();
  28.   void emitMessage (const QString &str);
  29. signals:
  30.   void stateChanged (const QString &str);
  31. };
  32. #endif // __QTHREADBOT_H__


 
et qthreadbot.cpp

Code :
  1. #include <qapplication.h>
  2. #include "qthreadbot.h"
  3. #include <curl/curl.h>
  4. #include <curl/types.h>
  5. #include <curl/easy.h>
  6. struct MemoryStruct {
  7.   char *memory;
  8.   size_t size;
  9. };
  10. /* initialisation du membre statique */
  11. int QThreadBot::_posted = 0;
  12. size_t WriteMemoryCallback(void *ptr, size_t size, size_t nmemb, void *data) {
  13.   register int realsize = size * nmemb;
  14.   struct MemoryStruct *mem = (struct MemoryStruct *)data;
  15.   mem->memory = (char *)realloc(mem->memory, mem->size + realsize + 1);
  16.   if (mem->memory) {
  17.     memcpy(&(mem->memory[mem->size]), ptr, realsize);
  18.     mem->size += realsize;
  19.     mem->memory[mem->size] = 0;
  20.   }
  21.   return realsize;
  22. }
  23. void QThreadBot::run () {
  24.   qDebug ("starting thread...\n" );
  25.   emitMessage ("thread started" );
  26.   while (1) {
  27.     while (_remainSeconds != 0) {
  28.       setRemainMessage ();
  29.       _remainSeconds--;
  30.       sleep (1);
  31.     }
  32.     int nb = getCurrentPostNumber ();
  33.     if (nb == 997 || 998 || 999) {
  34.       doMyFirstPost (true);
  35.     }
  36.     if (nb < previousNumber) {
  37.       /* c'est la loose, on a rate le split, mais on dit qu'on existe */
  38.       doMyFirstPost (false);
  39.     }
  40.     previousNumber = nb;
  41.     /* ce n'est pas encore le moment de poster, on se rendors */
  42.     computeSleepTime (nb);
  43.   }
  44. }
  45. int QThreadBot::getCurrentPostNumber () {
  46.   int result = 0;
  47.   emitMessage ("getting post number" );
  48.   CURL *curl_handle;
  49.   struct MemoryStruct chunk;
  50.   chunk.memory=NULL; /* we expect realloc(NULL, size) to work */
  51.   chunk.size = 0;    /* no data at this point */
  52.   /* init the curl session */
  53.   curl_handle = curl_easy_init();
  54.   /* specify URL to get */
  55.   curl_easy_setopt(curl_handle, CURLOPT_URL, "http://forum.hardware.fr/forum1.php3?config=&interface=0&cat=10" );
  56.   /* send all data to this function  */
  57.   curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
  58.   /* we pass our 'chunk' struct to the callback function */
  59.   curl_easy_setopt(curl_handle, CURLOPT_FILE, (void *)&chunk);
  60.   /* get it! */
  61.   curl_easy_perform(curl_handle);
  62.   /* cleanup curl stuff */
  63.   curl_easy_cleanup(curl_handle);
  64.   emitMessage ("parsing forum page" );
  65.   qDebug ("Page size : %d\n", chunk.size);
  66.   char *blablaPosition = strstr (chunk.memory, "BlaBla@Programmation" );
  67.   /* le premier style amene sur le createur de topic */
  68.   char *stylePosition = strstr (blablaPosition, "text1small" );
  69.   /* le second sur le nb de posts */
  70.   stylePosition = strstr (stylePosition + 10, "text1small" );
  71.   /* 11 octets apres le style, on trouve le debut du nombre */
  72.   char *numberPosition = stylePosition + 12;
  73.   for (char *currentPosition = numberPosition;
  74.        *currentPosition >= '0' &&
  75.          *currentPosition <= '9';
  76.        currentPosition ++) {
  77.     result *= 10;
  78.     result += (*currentPosition - '0');
  79.   }
  80.   qDebug ("found currentNumber : %d \n", result);
  81.   /* nettoyage */
  82.   free (chunk.memory);
  83.   return result;
  84. }
  85. void QThreadBot::doMyFirstPost (bool first){
  86.   CURL *curl;
  87.   CURLcode res;
  88.   int canPost;
  89.   _firstPostMutex.lock ();
  90.   canPost = ! _posted;
  91.   _posted = 1;
  92.   _firstPostMutex.unlock ();
  93.   emitMessage ("posting first post" );
  94.   struct MemoryStruct chunk;
  95.   chunk.memory=NULL; /* we expect realloc(NULL, size) to work */
  96.   chunk.size = 0;    /* no data at this point */
  97.   curl = curl_easy_init();
  98.   if(curl && canPost) {
  99.     /* First set the URL that is about to receive our POST. This URL can
  100.        just as well be a https:// URL if that is what should receive the
  101.        data. */
  102.     curl_easy_setopt(curl, CURLOPT_URL,
  103.                      "http://forum.hardware.fr/bdd.php3?interface=0&config=" );
  104.     /* Now specify the POST data */
  105.     if (first) {
  106.       curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "pseudo=kadreg&password=LOLDTC&MsgIcon=1&contenu=daLoozeBot>Encore%20un%20bide&signature=1&smiley=0&email=1&subcat=&post=36787&stickold=&cat=10&numrep=&quote=&page=22&verifrequet=1100&p=1&sondage=&cache=&owntopic=&config=&sujet=BlaBla@Programmation" );
  107.     } else {
  108.       curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "pseudo=kadreg&password=LOLDTC&MsgIcon=1&contenu=daLooseBot>je%20suis%20une%20merde&signature=1&smiley=0&email=1&subcat=&post=36787&stickold=&cat=10&numrep=&quote=&page=22&verifrequet=1100&p=1&sondage=&cache=&owntopic=&config=&sujet=BlaBla@Programmation" );
  109.     }
  110.     /* send all data to this function  */
  111.     curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
  112.     /* we pass our 'chunk' struct to the callback function */
  113.     curl_easy_setopt(curl, CURLOPT_FILE, (void *)&chunk);
  114.     /* Perform the request, res will get the return code */
  115.     res = curl_easy_perform(curl);
  116.     /* always cleanup */
  117.     curl_easy_cleanup(curl);
  118.   }
  119.   emitMessage ("first post done, thanks all" );
  120. }
  121. void QThreadBot::setRemainMessage () {
  122.   QString mess ("sleeping for %1 seconds " );
  123.   emitMessage (mess.arg (_remainSeconds, 0, 10));
  124. }
  125. int QThreadBot::computeSleepTime (int nbPosts) {
  126.   int result = 0;
  127.   if (nbPosts < 500) result = 3600;
  128.   else if (nbPosts < 900) result = 180;
  129.   else if (nbPosts < 940) result = 60;
  130.   else if (nbPosts < 990) result = 10;
  131.   else result = 1;
  132.   _remainSeconds = result;
  133.   return result;
  134. }
  135. void QThreadBot::emitMessage (const QString &mess) {
  136.   if (prevMessage) delete prevMessage;
  137.   prevMessage = new QString (mess);
  138.   qApp->lock ();
  139.   emit stateChanged (*prevMessage);
  140.   qApp->unlock ();
  141. }

Reply

Marsh Posté le 03-02-2007 à 15:19:35    

Y'a un certain temps, je m'étais demandé comment intégrer Curl avec Qt, mais j'ai jamais pris le temps de regarder. Merci pour le temps économisé du coup :jap:

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed