Russian Qt Forum

Qt => Вопросы новичков => Тема начата: brucemax от Декабрь 01, 2011, 15:42



Название: [РЕШЕНО] Симуляция нажатия клавиши клавиотуры
Отправлено: brucemax от Декабрь 01, 2011, 15:42
Клик по кнопке коннектится со слотом:
Код:
void okno::Down()
{
   int   nKey    = Qt::Key_Down ;
    QKeyEvent* pe =
    new QKeyEvent(QEvent::KeyPress, nKey, Qt::NoModifier);
    QApplication::sendEvent(this, pe);
}
то есть хочу нажимать на кнопку на форме и чтобы она симулировала нажатие кнопки "вниз" на клавиатуре.  ( При нажатии кнопки вниз на клаве в приложение перемещается фокус по кнопкам..  надо чтоб такое же происходило по нажатию кнопки на форме)
но пока этого не присходит..  видимо в sendEvent в качестве получателя я нето что надо пишу...  Подскажите решение?


Название: Re: Симуляция нажатия клавиши клавиотуры
Отправлено: andrew.k от Декабрь 01, 2011, 19:29
a setFocus не устраивает?


Название: Re: Симуляция нажатия клавиши клавиотуры
Отправлено: Bepec от Декабрь 02, 2011, 07:03
to andrew.k
setFocus надо обрабатывать, определять какая кнопка ниже, перенаправлять на ту кнопку.

А вот если передать событие нажатия - тогда все это (причем по умолчанию), рассчитает виджет.

По теме:

Пытался когда то съимитировать нажатия клавиш, но не преуспел к сожалению.


Название: Re: Симуляция нажатия клавиши клавиотуры
Отправлено: andrew.k от Декабрь 02, 2011, 08:55
Может твоей кнопке на форме нужно поставить FocusPolicy NoFocus?


Название: Re: Симуляция нажатия клавиши клавиотуры
Отправлено: Bepec от Декабрь 02, 2011, 08:59
А каким местом политика фокуса имеет к имитации нажатия клавиши?

Задача поставленная ТС - при щелчке на кнопку имитировать нажатие "вниз" на клавиатуре.


Название: Re: Симуляция нажатия клавиши клавиотуры
Отправлено: andrew.k от Декабрь 02, 2011, 08:59
Цитировать
void okno::Down()
Просто супер)


Название: Re: Симуляция нажатия клавиши клавиотуры
Отправлено: andrew.k от Декабрь 02, 2011, 09:00
А каким местом политика фокуса имеет к имитации нажатия клавиши?

Задача поставленная ТС - при щелчке на кнопку имитировать нажатие "вниз" на клавиатуре.
А ты подумай головой.


Название: Re: Симуляция нажатия клавиши клавиотуры
Отправлено: Bepec от Декабрь 02, 2011, 09:03
andrew.k мб вам стоит подумать?

При нажатии клавиши фокус уже появляется на ней. Если между pressed и released нажать вниз, то "О чудо", курсор упадет вниз на следующий элемент. И это с нормальным фокусом.

С NoFocus как раз фокус то придется делать самому, чтобы перейти на 1 элемент ниже.

м?
// PS данное утверждение протестировано   [12/2/2011 Bepec]


Название: Re: Симуляция нажатия клавиши клавиотуры
Отправлено: andrew.k от Декабрь 02, 2011, 09:15
Верес, ты знаешь, практически в каждом твоем сообщении я либо не вижу смысла, либо не могу его понять, либо не могу его понять с первого раза. Это сообщение не исключение.
Это только у меня так?

Не знаю, что ты там проверял, но если он коннектится к сигналу clicked(), то по щелчку фокус будет переходить на эту кнопку "вниз". а по доставке события - на следуйщий элемент, которым будет уже явно не тот. И после каждого щелчка фокус будет на одном и том же виджете.

Если он коннектится к pressed, то фокус сначала перейдет как надо, а потом виджет в любом случае должен среагировать на щелчек и выставить себе фокус. И будет это скорее всего после того, как был выставлен нужный фокус.
Поэтому в этом случае в результате фокус останется на самой кнопке "вниз".

Поэтому нужно NoFocus, чтобы кнопка не принимала фокус по щелчку по ней.


м?


Название: Re: Симуляция нажатия клавиши клавиотуры
Отправлено: Bepec от Декабрь 02, 2011, 09:50
to adnrew.k:

Каюсь, прочитал заголовок темы, потом еще раз прочитал, потом только понял что хотел сказать ТС (Моя вина -  что не понял, его вина - что не расписал)

Согласен с вашим Qt::NoFocus.
/*Прости меня, Васенька, дуру грешную!*/

to brucemax:

Собственно что вы хотите сделать, распишите, а мы более оптимальный вариант предложим.


Название: Re: Симуляция нажатия клавиши клавиотуры
Отправлено: brucemax от Декабрь 02, 2011, 10:18
Видимо из-за того что я новичёк..   слова Вереса мне больше понятны))
Спасибо за полемику..   задача решена иным способом=)    Но симулировать нажатие клавиши Up так и не удалось..  а вот симуляция нажатия символьной клавиши и вывод например в лайнэдит..   это легко)


Название: Re: Симуляция нажатия клавиши клавиотуры
Отправлено: brucemax от Декабрь 02, 2011, 10:24
А сделал так..  радиобатаны которые нажимаются по нажатии на кноПку на форме (как и по нажатию на "Down" )  объединил в массив..  а кноПка коннектится со слотом:
Код:
void okno::Down()
{
    static const int ct_iButtonNum = sizeof(m_pButtons)/sizeof(m_pButtons[0]);
    if(ct_iButtonNum <= ++a)
    a = 0;
    m_pButtons[a]->click();
}
Вот)


Название: Re: Симуляция нажатия клавиши клавиотуры
Отправлено: Bepec от Декабрь 02, 2011, 10:26
Молодца что то похожее предлагал и andrew.k.

Теперь переименуй тему(переименовать 1 твое сообщение заголовок Тема) в [РЕШЕНО]название темы.

:)


Название: Re: Симуляция нажатия клавиши клавиотуры
Отправлено: andrew.k от Декабрь 02, 2011, 17:29
Молодца что то похожее предлагал и andrew.k.
Я такое не предлагал.

Проверил. Действительно почему-то событие с Qt::Key_Down/Up не дают нужного эффекта.
Событие доходит, но виждет его игнорирует. и фокус не перемещается, когда вроде бы должен. Интересно почему?
Qt::Key_Tab работает.

Сильные форума сего. Поясните)

В любом случае. не все контролы по стрелкам отдают фокус. По таб да большинство. По стрелкам нет.
Поэтому зачем делать такой механизм? Пользователю проще щелкнуть на нужный контрол, чем щелкать на некую кнопку, чтобы фокус перешел от одного к другому. Бред же.


Название: Re: [РЕШЕНО] Симуляция нажатия клавиши клавиотуры
Отправлено: Bepec от Декабрь 05, 2011, 07:06
Видимо это заготовка на будущее. У меня подобное используется в табличных представлениях - чтобы двигать туды сюды, но правда не таким извращенным способом :)


Название: Re: [РЕШЕНО] Симуляция нажатия клавиши клавиотуры
Отправлено: andrew.k от Декабрь 05, 2011, 08:15
Видимо это заготовка на будущее. У меня подобное используется в табличных представлениях - чтобы двигать туды сюды, но правда не таким извращенным способом :)
о чем это сообщение и к чему?


Название: Re: [РЕШЕНО] Симуляция нажатия клавиши клавиотуры
Отправлено: Bepec от Декабрь 05, 2011, 08:29
Возможно для тебя будет открытием, что зачастую сначала пишется маленькая программа, в которой программист пытается сделать одно действие разными способами :)

Какой способ ему понравится и/или подойдет ему, тот способ он будет использовать в более больших проектах в дальнейшем.

Это и есть заготовка.

PS Помоему у тебя что то с восприятием действительности...


Название: Re: [РЕШЕНО] Симуляция нажатия клавиши клавиотуры
Отправлено: andrew.k от Декабрь 05, 2011, 08:36
Возможно для тебя будет открытием, что зачастую сначала пишется маленькая программа, в которой программист пытается сделать одно действие разными способами :)

Какой способ ему понравится и/или подойдет ему, тот способ он будет использовать в более больших проектах в дальнейшем.

Это и есть заготовка.

PS Помоему у тебя что то с восприятием действительности...
Да, у меня с шизофазиками туго.


Название: Re: Симуляция нажатия клавиши клавиотуры
Отправлено: brucemax от Декабрь 05, 2011, 09:38

В любом случае. не все контролы по стрелкам отдают фокус. По таб да большинство. По стрелкам нет.
Поэтому зачем делать такой механизм? Пользователю проще щелкнуть на нужный контрол, чем щелкать на некую кнопку, чтобы фокус перешел от одного к другому. Бред же.

То устройство, на котором будет работать программа не имеет мыши и полноценной клавиатуры (только 8 кнопок).=)


Название: Re: [РЕШЕНО] Симуляция нажатия клавиши клавиотуры
Отправлено: Bepec от Декабрь 05, 2011, 09:43
Аналогичная проблема и у меня была. Только программа для панельных компьютеров :)


Название: Re: [РЕШЕНО] Симуляция нажатия клавиши клавиотуры
Отправлено: brucemax от Декабрь 05, 2011, 10:36
Аналогичная проблема и у меня была. Только программа для панельных компьютеров :)
И как решал её, если не секрет?   :)


Название: Re: [РЕШЕНО] Симуляция нажатия клавиши клавиотуры
Отправлено: Bepec от Декабрь 05, 2011, 10:54
Сделал все в View, с раскрытием доп виджета уже с установками (т.е. строчки с названиями настроек, движение вверх вниз по таблице, двойное нажатие - открытие всех установок.)

Но был еще вариант с WinApi. keybd_event