繁体   English   中英

自定义小部件中的Qt和死键

[英]Qt and dead keys in a custom widget

问题

我无法在我的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) 

我试过的

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

我试过了

  • 系统提供的Qt 5.3.0和Qt 4.8.6。

  • unseting XMODIFIERS (默认值为@im=ibus被某些人报告为问题)

  • 更改区域设置(再次,谷歌查找报告是点后的部分是一个问题,我尝试了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();
}

但那是我的答案是不完整的:

  1. 即便如此,我也不确定它是否足够

  2. 我确信这对于更复杂的书写系统是不够的,我缺乏理解我发现的文档的先决条件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM