Russian Qt Forum

Qt => Общие вопросы => Тема начата: porex от Январь 23, 2012, 20:55



Название: Виртуальная клавиатура
Отправлено: porex от Январь 23, 2012, 20:55
Доброго времени суток!
Делаю виртуальную клавиатуру на основе контекста ввода. Все функции взяты из примера Input Panel Example, сделал только классы другие и форму с клавиатурой. В итоге при нажатии на поле ввода отсылается событие QEvent::RequestSoftwareInputPanel и сразу же за возникает событие QEvent::CloseSoftwareInputPanel, вследствие чего клавиатура закрывается, так и не успев появиться. Думаю что-то связано с фокусом поля ввода, но ошибку пока не нашел. Сижу под Ubunt'ой.


Название: Re: Виртуальная клавиатура
Отправлено: ddrtn от Январь 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))


Название: Re: Виртуальная клавиатура
Отправлено: porex от Январь 24, 2012, 21:08
Огромное спасибо! Как-то не догадался((


Название: Re: Виртуальная клавиатура
Отправлено: NicK от Январь 25, 2012, 10:03
А возможно ли вернуть стандартный InputContext на лету?
т.е.  можно ли во время выполнения программы после этого             
Код
C++ (Qt)
MyInputPanelContext *ic = new MyInputPanelContext;
qApp->setInputContext(ic);


вернуть в зад стандартный QInputContext или это уже необратимая процедура?


Название: Re: Виртуальная клавиатура
Отправлено: empirik от Май 05, 2012, 08:25
У меня другая проблема. На виртуальной клавиатуре сделал кнопку закрыть. При ее нажатии клавиатура скрывается (вызывается метод hide у QWidjet). Но после этого не показываться только тень от виджета, а самого виджета просто не видно. Все вроде сделал, как в выше описанном примере, но остался лишь выше описанный глюк. Подскажите в какую сторону копать.


Название: Re: Виртуальная клавиатура
Отправлено: Андрей от Июнь 12, 2012, 17:09
А у меня почему-то клавиши не нажимаются на клавиатуре и вообще она не реагирует на мышь. Если убрать функцию event(QEvent *e), начинает реагировать.