Russian Qt Forum
Ноябрь 23, 2024, 04:40 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Виртуальная клавиатура  (Прочитано 5885 раз)
porex
Гость
« : Январь 23, 2012, 20:55 »

Доброго времени суток!
Делаю виртуальную клавиатуру на основе контекста ввода. Все функции взяты из примера Input Panel Example, сделал только классы другие и форму с клавиатурой. В итоге при нажатии на поле ввода отсылается событие QEvent::RequestSoftwareInputPanel и сразу же за возникает событие QEvent::CloseSoftwareInputPanel, вследствие чего клавиатура закрывается, так и не успев появиться. Думаю что-то связано с фокусом поля ввода, но ошибку пока не нашел. Сижу под Ubunt'ой.
Записан
ddrtn
Гость
« Ответ #1 : Январь 24, 2012, 07:37 »

У всех элементов виртуальной клавиатуры (кнопки или еще там чего ) нужно выставить focusPolicy в NoFocus.
+ в наследнике от контекста ввода заменить
Код:
	if (!w) return;

int key = 0;
if(character == QChar(QLatin1Char(8))) key = Qt::Key_Backspace;
else key = character.unicode();

QKeyEvent keyPress(QEvent::KeyPress, key, Qt::NoModifier, QString(character));
QApplication::sendEvent(w, &keyPress);

if (!w) return;

QKeyEvent keyRelease(QEvent::KeyPress, key, Qt::NoModifier, QString());
QApplication::sendEvent(w, &keyRelease);
на
Код:
	if (!w) return;

int key = 0;
if(character == QChar(QLatin1Char(8))) key = Qt::Key_Backspace;
else key = character.unicode();

QKeyEvent keyPress(QEvent::KeyPress, key, Qt::NoModifier, QString(character));
QApplication::sendEvent(w, &keyPress);

if (!w) return;

QKeyEvent keyRelease(QEvent::KeyRelease, key, Qt::NoModifier, QString());
QApplication::sendEvent(w, &keyRelease);

(если исходники взяты из примера. функция void InputPanelContext::sendCharacter(QChar character))
Записан
porex
Гость
« Ответ #2 : Январь 24, 2012, 21:08 »

Огромное спасибо! Как-то не догадался((
Записан
NicK
Гость
« Ответ #3 : Январь 25, 2012, 10:03 »

А возможно ли вернуть стандартный InputContext на лету?
т.е.  можно ли во время выполнения программы после этого             
Код
C++ (Qt)
MyInputPanelContext *ic = new MyInputPanelContext;
qApp->setInputContext(ic);


вернуть в зад стандартный QInputContext или это уже необратимая процедура?
Записан
empirik
Гость
« Ответ #4 : Май 05, 2012, 08:25 »

У меня другая проблема. На виртуальной клавиатуре сделал кнопку закрыть. При ее нажатии клавиатура скрывается (вызывается метод hide у QWidjet). Но после этого не показываться только тень от виджета, а самого виджета просто не видно. Все вроде сделал, как в выше описанном примере, но остался лишь выше описанный глюк. Подскажите в какую сторону копать.
Записан
Андрей
Гость
« Ответ #5 : Июнь 12, 2012, 17:09 »

А у меня почему-то клавиши не нажимаются на клавиатуре и вообще она не реагирует на мышь. Если убрать функцию event(QEvent *e), начинает реагировать.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.067 секунд. Запросов: 21.