Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 未能检测到;按键;在QTableView上?_C++_Qt_Keypress_Qtableview - Fatal编程技术网

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 &)));