QKeyEvent::text() не возвращает букву акцента в Linux

Кто-нибудь знает, почему QKeyEvent::text() для ввода ` + a возвращает одну пустую строку и одну букву a вместо одной пустой string и à в Linux? Под Windows это работает нормально (одно и то же приложение работает под Windows и Linux).

Я обрабатываю нажатые клавиши с помощью этого класса .


person Damir Porobic    schedule 01.02.2020    source источник


Ответы (1)


Вы должны включить атрибут Qt::WA_InputMethodEnabled в дополнение к переопределению метода inputMethodEvent:

#include <QtWidgets>

class Widget: public QWidget{
public:
    Widget(QWidget *parent=nullptr): QWidget(parent){
        setAttribute(Qt::WA_InputMethodEnabled, true);
    }
protected:
    void keyPressEvent(QKeyEvent *event){
        qDebug() << "keyPressEvent" << event->text();
        QWidget::keyPressEvent(event);
    }
    void inputMethodEvent(QInputMethodEvent *event){
        qDebug() << "inputMethodEvent" << event->commitString();
        QWidget::inputMethodEvent(event);
    }
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    return a.exec();
}
person eyllanesc    schedule 01.02.2020
comment
Спасибо за ответ. К сожалению, я использую не виджет для ввода текста, а класс, наследуемый от QGraphicsItem. Установка Qt::WA_InputMethodEnabled дает запись консоли, в которой говорится, что атрибут не поддерживается. Я перезаписал метод, который вы упомянули, но он не вызывается. - person Damir Porobic; 02.02.2020
comment
Я думаю, я понял, это должно быть setFlag(QGraphicsItem::ItemAcceptsInputMethod, true); Похоже, что метод теперь дает мне правильный текст. Нужно перепроверить. - person Damir Porobic; 02.02.2020
comment
Да, работает сейчас. KeyPressEvent срабатывает для обычных латинских букв, при появлении составной буквы срабатывает InputMethod. Спасибо за вашу помощь. - person Damir Porobic; 02.02.2020
comment
О, это также исправляет ввод китайских иероглифов, который раньше не работал в моем случае и, кажется, работает сейчас. - person Damir Porobic; 04.02.2020