2014-10-29 55 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線,但如果我按CANC不會出現任何消​​息

+0

好吧,我想我發現了錯誤,你eventfilter只能與位於主窗口,不main.cpp中griglia,所以你可以看到正常的tableview但eventfilter不工作。你現在的代碼永遠不會工作,你應該在mainwindow中做所有的事情。我不想在我的電腦上編譯它,因爲它有很多工作,所以我會編寫代碼在myBrain編譯器中工作:)幾分鐘後我將添加代碼 – Chernobyl 2014-10-30 18:13:59

+0

檢查我的編輯,在評論結果中告訴。 – Chernobyl 2014-10-30 18:20:20

回答

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 

and

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

您可以使用Qt::Key_ShiftQt::Key_Cancel或別的東西。

編輯

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 2014-10-30 17:10:01

+0

@Aimcorz不,它應該是qApp,發佈你的代碼,也許我會發現錯誤,因爲我的例子完全適用於我的電腦。 – Chernobyl 2014-10-30 17:13:14

+0

@Aimcorz我看到代碼首先在SO上會更好,如果你只是編輯你的問題並添加完整的代碼,你不應該創建代碼作爲答案。我在這裏看不到錯誤,所以我希望你給qtableview分配內存,但是沒有在代碼中顯示它,是的?第二:有'qDebug()<<「作品」;'在我的回答中,也加上這一行,並告訴我是你可以看到這個詞時按下取消按鈕,也可以用shift鍵試試這個。告訴我結果。 – Chernobyl 2014-10-30 17:51:39