signal.signal(signal.SIGINT, signal.SIG_DFL)
Sur un Debian Buster tout frais, en cas de error while loading shared libraries: libQt5Core.so.5: cannot open shared object file: No such file or directory
, il faut exécuter : sudo strip --remove-section=.note.ABI-tag /usr/lib64/libQt5Core.so.5
QVariantMap aiaValue = aia.value().toMap();
QCOMPARE(aiaValue.keys(), QList
QString ocsp = aiaValue[QStringLiteral("OCSP")].toString();
Le 3ème argument d'un QObject::connect (le contexte) peut être très utile pour éviter les crash en cas de destruction du pointeur visé dans cet argument. Ou en cas de connexion inter-threads.
On peut ajouter une version de Qt sur sa machine grâce à qtchooser
:
qtchooser -install 5.8 /opt/Qt/5.8.0/bin/qmake
qmake -qt5.8 -v
Luckily, the spin box appearance can be changed by Style Sheet.
To get “Wheel Diameter” style spin box, use following style sheet:
QSpinBox { border: 3px inset grey; }
QSpinBox::up-button { subcontrol-position: left; width: 40px; height: 35px;}
QSpinBox::down-button { subcontrol-position: right; width: 40px; height: 35px;}
To get “Pulses per Revolution” style spin box, use following style sheet:
QSpinBox { border: 3px outset grey;padding-right: 40px;}
QSpinBox::up-button { subcontrol-position: right; right: 40px; width: 40px; height: 35px;}
QSpinBox::down-button { subcontrol-position: right; width: 40px; height: 35px;}
To get “Count” style spin box, use following style sheet:
QSpinBox { border: 3px groove gray}
QSpinBox::up-button { subcontrol-position: top right; width: 40px; height: 19px;}
QSpinBox::down-button { subcontrol-position: bottom right; width: 40px; height: 19px;}
Un autre post sur les QThread. Quand on connaît un tantiner le sujet, on peut commencer par celui-là pour remettre les pendules à l'heure.
When adding some files to INSTALLS, they are stripped if they are excecutables.
To avoid using strip, you can update "QMAKE_STRIP" variable and force stripping executables one by one using ".extra":
target.extra = strip $${DESTDIR}/$(TARGET)
QMAKE_STRIP = echo # Avoid striping unwanted files (which will not work)
applibs.files = $${DESTDIR}/*.so*
applibs.path = $$EXPORT_LIBPATH
INSTALLS += applibs
Un autre post sur les QThread.
Hier, j'ai releasé la v0.2.6 de Qompoter, a C++/Qt dependency manager. Outre les améliorations apportées au truc (recherche récursive des paquets, numéros de versions flous du genre v1.*, recherche des paquets dans Inqlude), cela m'a aussi permis de découvrir les scripts d'auto-complémetion Bash ! Et je surkiffe taper qompoter tab tab
et voir la liste des actions possibles apparaître "install export inqlude jsong". C'est beau Linux.
Qompoter a atteint un niveau de maturité suffisant pour les petits projets, alors n'hésitez pas ! Vos retours sont les bienvenues.
Très pratique le fichier .qmake.conf.
Oui, un framework Web en Qt.
Premiers essais de CMake aujourd'hui :-) Depuis le temps que je souhaitais m'y frotter.
J'aimerai bien que mon petit projet Qompoter (https://github.com/Fylhan/qompoter) sache faire du qmake et du CMake
S seulement on pouvait parler d'avantage d'inqlude !
ça commence à dater, mais c'est vital pour faire une configuration avancée via qmake.
Another one: http://paulf.free.fr/undocumented_qmake.html
Voilà qui est encore mieux !!!
OCTAVE_FILES = $$files($${PWD}/scripts/*.m)
copy_files.name = Copy scripts
copy_files.input = OCTAVE_FILES
copy_files.output = $${OUT_PWD}/data/${QMAKE_FILE_BASE}${QMAKE_FILE_EXT}
copy_files.commands = ${COPY_FILE} ${QMAKE_FILE_IN} ${QMAKE_FILE_OUT}
copy_files.CONFIG += no_link target_predeps
QMAKE_EXTRA_COMPILERS += copy_files
copydata.commands = $(COPY_DIR) $$PWD/data $$OUT_PWD
first.depends = $(first) copydata
export(first.depends)
export(copydata.commands)
QMAKE_EXTRA_TARGETS += first copydata
Edit : encore mieux -> http://links.la-bnbox.fr/?kqGppw
Cannot find -lGL ? sudo apt-get install libgl1-mesa-dev
Cette bibliothèque Qt pour lancer un serveur ou un client HTTP semble idéale (licence MIT). Plus aboutie que QHttpServer (https://github.com/nikhilm/qhttpserver, licence MIT aussi).
ça fait plusieurs développeurs Node.js que je vois aussi faire du C++ avec beaucoup de talent. C'est bien les gars ;-)
Voilà qui est bien pratique ! Il faut que je teste si une même génération fonctionne pour Linux et Windows, ou s'il y a des liens absolus...
Premier article d'une série sur les tests en Qt / C++.
QList<QMdiSubWindow > subWindows = ui->mdiArea->subWindowList();
QMdiSubWindow mySubWindow = subWindows.at(0);
mySubWindow->setWindowIcon(QIcon());
class Switch : public State
{
public:
int a;
};
QSharedPointer
QSharedPointer
C'est mieux que (Switch*)myState.data() non ?
Inqlude: http://inqlude.org/
Qt Apps : http://qt-apps.org/
Site officiel : http://qt-project.org/wiki/Category:Add-ons
Sur Github : https://github.com/search?nwo=0TheFox0%2FOpenChart&p=7&q=qt+plugin&ref=cmdform&search_target=global&type=Repositories
Le concept de lock-free programming est vraiment intéressant : empêcher les possibilités de blocages, ou les erreurs lors de l'utilisation d'une mémoire partagée entre plusieurs threads. L'idée étant de ne pas utiliser de mutex, et soit de séquentialiser l'accès à la mémoire partagée, soit d'utiliser des petites opérations atomiques (qui seront exécutée sans interruptions).
Il n'est pas tellement vraisemblable de créer un gros programme lock-free, l'idée est plutôt de rester pragmatique et de faire interagir plusieurs parties lock-free entres elles.
Le gain en performance par rapport à des mutex est assez flagrant. Et c'est à mettre en place pour coder efficacement sur du multi-processeur. Mais les compétences pour une mise en œuvre correcte sont aussi plus grandes.
"So keep mutexes, unless you have a lot of lock contention or are looking for a challenge."
Une autre ressource sur le sujet :
http://woboq.com/blog/introduction-to-lockfree-programming.html
Et comment gérer des opérations atomiques en Qt :
http://qt-project.org/doc/qt-5/qatomicint.html
"When you move a parent QObject, all its children are automatically moved too.
Remember though that member variables do not automatically become children; the parent-child relationship must be set by either:
J'ai comme le sentiment que cette remarque devrait être beaucoup plus visible dans les tutoriels sur les threads Qt !!!
Une définition assez claire de "thread-safe" et "reentrant".
Excellente explication sur la GUI Qt (widgets) : fenêtre, dock, etc...
Ok, je crois que je vais me coltiner ça.
Apparement, voici la liste des DLL nécessaires pour faire tourner un programme sous Qt5 :
Des bibliothèques (et exemples d'applications) sous Qt pouvant s'avérer utiles à l'occasion.
En attendant de détailler mes bidouilles, ou de tester des bibliothèques tierces, voici au moins un petit état de l'art de ce que j'ai trouvé pour dessiner des graphiques / courbes / histogrammes en Qt.
Utilisation avancée de qmake, notamment la gestion des variables. Voilà ce que je cherchais depuis quelques temps...
Du coup, j'en ai fait un article :-) J'en profite pour ajouter pas mal d'autres erreurs que j'ai rencontré avec les signaux / slots de Qt.
Arg, pour connecter un QObject qui a été forward declared (class MyQObject dans le .h de l'utilisateur), il ne faut pas oublier d'inclure réellement le .h du QObject (dans le .cpp de l'utilisateur) pour éviter l'erreur à la compile : "No matching function for call to connect".
Ne jamais, JAMAIS (jamais !) créer la méthode "connect" dans un QObject en Qt !
Je comprends enfin pourquoi ce fichu signal ne voulait pas se connecter à ce sacré slot ! Eh bah voilà : une méthode "connect" (censée, je cite, "Start the connection to the remote server") qui surcharge bien malencontreusement la méthode "QObject::connect" ce qui nous donne "error : no matching function for call to 'MyGreatObject::connect(AnOtherObject&, const char, MyGreatObject const, const char)'".
C'est bête hein ?
Rah!
QString de Qt : "Tant que l'objet est copié, passé en paramètre, .... l'objet n'est pas dupliqué (tous les objets pointes vers le même espace mémoire)."
Eh je ne savais pas que QString était un QSharedDataPointer ! Bien !
Pourquoi n'est-ce pas le cas des String en Java ? Sur un gros projet auquel je participe, des devs se sont "amusés" à concaténer crapuleusement des String Java. Et hop, une nouvelle instance de String à chaque fois ! La mémoire globale le ressent... et franchement, on n'avait pas besoin de ça !