Qt - Как получить азиатский (например, корейский) символ в QFrame - PullRequest
0 голосов
/ 02 апреля 2020

Извините за мой ужасный Энгли sh, поэтому, пожалуйста, потерпите меня.

Я пытаюсь создать windows программу для блокнота. Я уже сделал это с помощью MF C, но на этот раз я хочу ИЗМЕНИТЬ свой Блокнот с помощью Qt.

Вот мой код о добавлении символа Engli sh в QFrame. В MF C этот код может в OnChar ().

void Notepad::keyPressEvent(QKeyEvent *event) {
    int key = event->key();
    //==========OnKeyDown==========
    KeyActionFactory keyActionFactory(this);
    KeyAction *keyAction = keyActionFactory.Make(key);

    if (keyAction != 0) {
        keyAction->OnKeyDown();
        delete keyAction;
    }
    //==========OnKeyDown========== 

    //==========OnChar==========
    GlyphFactory glyphFactory;
    char content[2];
    Long index;
    bool isShiftOrNo =
        (event->modifiers() == Qt::ShiftModifier) || (event->modifiers() == Qt::NoModifier);

    if (isShiftOrNo && key >= Qt::Key_Space && key <= Qt::Key_AsciiTilde || key == Qt::Key_Tab) {
        if (this->highlight != NULL) {
            this->editor->Delete();
        }
        content[0] = *event->text().toLocal8Bit().data();
        Glyph *character = glyphFactory.Make(content);

        index = this->current->GetCurrent();

        if (index >= this->current->GetLength()) {
            this->current->Add(character);
        }
        else {
            this->current->Add(index, character);
        }
    }
    else if (isShiftOrNo && key == Qt::Key_Return) {
        if (this->highlight != NULL) {
            this->editor->Delete();
        }
        index = this->current->GetCurrent();

        if (index < this->current->GetLength()) {
            this->current = this->current->Divide(index);
            index = this->note->GetCurrent();
            this->note->Add(index + 1, this->current);
            this->current->First();
        }
        else {
            this->current = glyphFactory.Make("\r\n");
            index = this->note->GetCurrent();
            this->note->Add(index + 1, this->current);
        }
    }

    //==========OnChar==========


    this->Notify();
    this->repaint();
}

Этот код успешен. Но я не знаю, как получить корейский символ в Qt. В MF C я успешно справляюсь с макросом ON_MESSAGE. например:

BEGIN_MESSAGE_MAP(NotepadForm, CFrameWnd)
    ON_MESSAGE(WM_IME_COMPOSITION, OnImeComposition)
    ON_MESSAGE(WM_IME_CHAR, OnImeChar)
    ON_MESSAGE(WM_IME_STARTCOMPOSITION, OnImeStartComposition)
END_MESSAGE_MAP()

LRESULT Notepad::OnImeComposition(WPARAM wParam, LPARAM lParam) {
    char buffer[2];
    Long index;

    if (lParam & GCS_COMPSTR) {
        buffer[0] = (TCHAR)HIBYTE(LOWORD(wParam));
        buffer[1] = (TCHAR)LOBYTE(LOWORD(wParam));

        if (this->isComposing == true) {
            index = this->current->GetCurrent();
            this->current->Remove(index - 1);
        }

        if (buffer[0] != '\0') {
            this->isComposing = TRUE;
            GlyphFactory glyphFactory;
            Glyph *doubleByteCharacter = glyphFactory.Make(buffer);
            index = this->current->GetCurrent();

            if (index >= this->current->GetLength()) {
                this->current->Add(doubleByteCharacter);
            }
            else {
                this->current->Add(index, doubleByteCharacter);
            }
        }
        else {
            this->isComposing = FALSE;
        }
        this->Notify();
        this->repaint();
    }

    return ::DefWindowProc((HWND)this->winId(), WM_IME_COMPOSITION, wParam, lParam);
}

LRESULT Notepad::OnImeChar(WPARAM wParam, LPARAM lParam) {
    char buffer[2];
    Long index = this->current->GetCurrent();
    this->current->Remove(index - 1);

    if (IsDBCSLeadByte((BYTE)(wParam >> 8)) == TRUE) {
        buffer[0] = (TCHAR)HIBYTE(LOWORD(wParam));
        buffer[1] = (TCHAR)LOBYTE(LOWORD(wParam));
    }
    else {
        buffer[0] = (TCHAR)wParam;
    }

    GlyphFactory glyphFactory;
    Glyph *glyph = glyphFactory.Make(buffer);

    if (this->current->GetCurrent() >= this->current->GetLength()) {
        this->current->Add(glyph);
    }
    else {
        this->current->Add(this->current->GetCurrent(), glyph);
    }

    this->isComposing = FALSE;
    this->Notify();
    this->repaint();


    return 0;
}

LRESULT Notepad::OnImeStartComposition(WPARAM wParam, LPARAM lParam) {
    return 0;
}

Аргумент wParam содержит информацию о корейском символе. Поэтому я просто беру это и добавляю в блокнот. Но в Qt нет реакции на переключение клавиш при смене языка. И кажется, что нет никакого события для сообщения IME windows в QFrame, QWidget и др. c.

. Я рассмотрел перехват сообщений. Но Qt не игнорирует сообщение IME windows (я нашел его в коде QtWndPro c). И я предполагаю, что Qt обеспечивает ввод азиатского символа.

Я также подумал об использовании проекта Virtual Keyboard (я точно не знаю, что это такое). Но я полагаю, что это средство не подходит для моей цели.

Существует ли руководство для ручки, не являющейся английским sh? Теперь я обращаю внимание на Qt :: Key_Hangul, но я расстроен.

Спасибо за чтение ужасного английского языка sh, Спасибо за помощь.

Решено: i был очень глупым. В классе QWidget есть функция inputMethodEvent. Это работает хорошо. Спасибо.

...