Событие нажатия клавиши Esc для QListView

Я создал простой QListView, добавил QStringListModel, которые позволяют добавлять элементы и редактировать их текст. Но я не хочу позволять добавлять пустые поля, и я частично достиг этого, используя сигнал dataChanged из модели, который испускается, если элемент списка теряет фокус без вставленного текста или пользователь нажимает клавишу Enter без добавления текста.

Однако, если вы нажмете клавишу Esc, поле останется пустым и сигнал dataChanged не будет выдан. Как я могу получить уведомление, если поле осталось пустым, не перегружая класс QListView, что было бы утомительно (я использовал дизайнер для создания формы)?

Есть ли другой сигнал, который испускается, или метод, который я могу использовать для достижения этого?

Спасибо!


person Jacob Krieg    schedule 21.09.2013    source источник


Ответы (1)


Используйте фильтры событий в своем основном классе GUI:

void GUI::GUI()
{     
    ui->mListView->installEventFilter(this);
}
bool GUI::eventFilter(QObject *object, QEvent *event)
{
    if (object == ui->mListView && event->type() == QEvent::KeyPress) {
        QKeyEvent *ke = static_cast<QKeyEvent *>(event);
        if (ke->key() == Qt::Key_Escape)
           // special Esc handling here
    }
    else
        return false;
}

Использовать пользовательские виджеты в Qt Designer очень просто. Щелкните правой кнопкой мыши QListView и выберите «Повысить до...», добавьте новый класс и примените его к виджету.

http://qt-project.org/doc/qt-4.8/designer-using-custom-widgets.html

person headsvk    schedule 21.09.2013
comment
Вы уверены, что представление списка является объектом, который получает ключевое событие? Когда пользователь редактирует элемент представления списка, есть виджет редактирования строки, который обрабатывает пользовательский ввод, поэтому, вероятно, этот редактор также обрабатывает ключевые события? - person vahancho; 22.09.2013
comment
Ну, это может быть правдой, я никогда не использовал QListView. Но я не думаю, что есть другой способ сделать это, если это не сработает... Однако использование пользовательских виджетов в Qt Designer простое, я добавлю его в свой ответ. - person headsvk; 22.09.2013