C++ 未能检测到;按键;在QTableView上?
我正在使用C++ 未能检测到;按键;在QTableView上?,c++,qt,keypress,qtableview,C++,Qt,Keypress,Qtableview,我正在使用QTableView来可视化一些特定的图像。用户可以单击TableView的图像,该图像将在另一个较大的QLabel类型窗口中放大。我可以通过在TableView上单击鼠标来实现这一点,但我想为键盘按钮“向上”和“向下”启用它。我的意思是,一旦用户单击TableView上列出的一个图像,如果用户使用键盘按钮“向上”和“向下”切换到其他图像,我想检测按键并将其连接到放大特定选定图像的QLabel 所以,我的意思是我实际上想要检测QTableView上的keypress。直到现在我还没能做
QTableView
来可视化一些特定的图像。用户可以单击TableView的图像,该图像将在另一个较大的QLabel
类型窗口中放大。我可以通过在TableView上单击鼠标来实现这一点,但我想为键盘按钮“向上”和“向下”启用它。我的意思是,一旦用户单击TableView上列出的一个图像,如果用户使用键盘按钮“向上”和“向下”切换到其他图像,我想检测按键并将其连接到放大特定选定图像的QLabel
所以,我的意思是我实际上想要检测QTableView
上的keypress
。直到现在我还没能做到。我正在QTableView
的视口上安装eventfilter
,在eventfilter
功能中,我可以检测到mousebuttonpress
,但无法检测到按键
为了向您展示我是如何实现的,我制作了一个简单的程序,用于使用QTableView
和Keypress
进行测试。下面,我给出了这个简单程序的main窗口的代码
#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;
}
#包括“mainwindow.h”
#包括“ui_main window.h”
#包括
#包括
主窗口::主窗口(QWidget*父窗口):
QMainWindow(父级),
用户界面(新用户界面::主窗口)
{
用户界面->设置用户界面(此);
ui->numberTable->viewport()->installEventFilter(此);
连接(ui->FillUp,SIGNAL(clicked()),这个,插槽(FillUp());
}
void主窗口::fillUp()
{
模型=新的QStandardItemModel(3,3,this);
int计数器=0;
对于(int i=0;i<3;i++)
{
对于(int j=0;j<3;j++)
{
QStandardItem*itm=新的QStandardItem;
计数器++;
itm->setText(QString::number(计数器));
模型->设置项(i、j、itm);
}
}
ui->numberTable->setModel(模型);
ui->numberTable->show();
}
bool主窗口::事件过滤器(QObject*obj,QEvent*ev)
{
如果(obj==ui->numberTable->viewport())
{
如果(ev->type()==QEvent::MouseButtonPress)
{
qDebug()我也有同样的问题。根据你的想法,如果打印我得到的事件类型:“绘制小部件”(12)而不是“按键”(6)
不要使用以下条件:
if(obj == ui->tableView->viewport())
但更有效的解决方案是:
connect(ui->tableView->selectionModel(), SIGNAL(currentChanged (const QModelIndex & , const QModelIndex & )), SLOT(selectedItem(const QModelIndex &)));
其中selectedItem(const QModelIndex&)是一个私有插槽函数,您可以在其中对所选数据执行任何操作(使用其索引)也可以尝试在表上安装事件过滤器:ui->numberTable->installEventFilter(this);
?如果(obj==ui->numberTable->viewport())值得尝试,则删除。
if(obj == ui->tableView->viewport())
connect(ui->tableView->selectionModel(), SIGNAL(currentChanged (const QModelIndex & , const QModelIndex & )), SLOT(selectedItem(const QModelIndex &)));