Как обрабатывать события нажатия клавиш с помощью QPlainTextEdit - PullRequest
4 голосов
/ 29 марта 2011

Я работаю с QT уже около недели, и мне приятно сказать, что я очень быстро его освоил. Я программист среднего уровня C ++, но изучение некоторых частей QT оказывается сложным. Мне нужно обрабатывать события нажатия клавиш из QPlainTextEdit, когда пользователь нажимает ввод, и я предполагаю, что решение будет включать подклассификацию виджета. Кто-нибудь из вас, умные ребята, может дать мне потенциальное реализуемое решение?

Ответы [ 4 ]

5 голосов
/ 29 марта 2011

Чтобы действительно понять Qt и обработку событий, есть две ключевые области документации, которые вы должны прочитать. Первый - это обзор Системы событий , а второй - очень важный бит, который представляет собой хитро скрытую ссылку на этой странице для QCoreApplication :: notify . Они должны действительно перенести это на главную страницу документации системы событий, поскольку это действительно проясняет ситуацию (по крайней мере, мне).

4 голосов
/ 29 марта 2011

я бы попробовал создать подкласс QPlainTextEdit и переопределить QWidget::keyPressEvent:

void YourTextEdit::keyPressEvent ( QKeyEvent * event )
{
  if( event->key() == Qt::Key_Return )
  {
    // optional: if the QPlainTextEdit should do its normal action 
    // even when the return button is pressed, uncomment the following line
    // QPlainTextEdit::keyPressEvent( event )

    /* do your stuff here */
    event->accept();
  }
  else
    QPlainTextEdit::keyPressEvent( event )
}
3 голосов
/ 22 января 2018

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

  1. Предоставьте виртуальный метод eventFilter в одном из ваших классов на основе QObject (например, в классе формы окна).

    bool MyWindow::eventFilter(QObject *watched, QEvent *event)
    {
        if(watched == ui->myTargetControl)
        {
            if(event->type() == QKeyEvent::KeyPress)
            {
                QKeyEvent * ke = static_cast<QKeyEvent*>(event);
                if(ke->key() == Qt::Key_Return || ke->key() == Qt::Key_Enter)
                {
                    // [...]
                    return true; // do not process this event further
                }
            }
            return false; // process this event further
        }
        else
        {
            // pass the event on to the parent class
            return QMainWindow::eventFilter(watched, event);
        }
    }
    
  2. Установите ваш класс в качестве фильтра событий для целевого элемента управления.Конструктор форм обычно является хорошим местом для этого кода.В следующем фрагменте this относится к экземпляру класса, в котором вы реализовали метод eventFilter.

    ui->myTargetControl->installEventFilter(this);
    
1 голос
/ 16 июля 2014

Пожалуйста, попробуйте:

if (event->key() == Qt::Key_Return || event->key() == Qt::Key_Enter){
//do something
}

в вашей функции keyPressEvent () .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...