Извините за мой ужасный Энгли 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. Это работает хорошо. Спасибо.