我正在使用 QTableView
来可视化一些特定的图像。用户可以单击 TableView 的图像,该图像将在另一个更大的 QLabel
类型的窗口中放大。我可以通过在 TableView 上单击鼠标来实现这一点,但我想为键盘按钮“向上” 和“向下” 启用它。我的意思是,一旦用户单击 TableView 中列出的其中一张图片,如果用户使用键盘按钮“向上” 和“向下”,我想检测按键并将其连接到放大特定选定图像的 QLabel
。
所以,我的意思是我实际上想检测QTableView
上的keypress
。直到现在我还没有设法做到这一点。我在 QTableView
的 viewPort
上安装了一个 eventfilter
,在 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;
}
程序确实输出“按下鼠标按钮”,但没有输出键盘按下。你能告诉我我在哪里做错了吗?
谢谢
最佳答案
我也遇到了同样的问题。使用您的想法,如果打印我得到的事件类型:“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/