Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1604 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Concours de dev Qt

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Concours de dev Qt

n°1500133
IrmatDen
Posté le 08-01-2007 à 00:14:02  profilanswer
 

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...

mood
Publicité
Posté le 08-01-2007 à 00:14:02  profilanswer
 

n°1505278
IrmatDen
Posté le 20-01-2007 à 03:33:20  profilanswer
 

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 ;)

n°1509856
StanCW
Parle à Monkey ...
Posté le 01-02-2007 à 23:16:25  profilanswer
 

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 ?

n°1509861
IrmatDen
Posté le 01-02-2007 à 23:28:41  profilanswer
 

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
n°1509871
StanCW
Parle à Monkey ...
Posté le 01-02-2007 à 23:47:46  profilanswer
 

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 ..

n°1509873
IrmatDen
Posté le 01-02-2007 à 23:51:42  profilanswer
 

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

n°1509874
elianor
bannie 17 fois
Posté le 01-02-2007 à 23:53:00  profilanswer
 

mon BotAPrems était écrit en QT :o

n°1509881
IrmatDen
Posté le 02-02-2007 à 00:11:54  profilanswer
 

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

n°1509973
kadreg
profil: Utilisateur
Posté le 02-02-2007 à 11:09:36  profilanswer
 

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

n°1510018
IrmatDen
Posté le 02-02-2007 à 12:45:32  profilanswer
 

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
mood
Publicité
Posté le 02-02-2007 à 12:45:32  profilanswer
 

n°1510020
kadreg
profil: Utilisateur
Posté le 02-02-2007 à 12:58:49  profilanswer
 

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
n°1510033
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 02-02-2007 à 13:32:31  profilanswer
 

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
n°1510035
kadreg
profil: Utilisateur
Posté le 02-02-2007 à 13:34:43  profilanswer
 

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

n°1510037
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 02-02-2007 à 13:38:12  profilanswer
 

:jap:

n°1510038
kadreg
profil: Utilisateur
Posté le 02-02-2007 à 13:38:43  profilanswer
 

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

n°1510039
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 02-02-2007 à 13:39:14  profilanswer
 

:jap:²

n°1510045
IrmatDen
Posté le 02-02-2007 à 13:51:37  profilanswer
 

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
n°1510047
kadreg
profil: Utilisateur
Posté le 02-02-2007 à 13:59:17  profilanswer
 

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

n°1510321
elianor
bannie 17 fois
Posté le 03-02-2007 à 00:36:03  profilanswer
 

merde, je les ai perdu :/

n°1510323
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 03-02-2007 à 00:43:24  profilanswer
 

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
n°1510324
elianor
bannie 17 fois
Posté le 03-02-2007 à 00:43:55  profilanswer
 

et comment je le teste ? :o

n°1510325
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 03-02-2007 à 00:45:19  profilanswer
 

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

n°1510326
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 03-02-2007 à 00:46:14  profilanswer
 

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

n°1510327
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 03-02-2007 à 00:47:14  profilanswer
 

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

n°1510329
IrmatDen
Posté le 03-02-2007 à 00:56:48  profilanswer
 

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

n°1510421
elianor
bannie 17 fois
Posté le 03-02-2007 à 14:10:05  profilanswer
 

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. }

n°1510448
IrmatDen
Posté le 03-02-2007 à 15:19:35  profilanswer
 

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:

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Concours de dev Qt

 

Sujets relatifs
Concours acronymeConcours de programmation : Prologin 2007
[Concours de programmation]L'ultime jeuConcours de programmation : Prologin 2006 (derniers jours)
[Concours de code]Echauffement pour l'IOCCCConcours Auto Taxi Driver de Coder-Studio.com
Bouquin Langage C (révisions concours)Fin de l'édition 2005 du Concours National d'Informatique
Concours de programmation : rundergroundconcours/defi programmation
Plus de sujets relatifs à : Concours de dev Qt


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR