Ich bin leider nicht früher dazu gekommen, aber dafür kann ich jetzt auch die Lösung am Beispiel eines QLineEdit präsentieren.
Mal sehen was die Forensoftware aus Unicode Inhalten macht! ( sieht ja ganz gut aus)
Code: Alles auswählen
#include "grlineedit.h"
#include <Qt>
//
// Achtung !! Diese Tabelle / Klasse gilt nicht für das Altgriechische !
// sondern für die moderne griechische Sprache
// wchar_t wird als literal definiert mit dem prefix L also z.B. L'x'
wchar_t charMap[26][5]=
{
{ 'A',L'Α',L'α',L'Ά',L'ά'},
{ 'B',L'Β',L'β',0,0},
{ 'C',L'Ψ',L'ψ',0,0},
{ 'D',L'Δ',L'δ',0,0},
{ 'E',L'Ε',L'ε',L'Έ',L'έ'},
{ 'F',L'Φ',L'φ',0,0},
{ 'G',L'Γ',L'γ',0,0},
{ 'H',L'Η',L'η',L'Ή',L'ή'},
{ 'I',L'Ι',L'ι',L'Ί',L'ί'},
{ 'J',L'Ξ',L'ξ',0,0},
{ 'K',L'Κ',L'κ',0,0},
{ 'L',L'Λ',L'λ',0,0},
{ 'M',L'Μ',L'μ',0,0},
{ 'N',L'Ν',L'ν',0,0},
{ 'O',L'Ο',L'ο',L'Ό',L'ό'},
{ 'P',L'Π',L'π',0,0},
{ 'Q',0,0,0,0},
{ 'R',L'Ρ',L'ρ',0,0},
{ 'S',L'Σ',L'σ',0,0},
{ 'T',L'Τ',L'τ',0,0},
{ 'U',L'Θ',L'θ',0,0},
{ 'V',L'Ω',L'ω',L'Ώ',L'ώ'},
{ 'W',L'Σ',L'ς',0,0},
{ 'X',L'Χ',L'χ',0,0},
{ 'Y',L'Ζ',L'ζ',0,0},
{ 'Z',L'Υ',L'υ',L'Ύ',L'ύ'},
};
grLineEdit::grLineEdit(QWidget * /*widget*/)
: QLineEdit()
{
// Betonungszeichen rücksetzen
accent = false;
}
//
void grLineEdit::keyPressEvent ( QKeyEvent * event ){
int key = event->key();
// im griechischen gibt es ein Betonungszeichen (accent) ' das auf die Vokale gesetzt
// werden kann
// dazu zuerst die Taste 'ö' ( ö ~ 214 ) und dann das entsprechende Zeichen tippen.
// so wird aus 'ö' 'a' ein ά und nicht ein α
if ( key == 16777248 ) return;
// Nur Shift Taste wurde gedrückt
if ( ( key == 214 ) & (! event->modifiers()) ) {
// Betonungszeichen setzen
accent = true;
} else {
// nur das Alphabet A - Z wird umgesetzt
// alle anderen Tasten bleiben an der gewohnten Position erhalten
if ( (key >= Qt::Key_A) & (key <= Qt::Key_Z) ) {
event->ignore();
// das wären die 'kleinen' Buchstaben
int index = 2;
// und mit Shift natürlich die 'großen'
if ( event->modifiers() & Qt::ShiftModifier ) index--;
// nach Bedarf mit Betonungszeichen
if ( accent ) index +=2;
// nur Zeichen != 0 werden eingefügt
if ( wchar_t c = charMap[key-65][index] ) insert(QString(c));
} else {
// für alle anderen Zeichen der Tastatur wird der originale
// Eventhandler aufgerufen
QLineEdit::keyPressEvent(event);
}
// Betonungszeichen rücksetzen
accent = false;
}
}