QSpinBox oraz keyPressEvent()

0

Witam,
mam problem z widgetem klasy QSpinBox. Mianowicie chciałbym, aby po wciśnięciu w polu spinBox klawisza przecinka (",") lub kropki (".") lub przecinka na klawiaturze numerycznej, zmieniał się focus na widget typu QLineEdit na tej samej formatce. Próbowałem to zrobić w sposób następujący:

void Form::keyPressEvent(QKeyEvent *event)
{
    if(event->key()==Qt::Key_Comma)
    {
       if(ui->spinBox->hasFocus())
       {
            ui->lineEdit->setFocus();
            ui->lineEdit->selectAll();
       }

    }
}

Niestety wciśnięcie klawisza przecinka nie przynosi żadnego efektu. Dodam, że ten sam kod, z tą różnicą, że zamiast klawisza "Qt::Key_Comma" jest "Qt::Key_Return" działa tak, jakbym tego oczekiwał po klawiszach przecinka i kropki. Czy ma to związek z tym, że klasa QSpinBox blokuje klawisze przecinka i kropki w jakiś sposób? Rozwiązanie jest zapewne bardzo proste, ale nie mam pomysłu. Bardzo proszę o pomoc.

0

Nie mam teraz za bardzo czasu aby to sprawdzić. Ale proponuję użyć debuggera. Sprawdzisz w ten sposób, czy zdarzenie w ogóle się wywołuje i ew jaka jest wartość event->key()
Najlepiej w kodzie zdarzenia daj

qDebug()<<event->key();

no i oczywiście wcześniej

#include<QDebug>
0

Tak,ma to związek.
Polecam obaczenie sobie QAbstractSpinBox::validate().
Generalnie myk polega na tym,że widget formy przekazuje event do spinboxa,a ten przeprowadza walidację znaku i wychodzi mu,że 'nie pasi'.

0

No tak właśnie czułem, że to klasa nie pozwala na wklepanie znaków kropki i przecinka. Zatem istnieje jakieś rozwiązanie używając spinBoxa? Bo rozumiem, że zdefiniowanie własnego walidatora dopuszczającego kropkę i przecinek nie wchodzi w grę. Zamienić widget spinBox na lineEdit, czy jest jakieś mądrzejsze rozwiązanie? Nic mi nie przychodzi do głowy jak to mądrze rozwiązać. Dziękuję za odpowiedzi.

0

Najprostsze rozwiązanie to napisać własnego spinboxa z przeładowaną metodą keyPressEvent:

void YourSpinbox::keyPressEvent ( QKeyEvent *e)
{
   if(e->key() == Qt::Key_Period || e->key() == Qt::Key_Comma)
   {
       //tu coś robisz,na przykład emitujesz sygnał podpięty do slotu formy,w którym to slocie będziesz przełączał sobie te fokusy itd.
   }
   else QSpinBox::keyPressEvent(e);
}
0

Zeby nie tworzyc nowego watku. Takie male pytanie o qt.

Jak przeciazamy sobie funkcje keyPressEvent to powiedzmy przy robieniu w openglu malej gry. Mam sobie

switch(e->key())
{
    case Qt::Key_W:
    forward();
....
}

To teraz jest taki myk ze klikam przycisk i trzymam. Po kliknieciu ruszy sie raz odczeka chwile i dopiero idzie plynnie do przodu, a chcialbym zeby caly czas szedl bez przerwy. Wiesz moze jak to zniwelowac?

0

O tej drugiej opcji tez pomyslalem ale jakos nie specjalnie chcialo dzialac. Co do pierwszej nie mam pojecia gdzie ;)

Ps. Pisze na linuxie ;)

A co w tym trudnego dajesz

switch(e->key())
{
case ... :
   forward();
   if(!timer->working()) timer->start(xx) // pseudokod nie pamietam nazw funkcji
   break;
...
}

void keyReleaseEvent(QKeyEvent *e)
{
switch(e->key())
{
    case ... :
    timer->stop();
    break;
}
}
0

@Krycho może pomoże klik

1 użytkowników online, w tym zalogowanych: 0, gości: 1