PDA

View Full Version : QTableView and Key-Delete



Armin
9th January 2010, 16:06
Hello to all,

I'm new to Qt (using it for 4 weeks, used c++ builder before), using Qt 4.6 with C++ on windows (Qt Creator) and have a small problem detecting press of Key_Delete in a QTableView to manage to delete the whole row of data. I used keyPressEvent(QKeyEvent*) which is triggered on other Keys, but not the delete key. Below is a small example of compilable code, maybe someone has a hint for me. If I comment out the setEditTrigger line, I get the event once (and the contents of the active item is deleted), but then the tableview has no focus when I query that in keyPressEvent() (I later only want to act on delete key when the table has focus).

Thanks in advance
Armin



#include <QtGui>

class MyApp : public QWidget
{
public:
MyApp();
~MyApp();
QStandardItemModel *model;
QTableView *table;
QVBoxLayout *layout;
void keyPressEvent(QKeyEvent *event);
};
MyApp::MyApp() : QWidget()
{
QStandardItem* item;

table = new(QTableView);
model = new QStandardItemModel(2, 1);
table->setModel( model );

for( int r=0; r<2; r++ )
{
item = new QStandardItem(QString("Test"));
model->setItem(r, 0, item);
}

table->setSelectionMode( QAbstractItemView::SingleSelection );
table->setEditTriggers(QAbstractItemView::NoEditTriggers) ;

layout = new QVBoxLayout;
layout->addWidget(table);
setLayout(layout);
}
MyApp::~MyApp()
{
}
void MyApp::keyPressEvent(QKeyEvent *event)
{
switch (event->key())
{
case Qt::Key_Return:
case Qt::Key_Enter:
qDebug() << "Enter";
break;
case Qt::Key_Escape:
qDebug() << "Escape";
break;
case Qt::Key_Insert:
qDebug() << "Insert";
break;
case Qt::Key_Delete:
qDebug() << "Delete";
break;
default:
qDebug() << "other" << event->key();
break;
}
}
int main( int argc, char **argv ) {
QApplication app( argc, argv );
MyApp Test;

Test.show();

return app.exec();
}

squidge
9th January 2010, 16:36
Have you tried subclassing QTableView or installing an event filter? With the former, your function will only be called when the table has focus.

Armin
9th January 2010, 16:52
adding an event-filter like shown below gives the same result, the delete key is not shown. When I subclass QTableView, what do I have to overwrite to get all keys?



#include <QtGui>

class MyApp : public QWidget
{
public:
MyApp();
~MyApp();
QStandardItemModel *model;
QTableView *table;
QVBoxLayout *layout;
void keyPressEvent(QKeyEvent *event);
bool eventFilter(QObject* object, QEvent* event);
};
MyApp::MyApp() : QWidget()
{
QStandardItem* item;

table = new(QTableView);
model = new QStandardItemModel(2, 1);
table->setModel( model );

for( int r=0; r<2; r++ )
{
item = new QStandardItem(QString("Test"));
model->setItem(r, 0, item);
}

table->setSelectionMode( QAbstractItemView::SingleSelection );
table->setEditTriggers(QAbstractItemView::NoEditTriggers) ;

layout = new QVBoxLayout;
layout->addWidget(table);
setLayout(layout);
installEventFilter(this);
}
MyApp::~MyApp()
{
}
void MyApp::keyPressEvent(QKeyEvent *event)
{
switch (event->key())
{
case Qt::Key_Return:
case Qt::Key_Enter:
qDebug() << "Enter";
break;
case Qt::Key_Escape:
qDebug() << "Escape";
break;
case Qt::Key_Insert:
qDebug() << "Insert";
break;
case Qt::Key_Delete:
qDebug() << "Delete";
break;
default:
qDebug() << "other" << event->key();
break;
}
}
bool MyApp::eventFilter(QObject* object, QEvent* event)
{
if (event->type()==QEvent::KeyPress)
{
QKeyEvent* pKeyEvent=static_cast<QKeyEvent*>(event);
if (pKeyEvent->key() == Qt::Key_Delete)
{
if (table->hasFocus())
{
qDebug() << "Event filter: Focus yes, Delete key pressed";
}
else
{
qDebug() << "Event filter: Focus NO, Delete key pressed";
}
return TRUE;
}
qDebug() << "Event filter: other key pressed";
}
return QWidget::eventFilter(object, event);
}

int main( int argc, char **argv )
{
QApplication app( argc, argv );
MyApp Test;

Test.show();

return app.exec();
}

squidge
9th January 2010, 18:19
You are installing an event filter MyApp (itself). Try table->installEventFilter(this) which would install it where you want it.

Alternatively, try to override QAbstractItemView::keyPressEvent

Armin
9th January 2010, 18:26
Now it works, many thanks for yout help.
regards Armin