Не удалось обнаружить нажатие клавиши в QTableView?

Я использую QTableView для визуализации определенных изображений. Пользователь может щелкнуть изображения TableView, и это изображение будет увеличено в другом большем окне типа QLabel. Я могу сделать это возможным с помощью щелчков мышью в TableView, но я хотел бы включить его для кнопок клавиатуры "вверх" и "вниз". Я имею в виду, что после того, как пользователь щелкнет одно из изображений, перечисленных в TableView, если пользователь переключится на другие изображения с помощью кнопок клавиатуры "вверх" и "вниз", я хочу обнаружить нажатие клавиши и подключить его к QLabel, который увеличивает это конкретное выбранное изображение.

Итак, я имею в виду, что на самом деле хочу обнаружить keypress на QTableView. До сих пор мне это не удавалось. Я устанавливаю eventfilterна viewPort из QTableView, и в функции eventfilter я могу обнаружить mousebuttonpress, но не могу обнаружить keypress.

Чтобы показать вам, как я подхожу к реализации, я сделал простую программу для тестирования с QTableView и Keypress. Ниже я привел код mainWindow реализации этой простой программы.

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QStandardItemModel>
#include <QDebug>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->numberTable->viewport()->installEventFilter(this);
    connect(ui->FillUp, SIGNAL(clicked()), this, SLOT(fillUp()));
}

void MainWindow::fillUp()
{
    model = new QStandardItemModel(3, 3, this);
    int counter = 0;
    for(int i = 0; i < 3; i++)
    {
        for(int j = 0; j < 3; j++)
        {
            QStandardItem * itm = new QStandardItem;
            counter++;
            itm->setText(QString::number(counter));
            model->setItem(i, j, itm);
        }
    }
    ui->numberTable->setModel(model);
    ui->numberTable->show();
}

bool MainWindow::eventFilter(QObject * obj, QEvent * ev)
{
    if(obj == ui->numberTable->viewport())
    {
        if(ev->type() == QEvent::MouseButtonPress)
        {
            qDebug()<<"Mouse button pressed!\n";
        }
        else if(ev->type() == QEvent::KeyPress)
        {
            qDebug()<<"Key button pressed\n";
        }
    }
    return QObject::eventFilter(obj, ev);
}

MainWindow::~MainWindow()
{
    delete ui;
}

Программы выводят "Кнопка мыши нажата", но не выводят нажатие на клавиатуру. Не могли бы вы сообщить мне, где я делаю ошибку?

Спасибо


person the_naive    schedule 13.08.2014    source источник
comment
Может попробовать установить фильтр событий и на стол: ui->numberTable->installEventFilter(this);? А удалить if(obj == ui->numberTable->viewport()) стоит попробовать.   -  person vahancho    schedule 13.08.2014


Ответы (1)


У меня такая же беда. Используя вашу идею, если напечатать тип события, я получаю: "Paint widget" (12) вместо "KeyPress" (6).

bool AR_Principal::eventFilter(QObject * obj, QEvent * ev){
    qDebug() << ev->type();
    if(obj == ui->tableView->viewport())
    {
        if(ev->type() == QEvent::MouseButtonPress)
        {
            qDebug()<<"Mouse button pressed";
        }
        else if(ev->type() == QEvent::KeyPress)
        {
            qDebug()<<"Key button pressed";
        }
        else if(ev->type() == QEvent::Paint)
        {
            qDebug()<<"Paint widget" ;
        }
    }
    return QObject::eventFilter(obj, ev);
}

Если использовать событие QEvent::Paint, это работает. Или, как говорит другой ответ, добавьте:

ui->tableView->installEventFilter(this);

И не используйте условие:

if(obj == ui->tableView->viewport())

Но более эффективное решение:

connect(ui->tableView->selectionModel(), SIGNAL(currentChanged (const QModelIndex & , const QModelIndex & )), SLOT(selectedItem(const QModelIndex &)));

Где selectedItem(const QModelIndex &) это функция частного слота, где вы можете делать что угодно с выбранными данными (используя их индекс)

person JMRuizAb    schedule 12.09.2014