问题

我无法在我的 Qt 程序中使用死键,而在同一系统上 Qt 应用程序(例如 konsole 或 kmail)正在正确处理它们。

如何繁殖

testcase.pro

TEMPLATE = app
TARGET = testcase
INCLUDEPATH += .
QT += core widgets gui

HEADERS += testcase.hpp
SOURCES += testcase.cpp

测试用例.hpp
#include <QWidget>

class TestWindow: public QWidget
{
    Q_OBJECT
public:
    TestWindow(QWidget* parent=0, Qt::WindowFlags flags=0);
    void keyPressEvent(QKeyEvent* event);
};

测试用例.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)

我试过的

我正在使用语言环境为 fr_FR.UTF-8 的 Ubuntu 14.10 系统

我试过了
  • 与系统上提供的 Qt 5.3.0 和 Qt 4.8.6。
  • 取消设置 XMODIFIERS(默认值是 @im=ibus 被一些人报告了一个问题)
  • 更改语言环境(再次,google find 报告是点之后的部分问题,我尝试了 4 个变体 UTF-8utf-8UTF8utf8 )
  • 在构造函数中有和没有 setAttribute(Qt::WA_KeyCompression);

  • 没有改变我可观察到的行为。

    搜索网络显示主要(仅?)系统相关问题。如上所述,我已经尝试了建议的解决方案,这并没有解决我的问题,而且我尝试过的其他 Qt 应用程序能够处理死键这一事实让我觉得我错过了我的代码中的某些内容,尤其是那些一个稍微复杂一点的例子,我可以在 Qt 提供的小部件(例如 QLineEdit)中使用死键。

    最佳答案

    这是部分答案,但没有人回答,这可能对以后的人有用。

    死键由输入法处理,输入法也处理组合键以及汉字和其他字符的输入方式。

    小部件必须表明它处理输入法:

    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();
    }
    

    但那是我的回答不完整:
  • 我不确定即使对于那个
  • 是否真的足够
  • 我确信这对于更复杂的书写系统来说是不够的,而且我缺乏理解我找到的文档的先决条件。
  • 关于c++ - 自定义小部件中的 Qt 和死键,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28793356/

    10-11 23:04
    查看更多