【问题标题】:Failure to detect "Keypress" on QTableView?无法在 QTableView 上检测到“按键”?
【发布时间】:2014-10-07 01:43:28
【问题描述】:

我正在使用QTableView 来可视化一些特定的图像。用户可以单击 TableView 的图像,该图像将在另一个更大的 QLabel 类型的窗口中被放大。我可以通过在 TableView 上单击鼠标来实现这一点,但我想为键盘按钮 “up”“down” 启用它。我的意思是,一旦用户单击 TableView 上列出的图像之一,如果用户使用键盘按钮 "up""down" 更改为其他图像>,我想检测按键并将其连接到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;
}

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

谢谢

【问题讨论】:

  • 也许尝试在桌子上安装事件过滤器:ui-&gt;numberTable-&gt;installEventFilter(this);?删除if(obj == ui-&gt;numberTable-&gt;viewport()) 值得一试。

标签: c++ qt keypress qtableview


【解决方案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 &) 它是一个私有插槽函数,您可以在其中对选定数据执行任何操作(使用它们的索引)

【讨论】:

    猜你喜欢
    • 2016-09-05
    • 2014-01-19
    • 1970-01-01
    • 1970-01-01
    • 2019-01-05
    • 2013-08-16
    • 1970-01-01
    • 2019-09-07
    • 2013-12-16
    相关资源
    最近更新 更多