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:
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 |
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);
}; |
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:
1 2
| QKeyEvent(KeyPress, 1001252, 0, ""^"", false, 1)
QKeyEvent(KeyPress, 45, 0, ""e"", false, 1) |
quand je voudrais:
QKeyEvent(KeyPress, 234, 0, ""ê"", false, 1)
ou
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.
Partager