QKeySequence to QKeyEvent
c++, key-events, qkeysequence, qt
Solution
In general, you cannot compare `QKeyEvent` and `QKeySequence` objects. `QKeyEvent` represents the event of a single key press or release, whereas a `QKeySequence` can contain a sequence of up to four keys, each with optional modifier information.
You can, however, compare the objects if you are sure that your key sequences will always contain just one key:
bool isEquiv(const QKeyEvent& event, const QKeySequence& seq)
{
if (seq.count() != 1)
return false;
return seq[0] == (event.key() | event.modifiers());
}
You can even write a conversion function for `QKeyEvent` to `QKeySequence`:
QKeySequence toKeySequence(const QKeyEvent& event)
{
return QKeySequence(event.key() | event.modifiers());
}
Note that it does not make sense to convert a `QKeySequence` to a `QKeyEvent`, though, since you have to choose a specific event type such as `QEvent::KeyPress` or `QEvent::KeyRelease`.
Problem
I'm in a situation whereby I am trying to read in a JSON config file which dictates what key commands map to given actions. For example: ``` ... { "Action": "Quit", "Combo" : "CTRL+Q" }, ... ``` Constructing a `QKeySequence` from the combo tag is trivial but I need to monitor `QKeyEvent`s in order to trigger actions. Please note I have to monitor `QKeyEvent`s because they are used for other purposes in the application as well. i.e. it would not be acceptable to only monitor key commands for `QKeySequence`s (if that is even possible). Short of writing a custom parser to construct a `QKeyEvent` object for each `"Combo"` tag, is there anyway of comparing a `QkeyEvent` to a `QKeySequence`? For example: ``` QKeyEvent KeyCommandsHandler::toKeyEvent(QKeySequence sequence) { //somehow convert to QKeyEvent } ```