PDA

View Full Version : i need to use Alt+Ctrl+arrow keys combination



prasad.ece2
4th September 2013, 07:02
i need to use Alt+Ctrl+arrow keys on custamised QGraphicsItem, i have tried below one, not working can any one suggest me better one


void CBoxViewItem::keyPressEvent(QKeyEvent* f_event) //CBoxViewItem derived from Qgraphicsitem
{
if(Qt::ControlModifier & Qt::AltModifier & f_event->modifiers()) // i tried this also if( (Qt::ControlModifier && Qt::AltModifier) == f_event->modifiers())
{
qDebug()<<"ctrl+Alt";

switch(f_event->key())
{
case Qt::Key_Up:

break;
case Qt::Key_Down:

break;
case Qt::Key_Left:

break;
case Qt::Key_Right:

break;
}
}

Santosh Reddy
4th September 2013, 07:22
This should help


class Widget : public QLabel
{
public:
explicit Widget(QWidget * parent = 0)
: QLabel(parent)
{
installEventFilter(this);
}
protected:
bool eventFilter(QObject *, QEvent * event)
{
if(event->KeyPress)
{
QKeyEvent * keyEvent = static_cast<QKeyEvent *>(event);

if(keyEvent->type() == QEvent::KeyPress)
{
if(keyEvent->modifiers().testFlag(Qt::AltModifier) &&
keyEvent->modifiers().testFlag(Qt::ControlModifier) )
{
switch(keyEvent->key())
{
case Qt::Key_Left: setText("Alt + Ctrl + Key_Left"); break;
case Qt::Key_Up: setText("Alt + Ctrl + Key_Up"); break;
case Qt::Key_Right: setText("Alt + Ctrl + Key_Right"); break;
case Qt::Key_Down: setText("Alt + Ctrl + Key_Down"); break;
default: setText("Use Only Arrow Keys"); break;
}
}
else
setText("Use Alt + Ctrl");
}
}

return false;
}
};

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

Widget widget;
widget.show();

return app.exec();
}

or simple


...
if((Qt::ControlModifier | Qt::AltModifier) & f_event->modifiers())
...

prasad.ece2
4th September 2013, 08:08
fine bro its working but the problem is as soon as i press Alt+Ctrl it going to default case (Use Only Arrow Keys), Alt+Ctrl+any arrow key it is going to default case only.

i have done as below


void CBoxViewItem::keyPressEvent(QKeyEvent* f_event)
{
if(f_event->KeyPress)
{
QKeyEvent * keyEvent = static_cast<QKeyEvent *>(f_event);

if(f_event->type() == QEvent::KeyPress)
{
if(f_event->modifiers().testFlag(Qt::AltModifier) && f_event->modifiers().testFlag(Qt::ControlModifier) )
{
switch(f_event->key())
{
case Qt::Key_Left:
qDebug()<<"Alt + Ctrl + Key_Left";
break;
case Qt::Key_Up:
qDebug()<<"Alt + Ctrl + Key_Up";
break;
case Qt::Key_Right:
qDebug()<<"Alt + Ctrl + Key_Right";
break;
case Qt::Key_Down:
qDebug()<<"Alt + Ctrl + Key_Down";
break;
default:
qDebug()<<"Use Only Arrow Keys";
break;
}
}
}
}

Santosh Reddy
4th September 2013, 08:41
void CBoxViewItem::keyPressEvent(QKeyEvent* f_event)
{
if(f_event->type() == QEvent::KeyPress)
{
if(f_event->modifiers().testFlag(Qt::AltModifier) && f_event->modifiers().testFlag(Qt::ControlModifier) )
{
switch(f_event->key())
{
case Qt::Key_Left:
qDebug()<<"Alt + Ctrl + Key_Left";
break;
case Qt::Key_Up:
qDebug()<<"Alt + Ctrl + Key_Up";
break;
case Qt::Key_Right:
qDebug()<<"Alt + Ctrl + Key_Right";
break;
case Qt::Key_Down:
qDebug()<<"Alt + Ctrl + Key_Down";
break;
default:
qDebug()<<"Use Only Arrow Keys";
break;
}
}
}
}


Please may attention while copying the code.

prasad.ece2
4th September 2013, 10:05
yes, still i am facing same problem.. its going to default case always .

Santosh Reddy
4th September 2013, 10:51
What is your platform and Qt Version, also can post a minimal code to reproduce the problem.

prasad.ece2
4th September 2013, 11:15
windows 64-bit and Qt version is 4.8.5, i am using VS2010 by adding Qt plugin



void CBoxViewItem::keyPressEvent(QKeyEvent* f_event)
{
if(f_event->KeyPress)
{
if(f_event->type() == QEvent::KeyPress)
{
if(f_event->modifiers().testFlag(Qt::AltModifier) && f_event->modifiers().testFlag(Qt::ControlModifier).)
{
switch(f_event->key())
{
case Qt::Key_Left:
qDebug()<<"Alt + Ctrl + Key_Left";
break;
case Qt::Key_Up:
qDebug()<<"Alt + Ctrl + Key_Up";
break;
case Qt::Key_Right:
qDebug()<<"Alt + Ctrl + Key_Right";
break;
case Qt::Key_Down:
qDebug()<<"Alt + Ctrl + Key_Down";
break;
default:
qDebug()<<"Use Only Arrow Keys";
break;
}
}
else
qDebug()<<"Use Alt + Ctrl";
}
}
}

this is always going to default case only.

Santosh Reddy
4th September 2013, 11:20
When the default case executes what is the value in f_event->key()?

prasad.ece2
4th September 2013, 11:38
16777249

http://www.codeproject.com/Questions/179832/How-to-implement-key-press-key-combinations-in-QT
he is saying that it is working in xp but not in Win7

high_flyer
4th September 2013, 11:40
This code:

void CBoxViewItem::keyPressEvent(QKeyEvent* f_event)
{
if(f_event->KeyPress)
{...}

Should not compile.
Are you sure this is the code you are compiling?

And please: use code tags when you post code its hard to read it that way.

prasad.ece2
4th September 2013, 11:57
yes the same code i am compiling .

high_flyer
4th September 2013, 11:58
Strange, since QKeyEvent doesn't have a member called 'KeyPress'.

prasad.ece2
4th September 2013, 12:00
and sorry for inconvenience i am new to blog .

don't knw suddenly its working for for some time in between and stops working again .

prasad.ece2
27th September 2013, 07:34
Finally came to know what is the problem... in the scene we have to set focus (item->setFocus(); QGraphicsScene::keyPressEvent(event); ) to the selected item then scene pass that event to that selected item...

- thank you Santosh Reddy .