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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Popup keyboard  (Прочитано 3974 раз)
Fobos
Гость
« : Апрель 20, 2011, 14:54 »

Народ, пожалуйста помогите. Есть экранная клавиатура сделанная в Qt отдельным виджетом. Она должна всплывать при получении фокуса или нажатии на какой-либо элемент в главном окне и закрываться при нажатии мышью вне клавиатуры (исключая редактируемый виджет). Открываться то она открывается, а вот закрываться правильно не хочет, т.к. главный виджет не получает MouseEvent при нажатии на ребенка(лейбл, кнопку и т.п.). Вопрос как получить событие при нажатии мышью на ребенка главного окна?
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Апрель 20, 2011, 15:00 »

Цитировать
Вопрос как получить событие при нажатии мышью на ребенка главного окна?
Всё зависит от того как вывели окно клавы - с грабом или нет. И какой базовый класс используется.
Да и вообще код показывай.
Записан

Qt 5.11/4.8.7 (X11/Win)
NicK
Гость
« Ответ #2 : Апрель 20, 2011, 15:01 »

Код
C++ (Qt)
setWindowFlags(Qt::Popup);

будет закрываться при потере фокуса
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #3 : Апрель 20, 2011, 15:08 »

Цитата: NicK
будет закрываться при потере фокуса
Причём всегда и независимо от
Цитата: Fobos
Она должна всплывать при получении фокуса или нажатии на какой-либо элемент в главном окне и закрываться при нажатии мышью вне клавиатуры (исключая редактируемый виджет)
Записан

Qt 5.11/4.8.7 (X11/Win)
Fobos
Гость
« Ответ #4 : Апрель 20, 2011, 15:20 »

Код:
//куски кода
SettingsDetailDialog::SettingsDetailDialog(int id, QWidget *parent) :
   QDialog(parent, Qt::WindowTitleHint | Qt::WindowSystemMenuHint),
   ui(new Ui::SettingsDetailDialog)
{
    ui->setupUi(this);

   setAttribute(Qt::WA_TransparentForMouseEvents);

   currentEdited = 0;

   keyboard = new WidgetKeyboard(this);
   keyboard->setWindowFlags(Qt::Popup);
//   keyboard->setWindowFlags(Qt::SplashScreen);
   keyboard->hide();

   ui->drawingMinSpinBox->installEventFilter(this);
   ui->drawingMaxSpinBox->installEventFilter(this);
}

bool SettingsDetailDialog::eventFilter(QObject *object, QEvent *event)
{
   if (event->type() == QEvent::FocusIn)
   {
      if (QAbstractSpinBox *spin = qobject_cast<QAbstractSpinBox *>(object))
      {
                        // currentEdited - виджет, который сейчас редактируется
         if (spin != currentEdited)
         {
            currentEdited = (QWidget *) spin;
         }
         keyboard->move(spin->mapToGlobal(QPoint(0, spin->height())));
         keyboard->setType(WidgetKeyboard::NumPad);
         keyboard->show();
         return true;
      }
   }


   return QDialog::eventFilter(object, event);
}

void SettingsDetailDialog::mousePressEvent(QMouseEvent *event)
{
   if (!keyboard->isHidden())
   {
      if (!keyboard->geometry().contains(event->pos()))
      {
         keyboard->close();
         currentEdited = 0;
      }
   }
   QDialog::mousePressEvent(event);
}

keyboard отнаследована от QWidget;
хотя и поставил флаг Qt::Popup - все равно не работает
« Последнее редактирование: Апрель 20, 2011, 15:31 от Fobos » Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #5 : Апрель 20, 2011, 15:37 »

А почему не воспользовались QCompleter?
Записан

Qt 5.11/4.8.7 (X11/Win)
Fobos
Гость
« Ответ #6 : Апрель 20, 2011, 15:50 »

А почему не воспользовались QCompleter?
Приложение идет на терминалы, без клавиатуры и мыши, с сенсорным экраном. И для редактирования полей типа SpinBox или LineEdit используется экранная клавиатура.

Хочу сделать показ/закрытие клавиатуры аналогично QDateEdit с включеным calendarPopup, но в qt'шных файлах ответа не нашел.
« Последнее редактирование: Апрель 20, 2011, 16:06 от Fobos » Записан
Fobos
Гость
« Ответ #7 : Апрель 20, 2011, 18:30 »

Разобрался... В общем если у окна стоит флаг Qt::Popup то оно первое принимает все события мыши, минуя родителя и другие окна.
« Последнее редактирование: Апрель 20, 2011, 20:33 от Fobos » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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