PDA

View Full Version : React on KeyEvent inside QTreeWidget



Raadush
6th April 2012, 12:17
Hi,
I have this problem. I have main form where i have QTreeWidget and label. All I need is to change label text, when i press up and down in QTreeWidget accordingly. Here's sample code:




MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
tree = new QTreeWidget(this);
label = new QLabel(this);

QTreeWidgetItem *top = new QTreeWidgetItem(0);
top->setText(0,"top");
QTreeWidgetItem *top2 = new QTreeWidgetItem(0);
top2->setText(0,"top2");
QTreeWidgetItem *lower = new QTreeWidgetItem(0);
niz->setText(0,"lower");
QTreeWidgetItem *lower2 = new QTreeWidgetItem(0);
niz2->setText(0,"even lower");

tree->addTopLevelItem(top);
tree->addTopLevelItem(top2);
top2->addChild(lower);
niz->addChild(lower2);

QWidget *widget = new QWidget(this);
QHBoxLayout *layout = new QHBoxLayout();
layout->addWidget(tree);
layout->addWidget(label);
widget->setLayout(layout);
this->setCentralWidget(widget);

connect(tree,SIGNAL(itemClicked(QTreeWidgetItem*,i nt)),this,SLOT(treeClicked(QTreeWidgetItem*,int))) ;
}

void MainWindow::treeClicked(QTreeWidgetItem* item, int col)
{
label->setText(item->text(0));
}

void MainWindow::keyPressEvent(QKeyEvent* event)
{
if((event->key() == Qt::Key_Up) || (event->key() == Qt::Key_Down))
{
label->setText(tree->currentItem()->text(0));
}
}


with mouse clicks, everything works fine, but keypress event works only when Im at the top or at the bottom of QTreeWidget (I assume that it's because QTreeWidget actually loses focus when im for example at the top of widget and i press Up, so MainWindow gets focus and is able to call keyPressEvent). But how to override keyPressEvent of treeWidget inside of main form? Thanks, so far I was unable to find working solution.

Spitfire
9th April 2012, 14:22
You need to intercept key events going to the tree widget not the main window.

Event filter seems to be easiest solution in this case:


MainWindow::MainWindow( QWidget* parent )
: QMainWindow( parent )
{
[...] // your setup

this->tree->installEventFilter( this );
}

bool MainWindow::eventFilter( QObject* o, QEvent* e )
{
if( o == this->tree && e->type() == QEvent::KeyRelease )
{
label->setText(tree->currentItem()->text(0));
}

return false;
}

Raadush
10th April 2012, 06:58
Thanks a lot, this is exactly what I needed. Works like charm. Thanks