210

Bon, mon dernier problème est le suivant :
Je récupère un QKeyEvent, qui a une méthode key(), censée retourner un code de cette énumération : http://doc.qt.io/qt-5/qt.html#Key-enum
Quand je tape la touche D et lis la valeur, au débogueur, je vois $6B7CDF4F. J'aurais pensé trouver $44, ou Qt::Key_D, comme l'indique la doc. La valeur semble donc complètement aberrante.
Hors, si je crée un QKeySequence sequence(event->key()), sur lequel j'applique la méthode sequence->toString(), je retrouve bien ma chaine "D" !

J'imagine donc que Qt a un secret qui se trouve par là-bas, du côté de la ligne 1290, mais auquel je ne comprends pas grand chose.
Si l'un de vous comprend comment Qt fait en interne, je prends volontiers, merci d'avance !
avatar<<< Kernel Extremist©®™ >>>
Feel the power of (int16) !

211

Es-tu sûr que tu regardes au bon moment? Si tu débogues du code optimisé, le débogueur traverse parfois plusieurs fois tes lignes de code, et la variable n'est pas forcément correctement initialisée après le premier passage.
avatarMes 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é

212

Le code est compilé en mode Debug, j'espère que Qt Creator règle correctement ce mode par défaut. Mais ça vaut le coup de jeter un oeil en effet.
Après, je vois le débogueur s'arrêter dès que j'appuie sur une touche quand mon widget a le focus, et le code n'est pas parcouru plusieurs fois, donc je ne pense pas que ce soit ça.
avatar<<< Kernel Extremist©®™ >>>
Feel the power of (int16) !

213

J'avoue que je ne pige pas non plus d'après les sources. La valeur que tu obtiens me semble effectivement très suspecte. Essaie sans le débugueur, en faisant une simple conversion hexa->texte et en l'affichant quelque part ?

J'ai regardé aussi du côté de QKeyEvent::key(), mais c'est un simple getter pour une variable qui s'appelle k (voilà qui facilite les recherches dans le code grin), dans qevent.h, lignes 335 et 366. J'ai pas trouvé ce qui écrit dans cette variable (mais bon, sans IDE et dans une base de code que je connais pas...)

sinon, j'ai des potes qui écrivent un bouquin sur Qt en ce moment, si tu leur en achètes un exemplaire peut-être qu'ils voudront bien te faire du support personnalisé grin
avatarZeroblog

« 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

214

(non non, ils résolvent mon problème et *ensuite* je leur en achète un grin)
avatar<<< Kernel Extremist©®™ >>>
Feel the power of (int16) !

215

(pfff, tu veux la mort des quelques auteurs français restants, toi grin)
avatarZeroblog

« 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

216

(ah ben il faut savoir, ils sont bons ou pas ? gni)
avatar<<< Kernel Extremist©®™ >>>
Feel the power of (int16) !

217

(ils le sont, mais ils ont besoin de manger aussi ^^)
avatarZeroblog

« 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

218

(Comment ça, pourtant Qt est libre ! grin)

Bon, je me suis encore cassé les dents sur cette fameuse méthode key(). Apparemment, elle retourne un mix de modifieurs en même temps que le code de touche, j'ai l'impression que je me suis approché de la vérité sans complètement décrypté sick
Donc plutôt qu'un bouton standard dans lequel je reconstituais le texte, j'ai dérivé la classe QKeySequenceEdit qui s'occupe de la saisie de séquences de 4 touches (Emacs' style), chacune étant combinée éventuellement à des modifieurs.
J'intercepte les évènements claviers, j'en tire le code VirtualKey, et je reconstitue les modifieurs natifs.
Au passage, j'interdis la touche Windows et je limite la séquence à une seule combinaison de touche.
Mais surtout, je laisse le widget se démerder pour afficher ce que je tape. Et ça, c'est le pied :
HotkeyInputWidget
#include "HotkeyInputWidget.hpp" #include <QKeyEvent> #include <QKeySequence> HotkeyInputWidget::HotkeyInputWidget() : nativeModifiers(0) , nativeVirtualKey(0) { this->installEventFilter(this); } HotkeyInputWidget::~HotkeyInputWidget() { } bool HotkeyInputWidget::isValid() const { return this->nativeVirtualKey != 0; } bool HotkeyInputWidget::eventFilter(QObject* object, QEvent* event) { if (event->type() == QEvent::KeyPress) { QKeyEvent* keyEvent = static_cast<QKeyEvent*>(event); // If there is already a key sequence, and if it has been validly defined, // clear it to enter a new one if (!this->keySequence().isEmpty() && (this->nativeVirtualKey != 0)) { this->clear(); } // Forbid the Meta key Qt::KeyboardModifiers modifiers = keyEvent->modifiers(); if (modifiers & Qt::META) { return true; } // Save the modifiers if (modifiers & Qt::CTRL) { this->nativeModifiers += MOD_CONTROL; } if (modifiers & Qt::ALT) { this->nativeModifiers += MOD_ALT; } if (modifiers & Qt::SHIFT) { this->nativeModifiers += MOD_SHIFT; } // Forbid a shortcut without any modifier if (modifiers == 0) { return true; } // Save the virtual key this->nativeVirtualKey = keyEvent->nativeVirtualKey(); } return QObject::eventFilter(object, event); }
J'ai donc ce que je veux, mais c'est dommage que je n'ai pas réussi à décrypter ce bordel de la classe QKeyEvent sad

Merci beaucoup pour votre aide en tout cas ! smile
avatar<<< Kernel Extremist©®™ >>>
Feel the power of (int16) !

219

smile

Tu devrais poser la question sur le forum de Qt, ou faire un bug report sur le fait que c'est pas clair.
avatarZeroblog

« 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

220

J'ai posé hier soir, pas de réponse encore grin
J'ai demandé à propos des modifieurs natifs pas natifs, et que faire de key qui n'est pas une Qt::Key comme le dit la doc.
avatar<<< Kernel Extremist©®™ >>>
Feel the power of (int16) !

221

https://github.com/Folcogh/FilesRenamer/blob/master/MainWindow.cpp#L115

On peut m'expliquer pourquoi la ligne ui->editDestination->clear(); provoque une assertion de Qt sous Windows, pour une histoire de sizeof je sais pas quoi ?
Ca marche impec sous Linux...
avatar<<< Kernel Extremist©®™ >>>
Feel the power of (int16) !

222

Parce que la version Windows de Qt est buguée, quelle question embarrassed



(non en fait j'en sais rien du tout cheeky)
avatarZeroblog

« 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

223

        bsr.s   \Push
        dc.b    "Reloading old topic..."
\Push:  jsr     pedrom::printf
        addq.l  #4,sp
        rts

yop,

Je me remets au C++, et j'ai un truc qui me turlupine...

J'ai un objet A.
Cet objet A possède un objet B : pas juste un pointeur vers B, mais bien une instance de B.
Quand j'instancie un objet A, B est donc créé avant le début de la création de A.

Question : est-ce que ~B() est appelé si A() lance une exception ?

Merci d'avance. smile
avatar<<< Kernel Extremist©®™ >>>
Feel the power of (int16) !

224

#include <iostream>
#include <exception>

class B {
    public:
        B() { std::cout << "construction" << std::endl; }
        ~B() { std::cout << "destruction" << std::endl; }
};

class A {
    public:
        A() { throw std::exception(); }
    private:
        B b;
};

int main()
{    try {
        A a;
    }
    catch (std::exception) {
        std::cout << "exception" << std::endl;
    }
}
Bon, et bien voilà la sortie :
construction
destruction
exception

Désolé pour cette question de n00b cheeky

pffff, faut tout faire soi-même sur ce forum embarrassed
avatar<<< Kernel Extremist©®™ >>>
Feel the power of (int16) !

225

La bonne question étant : "est-ce que c'est garanti ?" grin
avatarZeroblog

« 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

226

Ah, c'est pas normalisé ce comportement ? confus

• Folco ressort sa bible
avatar<<< Kernel Extremist©®™ >>>
Feel the power of (int16) !

227

Bon ben Claude Delannoy me dit que [...] il entraine l'appel du destructeur de tout objet automatique déjà construit et devenant hors de portée.

D'un autre côté, c'est le seul moyen de garantir la destruction des objets automatiques.
avatar<<< Kernel Extremist©®™ >>>
Feel the power of (int16) !

228

Normalement, les exceptions respectent toujours les destructeurs, donc si le compilateur fait son travail correctement, ça devrait toujours être le cas aussi dans la situation que tu présentes. C'est sans doûte écrit quelque part dans un paragraphe du standard C++.
avatarMes 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é

229

Ok, merci ! top
avatar<<< Kernel Extremist©®™ >>>
Feel the power of (int16) !