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?
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 ;)
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.
korzystam z biblioteki qt, może dałoby się jakimś skrótem klawiszowym coś takiego zrobić?
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.
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 ...
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.
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)
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.
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ć.
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.
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