Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: soalvi от Май 26, 2010, 12:50



Название: Как задать фокус окна не наводя мышь
Отправлено: soalvi от Май 26, 2010, 12:50
  Имеется планшетный ПК без мыши но с клавиатурой. Я написал программу в которой через открытое модальное окно оператор с помощью клавиатуры вводит данные.
  Проблема заключается в том, что пока курсор мышки (при отладке на своём рабочем месте пользуюсь мышью) не окажется на модальном окне, клавиатура не работает.
  Пробовал перед вызовом ххх.exec ставить ххх.setFocus, не помогает. Пробовал отключать демон консольной мыши и физически мышь, но после запуска курсор мыши присутствует и проблемы это не решает.
  Программу запускаю следующим образом xinit ./x --:1
  Подскажите как мне решить эту проблему?


Название: Re: Как задать фокус окна не наводя мышь
Отправлено: GreatSnake от Май 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();
}
 


Название: Re: Как задать фокус окна не наводя мышь
Отправлено: soalvi от Май 26, 2010, 22:12
Спасибо за совет. А разве при запуске из консоли программы через использование xinit задействуется WindowManager?


Название: Re: Как задать фокус окна не наводя мышь
Отправлено: GreatSnake от Май 27, 2010, 09:57
Да, действительно, в этом случае WM не запускается.
Мой пример рассчитан на наличие WM.
Самый простой вариант - это передвинуть курсор в виджет по умолчанию используя QCursor::setPos().