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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как задать фокус окна не наводя мышь  (Прочитано 3472 раз)
soalvi
Гость
« : Май 26, 2010, 12:50 »

  Имеется планшетный ПК без мыши но с клавиатурой. Я написал программу в которой через открытое модальное окно оператор с помощью клавиатуры вводит данные.
  Проблема заключается в том, что пока курсор мышки (при отладке на своём рабочем месте пользуюсь мышью) не окажется на модальном окне, клавиатура не работает.
  Пробовал перед вызовом ххх.exec ставить ххх.setFocus, не помогает. Пробовал отключать демон консольной мыши и физически мышь, но после запуска курсор мыши присутствует и проблемы это не решает.
  Программу запускаю следующим образом xinit ./x --:1
  Подскажите как мне решить эту проблему?
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Май 26, 2010, 13:10 »

Каким WindowManager-om пользуетесь? Отключите правило, чтобы фокус следовал за мышью.

Либо универсальное решение

Код
C++ (Qt)
void ActivateWindow( QWidget* w )
{
if( !w->isShown() )
w->show();
w->raise();
 
#ifdef Q_WS_X11
 
Display* dpy = QX11Info::display();
 
XClientMessageEvent ev = { 0 };
 
ev.type = ClientMessage;
ev.window = w->winId();
ev.message_type = XInternAtom( dpy, "_NET_ACTIVE_WINDOW", False );
ev.format = 32;
ev.send_event = True;
ev.data.l[1] = QX11Info::appUserTime();
 
XSendEvent( dpy,
RootWindowOfScreen( DefaultScreenOfDisplay( dpy) ), False,
SubstructureRedirectMask | SubstructureNotifyMask, (XEvent*) &ev );
XSync( dpy, False );
 
#elif defined(Q_OS_WIN)
 
SetWindowPos ( w->winId(), HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE );
 
#endif
 
w->activateWindow();
}
 
« Последнее редактирование: Май 26, 2010, 13:42 от GreatSnake » Записан

Qt 5.11/4.8.7 (X11/Win)
soalvi
Гость
« Ответ #2 : Май 26, 2010, 22:12 »

Спасибо за совет. А разве при запуске из консоли программы через использование xinit задействуется WindowManager?
« Последнее редактирование: Май 26, 2010, 22:13 от soalvi » Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #3 : Май 27, 2010, 09:57 »

Да, действительно, в этом случае WM не запускается.
Мой пример рассчитан на наличие WM.
Самый простой вариант - это передвинуть курсор в виджет по умолчанию используя QCursor::setPos().
Записан

Qt 5.11/4.8.7 (X11/Win)
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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