Zagraniczne znaki

0

Problem jest taki:
Tworzę aplikację wspomagającą naukę języka francuskiego. Potrzebuję dać użytkownikowi możliwość wpisania francuskich znaków. Np. po wciśnięciu ctrl + u powinno wpisać znak: ù
Jakiś pomysł jak to zrobić?
Może istnieje jakiś sposób na np. przedefiniowanie klawiatury?

0

Nie w prost, ale się da. http://java.sun.com/products/jfc/tsc/special_report/kestrel/keybindings.html jest coś takiego jak KeyMap i należy z tego skorzystać. Ostrzegam, że nie testowałem i nie ręczę za pełną poprawność działania ;)

0

Moim zdaniem można się próbować bawić w re-definiowanie polskiej (?) klawiatury, ale rozwiązaniem najprostszym logicznie jest przywiązanie do focusa (konkretnego pola edycyjnego) zmiany mapowania klawiatury, które są ustawione w systemie operacyjnym. Niestety nie jest to rozwiązanie przenośne na różne systemy bo mapowanie klawiatury jest zależne od sterownika w systemie. Kiedy coś takiego potrzebowałem, to używałem jni/jna. Problem z re-definiowaniem polega na tym, że aplikacja tak naprawdę nie wie jakie klawisze są dostępne na używanej klawiaturze, a jakie nie. Natomiast "wie to" system operacyjny oraz użytkownik. Przy takim polu tekstowym warto więc wrzucić kontrolkę do wyboru lub instalacji dowolnego układu klawiatury.

0

korzystam z biblioteki qt, może dałoby się jakimś skrótem klawiszowym coś takiego zrobić?

0

Mega slownik robi to tak ze masz te kilka roznych znakow jako przyciski w GUI. Ma to ta zalete ze dziala jaki iklad klawory czy jezyk nie byl ustawiony. Nie wyobrazam sobie ze uzywam taki program i zeby napisac jakistam znak musze sie nauczyc skrotu klawiszowego, wystarczajaco trudne dla mnie jest CTRL+ i CTRL+V i inne takie, nie wspominajac o mojej mamie, ktora nie umie napisac ź mimo ze jej tlumacze od wielu lat. Nie wiem kto bedzie z tego korzystal, ale wez to pod uwage.

0

Kiedy piszesz po polsku naturalnym jest że używasz "skrótu klawiszowego" dla litery ą.
Niewygodne byłoby, za każdym razem używać przycisku do wstawienia litery.
Probelm w tym, że po przeszukaniu całego internetu 2 razy, dalej nie mam pomysłu jak zrobić coś co zadziała chociaż w przybliżeniu ...

0

Naturalne jest to tylko dla Ciebie i mnie reszty Polakow ktorzy uzywaja ustawienia klawiry Polski-Programisty na 104-klawiszowej klawiaturze z ukladem znakow USA i troche popracowali na kompie. Niemcy nie musza dawac CTRL+U aby dostac u-umlaut, maja do tego specjalny klawisz. Kolega sie bardzo zdziwil jak powiedzialem mu jak piszemy najczesciej polskie znaki. W Polsce tez sa takie klawiry z dedykowanymi znakami, ale nie sa chyba zbyt popularne (chociaz ostatnio w mojej bylej firmie kupili Delle z Lodzi i wlasnie taka maja). Jak user ma inne ustawienia klawiatury, to alt+a wcale nie daje ą. Ponadto nadal twierdze, ze wole klikac w guzik niz uczyc sie 10 nowych skrotow. Nie mam pojecia co prawda jak we francuskim, ale no niemcy maja o-umlaut, i jaki dasz tam skrot? alt+o? A co z ó? Ctrl+O? Wszyscy sa przyzwyczajeni ze to oznacza "File-> Open", itd.
A co powiesz na takie rozwiazanie: dodajesz KeyListenera do danego pola, i masz mape dla znakow. Jesli uruchomiony jest "tryb francuski", to sprawdzasz czy litera == ę, i jesli tak, to robisz lookup w mapie i zwracasz é. Mozesz to zrobic lepiej w sensie:

private static final Map<Character, Character> frenchMapping;

static {
    frenchMapping = new HashMap<Character, Character>();
    frenchMapping.put('ę', 'é');
    // inne znaki
}

public void keyTyped(KeyEvent evt) {
    if (lang.isFrench()) {// jakkolwiek chcesz to sprawdzic
        char c = keyEvent.getKeyChar();
        Character mapped = frenchMapping.get(c); // musi byc Character zeby nie dostac NPE jak nie ma mappingu
        if (mapped != null) {
            c = mapped.charValue();
        }
        // robisz ze znakiem co chcesz, np dodajesz do tekstu w polu tekstowym
}

Cos takiego, moga byc bledy.

0

Hmmm, jest to jakieś rozwiązanie, problem w tym, że rzeczywiście traci się polskie znaki.
Jest to raczej obejście problemu niż rozwiązanie go :(

Z drugiej strony lepsze coś takiego niż nic...

W każdym razie poszukam jeszcze jakiegoś rozwiązania bardziej satysfakcjonującego.
Problem w tym, że w QT wstawienie znaku z przycisku też póki co nie chce za bardzo działać ...
(jeśli by zadziałało mógłbym ustawić jakiś shortcut na wykonanie naciśnięcia przycisku)

0

No po to masz ustawienie w jakim trybie jest user, czy polski czy francuski. No ale to wymaga aby byl dany tryb wlaczony, i jest faktycznie ograniczeniem. Pytanie tylko czy user moze pisac w danym momencie w obu jezykach?
Mozesz tez zrobic takiego listenera, i w nim pytac o kombinacje znakow, np dowiedziec sie ze user wcisnal ctrl+ant+o, poczytaj API KeyEvent. Wtedy mozesz zrobic mape takich kombinacji na znaki, i podobnie mape wykorzystac. Ogolnie nie da sie w sposob standardowy zaimplementowac pisanie w 2 roznych jezykach ktore maja rozne znaki, chyba ze jest taka klawiatura.

0

O tym też myślałem.
Ale nie wiem jak zrobić żeby po takim wciśniętym skrócie klawiszowym wstawił znak do pola tekstowego (QLineEdit)

Właśnie o to chodzi, jest kilka pomysłów na realizację, ale nie chcą działać.

0

AA no tak Ty uzywasz Qt. Na pewno jest spob dodac listenera i w listenerze dostac jakos referencje do pola tekstowego, wzglednie jak dodajesz listenera to utworzyc go i w konstruktorze podac referencje do pola tekstowego.

0

Problem rozwiązany w sposób który mnie satysfakcjonuje.

Tworzę nowy QPushButton ustawiam mu FocusPolicy oraz sygnał:
		ui.pushButton.setFocusPolicy(Qt.FocusPolicy.NoFocus);
		ui.pushButton.clicked.connect(this, "insert()");

Przycisk ten odpowiada za wstawienie litery 'é' do ostatniego aktywnego QlineEditu.
Po wykonaniu akcji, przycisk zwraca focus do tego LineEditu:

public void insert()
{
QLineEdit wid = (QLineEdit) this.focusWidget();
wid.insert("é");
wid.setFocus();
}

Teraz wystarczy tylko dodać skrót klawiszowy do przycisku i stworzyć przyciski dla pozostałych znaków.

Rozwiązanie bardzo proste i dobrze działa. Wstyd że nie udało mi się go zaimplementować wcześniej :)

Pozdrawiam i dzięki za pomoc

1 użytkowników online, w tym zalogowanych: 0, gości: 1