c++ - 无法在 QTableView 上检测到 "Keypress"?

标签 c++ qt keypress qtableview

我正在使用 QTableView 来可视化一些特定的图像。用户可以单击 TableView 的图像,该图像将在另一个更大的 QLabel 类型的窗口中放大。我可以通过在 TableView 上单击鼠标来实现这一点,但我想为键盘按钮“向上”“向下” 启用它。我的意思是,一旦用户单击 TableView 中列出的其中一张图片,如果用户使用键盘按钮“向上”“向下”,我想检测按键并将其连接到放大特定选定图像的 QLabel

所以,我的意思是我实际上想检测QTableView 上的keypress。直到现在我还没有设法做到这一点。我在 QTableViewviewPort 上安装了一个 eventfilter,在 eventfilter 函数中我可以检测到mousebuttonpress,但我无法检测到 keypress

为了向您展示我是如何实现的,我制作了一个简单的程序,用于使用 QTableViewKeypress 进行测试。下面,我给出了该简单程序的 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;
}

程序确实输出“按下鼠标按钮”,但没有输出键盘按下。你能告诉我我在哪里做错了吗?

谢谢

最佳答案

我也遇到了同样的问题。使用您的想法,如果打印我得到的事件类型:“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 &) 它是一个私有(private)插槽函数,您可以在其中对选定数据(使用它们的索引)执行任何操作

关于c++ - 无法在 QTableView 上检测到 "Keypress"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25290549/

相关文章:

c++ - C++ 标准是否对 vector 赋值函数或构造函数有明确的要求?

c++ - 在Qt中为数据库创建线程: a reasonnable design or nonsense?

python - 在 Python Qt 中访问自定义小部件?

c++ - QVector2D* 大小未知

wpf - 如何禁用 F4 键显示组合框中的项目

c++ - 用于将字符串放入整数的 cin 失败标志

c++ - 寻找总和最大的子矩阵

c++ - `final` : omit `virtual` ? 的配方

c# - 验证文本框以限制数字输入

c# - 如何模拟shift/ctrl/alt键状态?