Je suis incapable de faire fonctionner les touches mortes avec mes programmes utilisant Qt, alors qu'elles fonctionnent pour les programmes fournis avec le système (Ubuntu 14.10, exemples de programmes: konsole, kmail).

Exemple à peu près minimal:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
# testcase.pro
TEMPLATE = app
TARGET = testcase
INCLUDEPATH += .
QT += core widgets gui
 
HEADERS += testcase.hpp
SOURCES += testcase.cpp
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
// testcase.hpp
#include <QWidget>
 
class TestWindow: public QWidget
{
    Q_OBJECT
public:
    TestWindow(QWidget* parent=0, Qt::WindowFlags flags=0);
    void keyPressEvent(QKeyEvent* event);
};
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// testcase.cpp
#include <QApplication>
#include <QDebug>
#include <QWidget>
#include <QKeyEvent>
 
#include "testcase.hpp"
 
TestWindow::TestWindow(QWidget* parent, Qt::WindowFlags flags)
        : QWidget(parent, flags)
{
    setAttribute(Qt::WA_KeyCompression);
}
 
void TestWindow::keyPressEvent(QKeyEvent* event)
{
    qDebug() << event;
}
 
int main(int argc, char** argv)
{
    QApplication app(argc, argv);
 
    TestWindow mainWin;
    mainWin.show();
 
    return app.exec();
}
Compiler avec
Exécuter. Essayer avec une touche morte. J'ai par exemple:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
QKeyEvent(KeyPress, 1001252, 0, ""^"", false, 1) 
QKeyEvent(KeyPress, 45, 0, ""e"", false, 1)
quand je voudrais:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
QKeyEvent(KeyPress, 234, 0, ""ê"", false, 1)
ou
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
QKeyEvent(KeyPress, 1001252, 0, ""^"", false, 1) 
QKeyEvent(KeyPress, 234, 0, ""ê"", false, 1)
J'ai essayé avec Qt 5.3.0 et 4.8.6 tels que fournis avec le système.

J'ai essayé en effacant XMODIFIERS (en faisant des recherches, on trouve des cas où ça semble être le problème).

J'ai essayé en changeant la partie charset de la locale (j'ai essayé UTF-8, utf-8, UTF8 et utf8; à nouveau suite à des recherches).

J'ai essayé avec et sans setAttribute(Qt::WA_KeyCompression); dans le constructeur.

Rien n'a eu d'effet et le fait que les programmes fournis avec le système fonctionne me laisse penser qu'il y a bien un problème dans mon code. Ce qui semble bien être confirmé par un exemple plus complexe: dans le même programme, je peux utiliser convenablement les touches mortes dans un widget fourni par Qt (QLineEdit p.e.), et pas dans le mien.