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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как задать фокус окна не наводя мышь  (Прочитано 3616 раз)
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.036 секунд. Запросов: 20.