2012-05-30 6 views
0

У меня есть класс, наследующий QWizard, и добавьте 2 независимых QWizardPage (s). Прежде чем перейти к следующей странице, я хочу выполнить определенную работу (например, проверить подключение к Интернету) на первой странице. Пользователь может нажать кнопку «Далее» с помощью мыши или прямо нажать клавишу ввода/возврата с клавиатуры, так как кнопка «Далее» сфокусирована по умолчанию. Поэтому я устанавливаю eventfilter для кнопки:В QWizard следующая кнопка не может принять событие нажатия клавиши, но принимает событие нажатия мыши?

button (QWizard :: NextButton) -> installEventFilter (this);

Тогда в классе мастера реализовать код события обработки:

bool MyWizard::eventFilter(QObject *watched, QEvent *event) 
{ 
    if (watched == button(QWizard::NextButton)) 
    { 
     if (currentId() == startPageId) 
     { 
      if (event->type() == QEvent::KeyPress) 
      { 
       QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event); 
       if (keyEvent->key() == Qt::Key_Return || keyEvent->key() == Qt::Key_Enter) 
       { 
        // Do something. Cannot be reached. 
       } 
      } 
      else if (event->type() == QEvent::MouseButtonPress) 
      { 
       // Do something. Can be reached. 
      } 
     } 
    }  
    return QWizard::eventFilter(watched, event); 
} 

Как я много раз пытался, щелкая мышью всегда может сделать мои обработки событий код запуска, но нажатие клавиши не делает ничего, чтобы сделать. Еще одна интересная вещь: нажимать кнопку мыши на кнопке, не отпуская, затем отходить и отпускать, мастер остается на первой странице, теперь я могу нажать клавишу, и все в порядке.

Может ли кто-нибудь помочь найти причину, является ли ошибка Qt? как я могу заставить ключевое событие работать правильно?

+0

Вы попробовали это без условия if (keyEvent-> key() == Qt :: Key_Return || keyEvent-> key() == Qt :: Key_Enter) – ScarCode

+0

Я пробовал, но даже эту строку «QKeyEvent * keyEvent = static_cast (событие); " не может быть достигнуто. – Royt

ответ

0

Попробуйте другое простое решение без установки фильтра событий. Используйте QkeyPressEvent в своем основном приложении.

void YourAppClass::keyPressEvent(QKeyEvent *e) 
{ 
    if(Nextbutton->hasFocus() && e->key()== Qt::Key_Return || e->key() == Qt::Key_Enter) 
    { 
    Do your job//I guarantee this will be reached upon pressing return with button focus 
    } 
} 

Вы можете добавить функциональность щелчка мыши в clickevent() следующей кнопки.

+0

Спасибо, как я и попробовал, вызывается keyPressEvent(). но строка - «if (кнопка (QWizard :: NextButton) -> hasFocus())» всегда возвращает false, поэтому я не могу знать, нажата ли кнопка «Далее». И если нажать «Ввод» на кнопку «Отмена» или «Назад» мастера, функция keyPressEvent() не будет отвечать. – Royt

+0

hasFocus() вернет true, если у него есть focus.You можете использовать Tab для перемещения между виджетами. А также, только если в нижней части кнопки есть фокус, ключ возврата имеет смысл в вашем контексте. Он обязательно вернет true, если у него есть фокус. Эта проблема сохраняется, даже если вы используете eventfilter. – ScarCode

+0

Я предполагаю, что событие нажатия клавиши сначала обрабатывается нажатием кнопки, а затем распространяется до родительского диалога (мой мастер), возможно, во время обработки ключевых событий кнопка «Следующий» не имеет фокуса. После того, как вы перейдете на следующую страницу, кнопка «next» снова начнет фокусироваться. Вопрос в том, что если сфокусированный элемент - это кнопка «отменить» или «назад», нажмите «Ввод» не вызовет вызов keyPressEvent(), но нажмите любую другую клавишу, вызываемую функцией. Означает ли это, что после того, как кнопка «Далее» активирует событие ввода, он передаст ключевое событие в родительский диалог? – Royt

 Смежные вопросы

  • Нет связанных вопросов^_^