2014-10-29 3 views
1

Как я могу удалить значение из ячейки в QTableView? Я создал QTableView, но если я нажму кнопку отмены клавиатуры на выбранной ячейке, ничего не произойдет. Если я хочу удалить это значение, мне нужно дважды щелкнуть ячейку и нажать «Отмена», но я хочу удалить значение без двойного щелчка, просто выбрав ячейку и нажмите Canc.Отменить значение ячейки в QTableView

keyEvent->key() Полезный?

@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 линии, но если я нажимаю ОТМ сообщений не появляется

+0

Хорошо, я думаю, я нашел ошибку, ваш eventfilter работает только с Griglia, который расположен в MainWindow, а не main.cpp, так что вы можете увидеть нормальный TableView но eventfilter не Работа. Ваш текущий код никогда не будет работать, вы должны делать все свои вещи внутри mainwindow. Я не хочу компилировать его на своем компьютере, потому что это большая работа, поэтому я напишу код, который работает в myBrain-компиляторе :) Я добавлю код через несколько минут – Chernobyl

+0

Проверьте мои изменения, скажите в комментариях. – Chernobyl

ответ

1

Используйте следующий фильтра событий, как в моем примере или переописать keyPressEvent:

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 вы должны также:

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

и

qApp->installEventFilter(this);//in constructor 

Вы можете использовать Qt::Key_Shift или Qt::Key_Cancel или что-то еще.

EDIT

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(); 
} 

Теперь вы должны увидеть «работает» и ячейка должна быть очищена, другая оптимизация кода делать самостоятельно.

Дополнение для множественного выбора:

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),""); 
    } 
} 
+0

Нет ошибок, никаких предупреждений, но это не работает. Я думаю, что я делаю что-то неправильно. Должен ли я писать «nameofmyQTableView-> installEventFilter (this);»? – splunk

+0

@Aimcorz Нет, это должен быть qApp, разместите свой код, может быть, я найду ошибку, потому что мой пример отлично работает на моем компьютере. – Chernobyl

+0

@Aimcorz Я видел код, в первую очередь, на SO, будет лучше, если вы просто отредактируете свой вопрос и добавите полный код в вопрос, вы не должны создавать код в качестве ответа. Я не вижу здесь ошибок, поэтому надеюсь, что вы выделите память на qtableview, но просто не указали ее в коде, да? И второе: есть 'qDebug() <<" works ";' в моем ответе, добавьте эту строку и сообщите мне, что вы можете видеть это слово, когда нажимаете кнопку отмены, также попробуйте это с помощью кнопки смены. Скажите мне результаты. – Chernobyl

 Смежные вопросы

  • Нет связанных вопросов^_^