Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: kirill от Ноября 06, 2008, 10:22



Название: Регистронезависимый ввод с клавиатуры
Отправлено: kirill от Ноября 06, 2008, 10:22
Хай.

Есть окно с виджетами типа редактируемого QComboBox с комплетерами.
Нужно сделать так чтобы можно было вводить только большие или маленькие буквы не трогая Shift или Caps Lock.
То есть, юзер стоит на QComboBox и давит клавишу "а". Caps Lock выключен. Я хочу переводить в большую "А".
Ранее я это делал через эвентфильтр, но гиморно, хочется способ проще.
Нельзя ли делать конвертацию на уровне сообщений от клавиатуры? То есть подменять сигналы виджетам от клавы. Смутно подозреваю что надо использовать grabKeyboard(), но как именно не знаю, прошу помощи.

В общем, хотелось бы некий фильтр, который принимает клавишу, приводит ее к определенному регистру и отправляет дальше по цепочке. Как бы это реализовать?


Название: Re: Регистронезависимый ввод с клавиатуры
Отправлено: Karl-Philipp от Ноября 06, 2008, 11:05
а что если воспользоваться
Цитировать
QChar QChar::toUpper () const
или
Цитировать
QString QString::toUpper () const
?


Название: Re: Регистронезависимый ввод с клавиатуры
Отправлено: kirill от Ноября 06, 2008, 11:15
Поясню как у меня сейчас и чего хочу.

Я сажаю eventFilter на QComboBox.
В eventFilter ловлю клавиши
Код:
if (event->type() == QEvent::KeyPress)

Дальше преобразовываю
Код:
						if (m_caps == 0)//все строчные
{
sText.insert(position, str.toLower());
ed->setText(sText);
ed->setCursorPosition(position+1);
}
else if (m_caps == 1)//все прописные
{
sText.insert(position, str.toUpper());
ed->setText(sText);
ed->setCursorPosition(position+1);

}

Где ed - это lineEdit() из QComboBox.
То есть видишь, тут уже приходится определять позицию и вставлять туда преобразованный символ. Уже гимор. Еще веселее, что на введенную клавишу появляется комплетер и все дальнейшие нажатия клавиш адресуются ему. Приходится приставлять костыли чтобы перегонять эти нажатия в lineEdit().
Хотелось бы просто чтобы все участники процесса принимали сразу преобразованную клавишу.

Сейчас пытаюсь сделать нечто вроде этого.
Это eventFilter для qApp. Однако не прокатывает.

Код:
   if ((event->type() == QEvent::KeyPress))
   {
     
      QKeyEvent *ev = new QKeyEvent(QEvent::KeyPress, Qt::Key_A, Qt::NoModifier);
      QApplication::sendEvent(target, ev);
   }
PS этот код приводит к зацикливанию. на sendEvent опять срабатывает eventFilter и так далее


Название: Re: Регистронезависимый ввод с клавиатуры
Отправлено: kirill от Ноября 06, 2008, 15:29
В общем я решил эту проблему через небольшой финт.
У QLineEdit есть хорошее свойство inputMask, но использовать в чистом виде его стремно - он заменяет курсор на черный квадрат и все поле ввода забивает своей маской.
Однако его маска умеет приводить к какому нужно регистру:

setMaskInput(">XXXXXXXX"); // все прописные
setMaskInput("<XXXXXXXX"); // все строчные
setMaskInput(">X<XXXXXXX"); // первая большая остальные маленькие

Короче создал объект
Код:
KCapsEdit::KCapsEdit(QWidget *parent)
: QLineEdit(parent)
{
   setVisible(false);
   QString mask = ">";
   for (ushort i=0; i<1000; i++)
      mask += "X";
   mask += ";#";
   setInputMask(mask);
}

И прикрутил его к совему комбо с помощью двух коннектов
Код:
connect(lineEdit(), SIGNAL(textChanged(const QString &)), kCapsLine, SLOT(setText(const QString &)));
connect(kCapsLine, SIGNAL(textChanged(const QString &)), lineEdit(), SLOT(setText(const QString &)));

Такая связка заработала как надо, комплетер также работает.

Админу:
Можно снести эту ветку, а может кому-то понадобится.


Название: Re: Регистронезависимый ввод с клавиатуры
Отправлено: ритт от Ноября 06, 2008, 22:41
неочевидное решение...расскажи ещё как дошёл до него )
пусть остаётся