我无法在我的Qt程序中使用死键,而在同一系统上,Qt应用程序(例如konsole或kmail)正确处理它们。
testcase.pro
TEMPLATE = app
TARGET = testcase
INCLUDEPATH += .
QT += core widgets gui
HEADERS += testcase.hpp
SOURCES += testcase.cpp
testcase.hpp
#include <QWidget>
class TestWindow: public QWidget
{
Q_OBJECT
public:
TestWindow(QWidget* parent=0, Qt::WindowFlags flags=0);
void keyPressEvent(QKeyEvent* event);
};
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();
}
编译上面的程序(qmake; make),启动它。死键给出了例如:
QKeyEvent(KeyPress, 1001252, 0, ""^"", false, 1)
QKeyEvent(KeyPress, 45, 0, ""e"", false, 1)
我在期待
QKeyEvent(KeyPress, 234, 0, ""ê"", false, 1)
这也是可以接受的:
QKeyEvent(KeyPress, 1001252, 0, ""^"", false, 1)
QKeyEvent(KeyPress, 234, 0, ""ê"", false, 1)
我正在使用带语言环境的Ubuntu 14.10系统fr_FR.UTF-8
我已经尝试了
使用系统提供的Qt 5.3.0和Qt 4.8.6。
取消设置XMODIFIERS
(默认值为@im=ibus
报告某人有问题)
更改区域设置(再次,谷歌查找报告是点后的部分是一个问题,我已经尝试了4个变种UTF-8
,utf-8
,{{1} }和UTF8
)
在构造函数中有和没有utf8
。
没有改变我的可观察行为。
搜索网页主要(仅限?)系统相关问题。如上所述,我已经尝试了所提出的解决方案,但这并没有解决我的问题以及我尝试过的其他Qt应用程序能够处理死键的事实让我觉得我错过了一些东西。我的代码,尤其是稍微复杂的代码,我可以使用Qt提供的小部件(例如QLineEdit)使用死键。
答案 0 :(得分:1)
这是一个部分答案,但是没有人回答这对以后的人有用。
死键由输入法处理,输入法也处理撰写键以及输入汉字和其他字符的方式。
小部件必须表示它处理输入法:
setAttribute(Qt::WA_InputMethodEnabled, true);
然后它必须覆盖两个虚拟成员:
void inputMethodEvent(QInputMethodEvent*);
QVariant inputMethodQuery(Qt::InputMethodQuery) const;
要处理死键和撰写,似乎就足够了
void TestWindow::inputMethodEvent(QInputMethodEvent* event)
{
if (!event->commitString().isEmpty()) {
QKeyEvent keyEvent(QEvent::KeyPress, 0, Qt::NoModifier,
event->commitString());
keyPressEvent(&keyEvent);
}
event->accept();
}
QVariant TestWindow::inputMethodQuery(Qt::InputMethodQuery) const
{
return QVariant();
}
但是我的回答是不完整的:
我甚至不确定它是否足够
我确信这对于更复杂的书写系统是不够的,我缺乏理解我发现的文档的先决条件。