Linux за българи: Форуми

Програмиране => Общ форум => Темата е започната от: VG в Apr 08, 2005, 12:52



Титла: Qt+глобални клавиши за бърз достъп (shortcut keys)
Публикувано от: VG в Apr 08, 2005, 12:52
Slackware 10.0; Qt 3.3; MySQL 4.1.6

Значи, проблема е следният:
Как да накараме клавиш за бърз достъп да бъде активен във всички области на приложението?
Пробвах с "installEventFilter()" в QMainWindow но там, където имам таблици от вида QDataTable* в child widget-ите не работи.
Ако някой се е сблъсквал с подобен проблем нека сподели.


Титла: Qt+глобални клавиши за бърз достъп (shortcut keys)
Публикувано от: plamen_t в Apr 11, 2005, 15:42
Ами честно казано хората, който разбират от Qt  в България са изключително малко за съжаление. :(
Аз лично започнах да уча Qt преди няколко месеца, но въобще не мога да твърдя, че разбирам толкова, че да давам съвети.

Ето защо бих ти препоръчал да питаш в http://www.qtforum.org .
Отговарят почти веднага на постовете. Лично аз съм питал там по 2-3 въпроса, който бяха решени за нула време, тъй че опитай там   ???


Титла: Qt+глобални клавиши за бърз достъп (shortcut keys)
Публикувано от: VG в Apr 12, 2005, 08:12
Цитат (plamen_t @ Април 11 2005,16:42)
Ами честно казано хората, който разбират от Qt  в България са изключително малко за съжаление. :(
Аз лично започнах да уча Qt преди няколко месеца, но въобще не мога да твърдя, че разбирам толкова, че да давам съвети.

Ето защо бих ти препоръчал да питаш в http://www.qtforum.org .
Отговарят почти веднага на постовете. Лично аз съм питал там по 2-3 въпроса, който бяха решени за нула време, тъй че опитай там   ???

Бих питал ама... знам, че ще се изложа с английския:-(


Титла: Qt+глобални клавиши за бърз достъп (shortcut keys)
Публикувано от: Michael в Apr 12, 2005, 09:06
Така зададен въпроса, ме кара да гадая, какъв точно ти е проблема и тъй като се занимавам с Qt на достатъчно ниско ниво, ще се опитам да ти помогна.
Значи, като принципна постановка, трябва да имаш предвид, че всички библиотеки за създаване на GUI, обработват сигналите от клавиатурата едва след като съответния прозорец е получил фокуса. Qt не прави изключение от това правило. Класа QDataTable наследява класа QTable, който пък е наследник на QWidget, това означава че можеш спокойно да използваш функцията на QWidget setFocus(), освен това трябва да направиш някаква функция за обработка на сигналите от клавиатурата, т.е да включиш keyPressEvent(QKeyEvent *e). Понеже не разбрах какво имаш предвид под "горещи клавиши", предполагам че са някава комбинация от клавишите Shift, Ctrl или Alt и някакъв друг клавиш, затова такава комбинация се обработва на два етапа 1.Определяш дали някой от горните клавиши е натиснат (е->state() - определя дали е натиснат или не "true", "false", e->key() - код на клавиш който не е символ, e->ascii() - за букви или цифри). Не съм сигурен че това ще ти свърши някаква работа, но мисля че като за стартов момент става !
Успех !
Михаил Петров


Титла: Qt+глобални клавиши за бърз достъп (shortcut keys)
Публикувано от: VG в Apr 12, 2005, 18:13
Извинявам се на всички, които не са ме разбрали, за недостатъчното обяснение.
В конкретния случай става въпрос за следното:
В момента работя върху складов софтуер за Линукс.
В разработката съм интегрирал и калкулатор, като целта ми е той да бъде извикван навсякъде в програмата с един или комбинация от два и повече клавиши (много е удобно). Както вече писах пробвах да задам на функцията, която извиква калкулатора глобален клавиш:
Примерен код

 myAccel = new QAccel(this, "myAccel");
 myAccel->insertItem(Qt::Key_F12, 101);

и след това заложих филтър за следене на събитията в дъщерните widget-и
Примерен код

bool myMainWindow::eventFilter( QObject *obj, QEvent *ev )
{
   if ( ev->type() == QEvent::Accel ){
      QKeyEvent *k = (QKeyEvent *)ev;
      if( k->key() == Key_F12 ){
         Calculator();
         return FALSE;
      }
   }
   return QMainWindow::eventFilter( obj, ev );
}

и съответно:
Примерен код

myChildWidget->installEventFilter(this);

по същия начин процедирах и в child widget-ите, там където се налага.
Работата обаче е там, че в едни случаи филтъра прихваща събитието като от вида QEvent::Accel, в други като QEvent::KeyPress, а в трети като бог знае какво:-(
Така или иначе това не проработи и засега се налага да помислим върху нещо друго.