Russian Qt Forum
Июля 08, 2025, 09:27 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Регистронезависимый ввод с клавиатуры  (Прочитано 4404 раз)
kirill
Гость
« : Ноября 06, 2008, 10:22 »

Хай.

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

В общем, хотелось бы некий фильтр, который принимает клавишу, приводит ее к определенному регистру и отправляет дальше по цепочке. Как бы это реализовать?
« Последнее редактирование: Ноября 06, 2008, 12:11 от kirill » Записан
Karl-Philipp
Гость
« Ответ #1 : Ноября 06, 2008, 11:05 »

а что если воспользоваться
Цитировать
QChar QChar::toUpper () const
или
Цитировать
QString QString::toUpper () const
?
Записан
kirill
Гость
« Ответ #2 : Ноября 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 и так далее
« Последнее редактирование: Ноября 06, 2008, 11:31 от kirill » Записан
kirill
Гость
« Ответ #3 : Ноября 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 &)));

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

Админу:
Можно снести эту ветку, а может кому-то понадобится.
Записан
ритт
Гость
« Ответ #4 : Ноября 06, 2008, 22:41 »

неочевидное решение...расскажи ещё как дошёл до него )
пусть остаётся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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