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 !

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

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.

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

214

(non non, ils résolvent mon problème et *ensuite* je leur en achète un grin)

215

(pfff, tu veux la mort des quelques auteurs français restants, toi grin)
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

216

(ah ben il faut savoir, ils sont bons ou pas ? gni)

217

(ils le sont, mais ils ont besoin de manger aussi ^^)
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

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

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

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.

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

222

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



(non en fait j'en sais rien du tout cheeky)
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

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

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

225

La bonne question étant : "est-ce que c'est garanti ?" grin
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

226

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

• Folco ressort sa bible

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.

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

229

Ok, merci ! top