30

Folco (./28) :
Mais alors, quel intéret de pouvoir générer un poster un event s'il est "inactif" ? C'est dommage, parce que je trouve ça très élégant de générer des events dans un programme basé sur l'évènementiel...

L'évènementiel de Qt passe principalement par les signaux et les slots. Le système des events sert essentiellement pour les évènements issus du système, et postEvent n'est utile que très rarement (pour simuler par exemple un appui d'une touche).
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

31

Autre sujet : c'est une bonne chose de déclarer les constructeurs (et les méthodes en C11 ??) explicit, et de ne le virer que quand on veut une conversion, en sachant ce qu'on fait, pour éviter des erreurs bien chiantes ?
Surout dans l'idée où on bosse avec un framework, qui pourrait avoir mis en place des conversions assez sioux par exemple.

Je me suis documenté avec ça, entre autres : http://stackoverflow.com/questions/121162/what-does-the-explicit-keyword-in-c-mean (voir seconde réponse, à ~500 votes).

Merci. smile

32

Oui, les développeurs de Qt et KDE conseillent de mettre explicit à tous les constructeurs (du moins ceux avec un seul argument; pour les autres, ça ne change rien) sauf quand on est sûr de vouloir permettre la conversion implicite.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

33

Merci. smile

34

Ah, et pourquoi ça ne concerne les constructeurs qui n'ont qu'un argument ? Je comprends pas ><

35

Seuls les constructeurs à un seul argument induisent une conversion implicite, par exemple un constructeur QString(const char *) une conversion de const char * à QString. Tu veux convertir quoi en quoi avec un constructeur à plusieurs (ou aucun) argument(s)?
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

36

Ok. Merci.

Autre question, concernant les QDataStream. Je dois encore rater un truc, meme si maintenant j'arrive à sauver/ouvrir un fichier sans problème.

J'ai une classe Ladder qui contient un pointeur LadderData* :class Ladder { public: explicit Ladder(QString name); ~Ladder(); private: LadderData* data; };
Pour sérialiser, j'ai écrit ça qui marche :
Version qui marche
Ladder.cppQDataStream& Ladder::toStream(QDataStream& stream) const { return stream << *data; } QDataStream& operator<< (QDataStream& stream, const Ladder& ladder) { return ladder.toStream(stream); }
LadderData.cppQDataStream& operator<< (QDataStream& stream, const LadderData& data) { return stream << data.getName() << data.getUID() << data.getPlayerList(); }


J'ai voulu transformer ça, pour passer au stream le pointeur DataStream* data, et non l'objet pointé *data:
version qui marche pô :(
QDataStream& Ladder::toStream(QDataStream& stream) const { return stream << data; } QDataStream& operator<< (QDataStream& stream, const Ladder& ladder) { return ladder.toStream(stream); }
etQDataStream& operator<< (QDataStream& stream, const LadderData*& data) { return stream << data->getName() << data->getUID() << data->getPlayerList(); }

Je pensais que c'était tout simple, mais visiblement, la seconde version me crée un fichier qui déconne complètement par rapport à ce que la première version crée. A l'éditeur hexa, je n'y vois pas le contenu de data.

Pourquoi ? Vu que c'est comme ça que j'ai procédé pour lire une QList<T*>, je pensais que c'était pareil ici ><

Merci de m'expliquer ce qui se passe dans le second cas.

• Folco pas encore hyper copaing avec les références ><

37

Bon, vous aurez 0 à la question précédente. embarrassed

Question suivante :
Pourquoi je vois souvent des méthodes Get(), appartenant à des classes "racines" des applications ?
A mon avis, ce sont des méthodes statiques qui renvoient le this d'un singleton, right ?
Alors pourquoi ne pas utiliser une variable globale ? C'est une question de religion, ou c'est pour pouvoir insérer du code dans le Get(), ou pour quelle autre mystérieuse raison ?

Merci d'avance. chinois

38

Folco (./37) :
c'est pour pouvoir insérer du code dans le Get()
Pour autant que je sache, c'est la raison principale de ce genre de choses : si plus tard tu as besoin d'ajouter un contrôle d'accès ou des effets secondaires liés à la lecture/écriture des données, c'est trivial si tu as utilisé un setter/getter, mais ça demande une refactorisation si tu as utilisé des variables globales.
Ceci dit, il me semble que ça devient moins vrai avec les IDEs modernes, je crois qu'ils peuvent refactoriser ça automatiquement.
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

39

Ça permet aussi la création paresseuse du singleton à sa première utilisation.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

40

Ok merci. smile
Tiens, c'est conventionnel de faire commencer les méthodes statiques par une majuscule, contrairement aux autres méthodes, ou c'est juste comme ça dans le source que j'ai sous la souris ?

41

Folco (./40) :
Tiens, c'est conventionnel de faire commencer les méthodes statiques par une majuscule, contrairement aux autres méthodes, ou c'est juste comme ça dans le source que j'ai sous la souris ?

c'est juste comme ça dans le source que j'ai sous la souris

smile
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

42

Bon ben ok, merc. Etonnant, mais ok.

43

La convention la plus courante que j'ai vue, c'est qu'une méthode statique a le même styleDeNom que n'importe quelle autre méthode. On trouve parfois aussi des préfixes comme "s_", mais c'est rare.

On les reconnaît généralement à l'appel, qui utilise normalement la syntaxe Classe::methodeStatique (même si instance.methodeStatique passe aussi).
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

44

J'aime pas les m_/s_/x_, à l'expérience je préfère un this-> bien plus explicite. Je pense notamment aux constructeurs et aux setters. J'aime avoir le même nom pour l'argument et le membre, c'est bien plus lisible. Les m_truc c'est m_oche grin
Kevin Kofler (./43) :
On les reconnaît généralement à l'appel, qui utilise normalement la syntaxe Classe::methodeStatique

C'est exactement en lisant ça cette nuit que j'ai enfin compris que c'était des méthodes statiques d'instances uniques trigic Faut dire que j'étais jamais allé voir les définitions ^^

45

Quelle est la bonne méthode, pour changer la couleur d'un texte (QLabel) avec Qt 5 ?
Est-ce ça : http://www.qtcentre.org/threads/195-Setting-text-color-on-QLabel
Ou plutôt quelque chose dans le genre CSS comme ici : http://stackoverflow.com/questions/2749798/qlabel-set-color-of-text-and-background
Ce second lien donne une dizaine de réponse, chacune clamant être la meilleure ><

46

À mon avis, setPalette est la bonne solution, le reste est du bidouillage.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

47

Ok merci !

48

Bon, apparemment, un QLabel peut contenir du RichText (il faut mettre un flag spécifique), et support alors un subset du HTML : http://doc.qt.io/qt-5/richtext-html-subset.html
Ca devient alors tout simple de colorer les choses. smile

49

*** FORK (manuel) DU THREAD VERS KDEVELOP ***

Hier, j'ai voulu builder mon projet Qt (écrit et construit avec Creator/Designer depuis le début, sans aucun problème) à partir de KDevelop.
J'ai donc utilisé le template de projet Qt.
Je pensais devoir écrire toute la partie CMake à la main (très bon exercice), mais il se trouve que j'ai eu tout un paquet de fichiers liés à CMake dans le répertoire de build :!folco@Foch:/mnt/Data/prog/TBL2/TBL/build$ ls -R .: CMakeCache.txt CMakeFiles ./CMakeFiles: 3.0.2 cmake.check_cache CMakeOutput.log CMakeTmp ./CMakeFiles/3.0.2: CMakeCCompiler.cmake CMakeDetermineCompilerABI_C.bin CMakeSystem.cmake CompilerIdCXX CMakeCXXCompiler.cmake CMakeDetermineCompilerABI_CXX.bin CompilerIdC ./CMakeFiles/3.0.2/CompilerIdC: a.out CMakeCCompilerId.c ./CMakeFiles/3.0.2/CompilerIdCXX: a.out CMakeCXXCompilerId.cpp ./CMakeFiles/CMakeTmp:
Idéalement, j'aurais voulu écrire moi-même mon fichier CMakeList.txt, mais je suis incapable d'écrire tous les fichiers que j'ai trouvés.
Ma question : qu'est-ce que tous ces fichiers ? Des fichiers temporaires auto-générés par CMake à partir du CMakeList.txt, ou alors des fichiers créés par le template et absolument nécessaires à mon projet .
Dans ce dernier cas, je serais bien incapable de les écrire à la main, donc adieu mon idée de compiler mon projet "by hand" pour bien comprendre la compilation d'un projet Qt. sad

Dernière chose, CMake est par définition cross-plateforme, tous les fichiers dont il est question sont-ils un obstacle à la compilation sous un autre OS (je ne parle pas de cross-compilation) ?

Merci d'avance. happy


edit -> ah, bonus :
- j'ai vu que uic sert à transformer les .ui en .h, inclus dans les .h(pp) de la classe qui les contient.
- j'ai vu aussi que moc est une moulinette qui doit être passée sur tous les fichiers contenant la macro Q_OBJECT. Je sais pas trop comment dire ça à CMake mais je vais trouver.
- par contre, qmake, j'arrive pas à situer cet outil : c'est encore un autre outils pour remplacer [fixed]make/cmake/makefile[fixed] ? est-ce un outil nécessaire pour builder un projet Qt ? J'ai parcouru sa doc, le langage a l'air clair et facile, mais ça n'en reste pas moins un nouveau langage à apprendre, quoi...

50

Folco (./49) :
Ma question : qu'est-ce que tous ces fichiers ? Des fichiers temporaires auto-générés par CMake à partir du CMakeList.txt

oui
Plus généralement, tout ce qui se trouve dans le répertoire build est autogénéré, c'est le but de ce dossier.
Dernière chose, CMake est par définition cross-plateforme, tous les fichiers dont il est question sont-ils un obstacle à la compilation sous un autre OS (je ne parle pas de cross-compilation) ?

On ne distribue normalement pas le répertoire build, parce que les fichiers qu'il contient ne sont effectivement pas portables.
- j'ai vu aussi que moc est une moulinette qui doit être passée sur tous les fichiers contenant la macro Q_OBJECT. Je sais pas trop comment dire ça à CMake mais je vais trouver.

http://www.cmake.org/cmake/help/v3.0/prop_tgt/AUTOMOC.html
- par contre, qmake, j'arrive pas à situer cet outil : c'est encore un autre outils pour remplacer make/cmake/makefile ? est-ce un outil nécessaire pour builder un projet Qt ? J'ai parcouru sa doc, le langage a l'air clair et facile, mais ça n'en reste pas moins un nouveau langage à apprendre, quoi...

C'est une alternative (moins bonne) à CMake. Si tu utilises CMake, qmake n'est utilisé qu'en interne par CMake pour trouver les fichiers de Qt. Donc tu n'as pas à t'en préoccuper.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

51

Ok super, merci ! top

52

Bon, j'essaye de refaire mon CMakeList.txt à la main, évidemment je me heurte à quelques problèmes d'inclusions d'une part, et de linking ensuite.
En utilisant le template créé par KDevelop pour un projet Qt graphique, j'obtiens, entre autres, ces lignes :
include_directories(${QT_INCLUDES} ${CMAKE_CURRENT_BINARY_DIR})
target_link_libraries(abc ${QT_QTCORE_LIBRARY} ${QT_QTGUI_LIBRARY})

Pourrais-je savoir d'où sortent ces variables magiques, QT_INCLUDES, QT_QTCORE_LIBRARY et QT_QTGUI_LIBRARY ?

A la main, j'essaye précisément de recréer une variable équivalente à QT_INCLUDES :
find_package(Qt5 REQUIRED Widgets)
include_directories(Qt5_INCLUDE_DIRS)

Mais bon, ça doit pas etre ça, parce que les headers ne sont pas trouvés cheeky

ps -> la boite de configuration d'un projet permet de régler plein de vars de CMake, ça n'interfère pas avec le CMakeList.txt qu'on écrit à la main ? Si on génère ce fichier soi-même, je ne vois pas bien, du coup, l'intéret de la boite de dialogue. Je rate surement un truc.

ps2 -> une page de blog très intéressante et claire sur KDevelop, ce que c'est et ce que ça n'est pas. C'est ça qui m'a poussé à tester, en visant une amélioration de ma compréhension des choses cheeky

53

héhé, ben oui, les variables ont un arrière-goût bashique : ${Qt5_INCLUDE_DIRS}, tout simplement cheeky
Reste plus qu'à lui dire de faire du code pic, parce qu'il râle encore. Incroyable de se soucier de questions de relogements quand on fait du C++ confus

54

F*ck yeah !!! Mon premier CMakeLists.txt qui marche enfin love
Bon, c'est certainement pas académique du tout, et ça doit etre bien laid, mais ça marche tongue
cmake_minimum_required(VERSION 2.8.11)
project(tbl)

# Instruct CMake to run moc automatically when needed.
set(CMAKE_AUTOMOC ON)
set(CMAKE_POSITION_INDEPENDANT_CODE ON)

# Find the QtWidgets library
find_package(Qt5 REQUIRED Widgets)
include_directories(${} ${Qt5Widgets_INCLUDE_DIRS})

# Executable to create
add_executable(
    tbl
    main.cpp
    tbl.cpp
    )

install(TARGETS tbl RUNTIME DESTINATION bin)

Aller détente, une après-midi/soirée de doc, ça tue grin
(ah tiens, on voit qu'il n'y a rien pour dire comment linker : normal, j'ai inclus des headers Qt, mais pas écrit une ligne de code, donc ça compile... rien grin)



Bon en fait j'arrive pas à lacher embarrassed

Quelle est la différence entre ce qui précède, et ce genre de CMakeLists :
cmake_minimum_required(VERSION 2.8.11)
project(tbl)

# Find the QtWidgets library
find_package(Qt5 REQUIRED Widgets)

# Create target
add_executable(tbl
    main.cpp
    tbl.cpp
    )

target_include_directories(tbl PUBLIC ${Qt5Widgets_INCLUDE_DIRS})
set_target_properties(tbl PROPERTIES
    POSITION_INDEPENDENT_CODE ON
    AUTOMOC ON)

# Installation
install(TARGETS tbl RUNTIME DESTINATION bin)

Comme on voit, les options de CMake sont définies pour un target et non au niveau global. C'est vraiment comme on veut, ou il vaut mieux que je sache quelque chose maintenant ?

55

Folco (./52) :
Pourrais-je savoir d'où sortent ces variables magiques, QT_INCLUDES, QT_QTCORE_LIBRARY et QT_QTGUI_LIBRARY ?

Du find_package(Qt4). La convention pour les variables définies par find_package est simple: x_y, où x est le nom du package (d'habitude, exactement comme écrit dans find_package y compris la casse, Qt4 est une exception avec ses variables en QT_*, les noms ont été normalisés pour Qt5) et y est souvent un de certains noms courants: INCLUDES, LIBRARY, LIBRARIES, … Si tu veux voir exactement ce qui est défini, le mieux est de regarder directement dans le fichier Find*.cmake ou *Config.cmake.
ps -> la boite de configuration d'un projet permet de régler plein de vars de CMake, ça n'interfère pas avec le CMakeList.txt qu'on écrit à la main ? Si on génère ce fichier soi-même, je ne vois pas bien, du coup, l'intéret de la boite de dialogue. Je rate surement un truc.

CMake permet de définir des variables "cached". Ces variables sont enregistrées d'une exécution de CMake à une autre dans CMakeCache.txt et peuvent être modifiées soit directement dans CMakeCache.txt, soit dans la ligne de commande de CMake. Ce sont ces variables que le dialogue te permet de configurer. Elles sont définies dans le CMakeLists.txt en rajoutant CACHE et le nom du type (STRING, BOOLEAN etc.) à la commande set.
Folco (./54) :
set(CMAKE_POSITION_INDEPENDANT_CODE ON)

Attention, ça s'écrit CMAKE_POSITION_INDEPENDENT_CODE, sinon ça n'aura aucun effet!
Comme on voit, les options de CMake sont définies pour un target et non au niveau global. C'est vraiment comme on veut, ou il vaut mieux que je sache quelque chose maintenant ?

Ben, la valeur globale est la valeur par défaut, utilisée si tu ne spécifies rien pour un target particulier. Si tu spécifies la valeur pour un target, ça prend la préférence. Ça permet par exemple de compiler seulement certains targets en PIC (ceux qui finiront dans une bibliothèque dynamique). Soit dit en passant qu'une bibliothèque dynamique est automatiquement PIC, il n'y a besoin de le préciser que pour des bibliothèques statiques qui sont ensuite linkées dans une bibliothèque dynamique dans une étape successive. Un exécutable n'a normalement pas besoin d'être PIC.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

56

Ok, et bien merci pour tout. J'ai pas mal potassé à nouveau.
Utilisant Qt5, j'ai vu que c'est maintenant Qt qui fournit son propre support pour CMake : http://file:///usr/share/doc/cmake-data/html/manual/cmake-qt.7.html et http://doc.qt.io/qt-5/cmake-manual.html (attention, vous devez installer une Debian Testing x86_64 pour visiter le premier lien embarrassed)
D'où les variables parachutées, maintenant ça c'est bon.
A ce niveau, je me suis également aidé d'un petit tuto très bien fait : http://www.kdab.com/using-cmake-with-qt-5/
Kevin Kofler (./55) :
Attention, ça s'écrit CMAKE_POSITION_INDEPENDENT_CODE, sinon ça n'aura aucun effet!

C'est ça quand on veut modifier un post en l'éditant à la main, mais dans mon fichier, c'était bon grin Merci quand meme.

En fait, j'ai fini par virer cette ligne, parce que Qt5 ça powate :
The recommended way to use Qt libraries and headers with CMake 2.8.11 is to use the target_link_libraries command. In CMake 2.8.11 and later versions, this command automatically adds appropriate include directories, compile definitions, the position-independent-code flag
, and links to the qtmain.lib library on Windows.

smile

Merci pour tes conseils sur le côté target/global des settings, c'est à moi de réfléchir en fait, tout simplement.

Pour les variables cached, j'ai pas encore lu de doc à ce sujet, je m'y mets. Je comprends pas trop l'intérêt au premier abord. Pourquoi devoir rajouter CACHE à certaines variables ? Bon en tout cas, pour un projet portable, il me semble mieux de définir ces vars dans CMakeLists.txt, non ?


Ecoute merci pour tout, je vais continuer à plancher, la suite au prochain numéro happy



J'en étais arrivé là hier soir :
CMakeLists.txt
cmake_minimum_required(VERSION 2.8.11)
project(tbl)

# Find the QtWidgets library
find_package(Qt5 REQUIRED Widgets)

# Include that globally, so KDevelop can find the headers
include_directories(tbl PUBLIC
    ${CMAKE_CURRENT_SOURCE_DIR}
    ${Qt5Widgets_INCLUDE_DIRS}
    )

# Create target
add_executable(tbl
    main.cpp
    tbl.cpp
    )

target_compile_options(tbl PUBLIC
    -std=c++11
    )

target_link_libraries(tbl
    ${Qt5Widgets_LIBRARIES}
    )

set_target_properties(tbl PROPERTIES
    AUTOMOC ON
    )

# Installation
install(TARGETS tbl RUNTIME DESTINATION bin)

57

Folco (./56) :
Pour les variables cached, j'ai pas encore lu de doc à ce sujet, je m'y mets. Je comprends pas trop l'intérêt au premier abord. Pourquoi devoir rajouter CACHE à certaines variables ? Bon en tout cas, pour un projet portable, il me semble mieux de définir ces vars dans CMakeLists.txt, non ?

Ça permet d'avoir un projet configurable au moment de la compilation, l'équivalent des arguments de configure. Et bien sûr CMakeLists.txt donne une valeur par défaut, qui peut aussi être calculée à partir d'autres variables. (C'est très pratique pour les répertoires de destination, on met quelque chose comme ${CMAKE_INSTALL_PREFIX}/foo par défaut, mais l'utilisateur qui compile peut aussi choisir n'importe quoi comme dossier.)
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

58

Ok, merci.

Bon, coté purement KDevelop, est-ce qu'il sait faire du refactoring et de la génération de code ?
Je cherche, par exemple, à générer les définitions de méthodes à partir des déclarations, j'ai pas trouvé.
Je cherche également à générer les getters/setters, sans plus de succès.
J'espère que ça existe ?




Parenthèse : j'avais oublié le côté rainbow de KDevelop, perso j'adhère très fort grin

7wr3

love

59

Folco (./58) :
Bon, coté purement KDevelop, est-ce qu'il sait faire du refactoring et de la génération de code ?

Non (enfin, seulement dans une mesure très limitée, il y a quelques rares cas particuliers où il te propose automatiquement certaines transformations), mais il saura le faire bientôt, ce projet GSoC a été accepté.

[EDIT: grammaire]
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

60

Kevin Kofler (./59) :
mais il le saura faire bientôt

Très jolie forme de l'ancien français pour il saura le faire bientôt cheeky

Sinon merci. Tant mieux, que quelqu'un bosse dessus. Je dois dire que je suis assez surpris, parce que ça me semble être des fonctionnalités assez basiques pour un tel programme, ça accroit la productivité, et ça réduit les risque d'erreur.