Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Fobos от Апрель 20, 2011, 14:54



Название: Popup keyboard
Отправлено: Fobos от Апрель 20, 2011, 14:54
Народ, пожалуйста помогите. Есть экранная клавиатура сделанная в Qt отдельным виджетом. Она должна всплывать при получении фокуса или нажатии на какой-либо элемент в главном окне и закрываться при нажатии мышью вне клавиатуры (исключая редактируемый виджет). Открываться то она открывается, а вот закрываться правильно не хочет, т.к. главный виджет не получает MouseEvent при нажатии на ребенка(лейбл, кнопку и т.п.). Вопрос как получить событие при нажатии мышью на ребенка главного окна?


Название: Re: Popup keyboard
Отправлено: GreatSnake от Апрель 20, 2011, 15:00
Цитировать
Вопрос как получить событие при нажатии мышью на ребенка главного окна?
Всё зависит от того как вывели окно клавы - с грабом или нет. И какой базовый класс используется.
Да и вообще код показывай.


Название: Re: Popup keyboard
Отправлено: NicK от Апрель 20, 2011, 15:01
Код
C++ (Qt)
setWindowFlags(Qt::Popup);

будет закрываться при потере фокуса


Название: Re: Popup keyboard
Отправлено: GreatSnake от Апрель 20, 2011, 15:08
Цитата: NicK
будет закрываться при потере фокуса
Причём всегда и независимо от
Цитата: Fobos
Она должна всплывать при получении фокуса или нажатии на какой-либо элемент в главном окне и закрываться при нажатии мышью вне клавиатуры (исключая редактируемый виджет)


Название: Re: Popup keyboard
Отправлено: Fobos от Апрель 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 - все равно не работает


Название: Re: Popup keyboard
Отправлено: GreatSnake от Апрель 20, 2011, 15:37
А почему не воспользовались QCompleter?


Название: Re: Popup keyboard
Отправлено: Fobos от Апрель 20, 2011, 15:50
А почему не воспользовались QCompleter?
Приложение идет на терминалы, без клавиатуры и мыши, с сенсорным экраном. И для редактирования полей типа SpinBox или LineEdit используется экранная клавиатура.

Хочу сделать показ/закрытие клавиатуры аналогично QDateEdit с включеным calendarPopup, но в qt'шных файлах ответа не нашел.


Название: Re: Popup keyboard
Отправлено: Fobos от Апрель 20, 2011, 18:30
Разобрался... В общем если у окна стоит флаг Qt::Popup то оно первое принимает все события мыши, минуя родителя и другие окна.