首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >取消QTableView中的单元格值

取消QTableView中的单元格值
EN

Stack Overflow用户
提问于 2014-10-29 18:41:08
回答 1查看 520关注 0票数 1

如何从QTableView中的单元格中删除值?我创建了一个QTableView,但是如果我按下所选单元格上键盘的“取消”按钮,就不会发生任何事情。如果我想删除这个值,我必须双击单元格并按下cancel,但是我想删除没有双击的值,只需选择单元格并按Canc

keyEvent->key()有用吗?

代码语言:javascript
复制
 @Chernobyl

    MAINWINDOW.H

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H

    #include <QMainWindow>
    #include <QKeyEvent>
    #include <QTableView>

    namespace Ui {
    class MainWindow;
    }

    class MainWindow : public QMainWindow
    {
        Q_OBJECT

    public:
        explicit MainWindow(QWidget *parent = 0) ;
        ~MainWindow();
        QTableView *griglia;

    protected:
        bool eventFilter(QObject *obj, QEvent *event);

    private:
        Ui::MainWindow *ui;


    };

    #endif // MAINWINDOW_H





    MAINWINDOW.CPP

    #include "mainwindow.h"
    #include "ui_mainwindow.h"

    MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent),ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
        qApp->installEventFilter(this);
    }


    bool MainWindow::eventFilter(QObject *obj, QEvent *event)
    {
        if(obj == griglia && event->type() == QEvent::KeyPress)
        {
            QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
            if(keyEvent->key() == Qt::Key_Cancel)
            {
               QModelIndex in =griglia->currentIndex();
               griglia->model()->setData(in," ");
            }
        }
        return QObject::eventFilter(obj, event);
    }

    MainWindow::~MainWindow()
    {
        delete ui;
    }




MAIN.CPP



#include "mainwindow.h"
#include "itemdelegate.h"
#include "mymodel.h"
#include <QApplication>
#include <QtGui>
#include <QtCore>
#include <QtWidgets>
#include <QFile>
#include <QString>
#include <QTextStream>
#include <QIdentityProxyModel>
#include <QRegExpValidator>

#define GRIGLIA_RX "^[F0-9]|1[0-9]|2[0-4]$"


int main(int argc, char *argv[])
{

    QApplication a(argc, argv);

    QFile styleFile( "style.qss" );
    styleFile.open( QFile::ReadOnly );
    QString style( styleFile.readAll() );
    a.setStyleSheet( style );

    QWidget *mainWindow = new QWidget;    
    QStandardItemModel *model = new QStandardItemModel(48,33);  
    QTableView *griglia = new QTableView;
    griglia->setModel(model);

    QPushButton *calcola = new QPushButton;
    calcola->setText("CALCOLA");

    QVBoxLayout *layout = new QVBoxLayout;
    layout->addWidget(griglia);
    layout->addWidget(calcola);
    mainWindow->setLayout(layout);


    ItemDelegate *itDelegate = new  ItemDelegate;
    griglia->setItemDelegate(itDelegate);
    mainWindow->showMaximized();
    return a.exec();
}

我添加了QDebug行,但是如果我按Canc,就不会出现任何消息

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-29 18:53:43

使用下一个事件筛选器(如我的示例中所示)或重新实现keyPressEvent

代码语言:javascript
复制
bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
    if(obj == ui->tableView && event->type() == QEvent::KeyPress)
    {
        QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
        if(keyEvent->key() == Qt::Key_Shift)
        {
           qDebug() << "works";
           QModelIndex in =  ui->tableView->currentIndex();
           ui->tableView->model()->setData(in,"");
           //ui->tableView->model()->setData(ui->tableView->currentIndex(),""); //or just this

        }
    }
    return QObject::eventFilter(obj, event);
}

要使用eventFilter,还应该:

代码语言:javascript
复制
protected:
bool eventFilter(QObject *obj, QEvent *event);//in header

代码语言:javascript
复制
qApp->installEventFilter(this);//in constructor

您可以使用Qt::Key_ShiftQt::Key_Cancel或其他什么。

编辑

代码语言:javascript
复制
MAINWINDOW.H

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H

    #include <QMainWindow>
    #include <QKeyEvent>
    #include <QTableView>
    #include "itemdelegate.h"
#include "mymodel.h"
#include <QApplication>
#include <QtGui>
#include <QtCore>
#include <QtWidgets>
#include <QFile>
#include <QString>
#include <QTextStream>
#include <QIdentityProxyModel>
#include <QRegExpValidator>

    namespace Ui {
    class MainWindow;
    }

    class MainWindow : public QMainWindow
    {
        Q_OBJECT

    public:
        explicit MainWindow(QWidget *parent = 0) ;
        ~MainWindow();
        QTableView *griglia;

    protected:
        bool eventFilter(QObject *obj, QEvent *event);

    private:
        Ui::MainWindow *ui;


    };

    #endif // MAINWINDOW_H





    MAINWINDOW.CPP

    #include "mainwindow.h"
    #include "ui_mainwindow.h"


    MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent),ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
            QWidget *mainWindow = new QWidget;    
    QStandardItemModel *model = new QStandardItemModel(48,33);  
    griglia = new QTableView;
    griglia->setModel(model);

    QPushButton *calcola = new QPushButton;
    calcola->setText("CALCOLA");

    QVBoxLayout *layout = new QVBoxLayout;
    layout->addWidget(griglia);
    layout->addWidget(calcola);
    mainWindow->setLayout(layout);


    ItemDelegate *itDelegate = new  ItemDelegate;
    griglia->setItemDelegate(itDelegate);

    this->setCentralWidget(mainWindow);
        qApp->installEventFilter(this);
    }


    bool MainWindow::eventFilter(QObject *obj, QEvent *event)
    {
        if(obj == griglia && event->type() == QEvent::KeyPress)
        {
            QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
            if(keyEvent->key() == Qt::Key_Cancel)
            {
               QModelIndex in =griglia->currentIndex();
               griglia->model()->setData(in," ");
            }
        }
        return QObject::eventFilter(obj, event);
    }

    MainWindow::~MainWindow()
    {
        delete ui;
    }




MAIN.CPP



#include "mainwindow.h"


int main(int argc, char *argv[])
{

    QApplication a(argc, argv);

    QFile styleFile( "style.qss" );
    styleFile.open( QFile::ReadOnly );
    QString style( styleFile.readAll() );
    a.setStyleSheet( style );

    MainWindow my;
    my.showMaximized();
    return a.exec();
}

现在您应该看到“工作”和单元格应该被清除,另一个代码优化是自己做的。

多重选择的加法:

代码语言:javascript
复制
if(obj == ui->tableView && event->type() == QEvent::KeyPress)
{
    QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
    if(keyEvent->key() == Qt::Key_Shift)
    {
        qDebug() << "Up";
       //ui->tableView->model()->setData(ui->tableView->currentIndex(),"");
       QList<QModelIndex> index = ui->tableView->selectionModel()->selectedIndexes();
       for(int i = 0; i < index.size(); i++)
           ui->tableView->model()->setData(index.at(i),"");
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26638192

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档