fear
2nd June 2008, 19:21
I've subclassed QLineEdit in order to obtain field that will be used for acquiring accelerators from user (sth like class derived from QListViewItem in QtDesigner). Unfortunately despite the fact I've reimplemented keyPressEvent(QKeyEvent *) I still cannot catch Ctrl+A and Ctrl+U. I browsed source code of QLineEdit but I still have no idea.
#ifndef LINEACCEL_H
#define LINEACCEL_H
#include <qkeysequence.h>
#include <qlineedit.h>
class LineAccel : public QLineEdit
{
Q_OBJECT
public:
LineAccel(const QKeySequence &, QWidget * parent = 0, const char * name = 0);
~LineAccel();
void setAccel(const QKeySequence &);
QKeySequence accel();
protected:
QPopupMenu * createPopupMenu();
void keyPressEvent(QKeyEvent *);
private:
int translateModifiers(int);
private:
QKeySequence ks;
};
#endif
#include "lineaccel.h"
LineAccel::LineAccel(const QKeySequence & accel, QWidget * parent, const char * name) : QLineEdit(parent, name)
{
setReadOnly(true);
setAccel(accel);
}
LineAccel::~LineAccel()
{
}
void LineAccel::setAccel(const QKeySequence & a)
{
ks = a;
setText(ks);
}
QKeySequence LineAccel::accel()
{
return ks;
}
QPopupMenu * LineAccel::createPopupMenu()
{
return 0;
}
void LineAccel::keyPressEvent(QKeyEvent * e)
{
int nextKey = e->key();
if (nextKey == QObject::Key_Control ||
nextKey == QObject::Key_Shift ||
nextKey == QObject::Key_Meta ||
nextKey == QObject::Key_Alt)
return;
int modifier = translateModifiers(e->state());
nextKey |= modifier;
setAccel(QKeySequence(nextKey));
}
int LineAccel::translateModifiers(int state)
{
int result = 0;
if (state & QObject::ShiftButton)
result |= QObject::SHIFT;
if (state & QObject::ControlButton)
result |= QObject::CTRL;
if (state & QObject::MetaButton)
result |= QObject::META;
if (state & QObject::AltButton)
result |= QObject::ALT;
return result;
}
#ifndef LINEACCEL_H
#define LINEACCEL_H
#include <qkeysequence.h>
#include <qlineedit.h>
class LineAccel : public QLineEdit
{
Q_OBJECT
public:
LineAccel(const QKeySequence &, QWidget * parent = 0, const char * name = 0);
~LineAccel();
void setAccel(const QKeySequence &);
QKeySequence accel();
protected:
QPopupMenu * createPopupMenu();
void keyPressEvent(QKeyEvent *);
private:
int translateModifiers(int);
private:
QKeySequence ks;
};
#endif
#include "lineaccel.h"
LineAccel::LineAccel(const QKeySequence & accel, QWidget * parent, const char * name) : QLineEdit(parent, name)
{
setReadOnly(true);
setAccel(accel);
}
LineAccel::~LineAccel()
{
}
void LineAccel::setAccel(const QKeySequence & a)
{
ks = a;
setText(ks);
}
QKeySequence LineAccel::accel()
{
return ks;
}
QPopupMenu * LineAccel::createPopupMenu()
{
return 0;
}
void LineAccel::keyPressEvent(QKeyEvent * e)
{
int nextKey = e->key();
if (nextKey == QObject::Key_Control ||
nextKey == QObject::Key_Shift ||
nextKey == QObject::Key_Meta ||
nextKey == QObject::Key_Alt)
return;
int modifier = translateModifiers(e->state());
nextKey |= modifier;
setAccel(QKeySequence(nextKey));
}
int LineAccel::translateModifiers(int state)
{
int result = 0;
if (state & QObject::ShiftButton)
result |= QObject::SHIFT;
if (state & QObject::ControlButton)
result |= QObject::CTRL;
if (state & QObject::MetaButton)
result |= QObject::META;
if (state & QObject::AltButton)
result |= QObject::ALT;
return result;
}