focus and keyboard events in Widgets/Quick Applications
-
I have an application that uses movable "modules", window-like widgets of different types. They all have a "titlebar" (another widget), "borders" (another outer widget) and an inner content widget. The content of some is implemented using
QWidgets, the content of one uses aQQuickView, let's call it QuickUi.In QuickUi, I have various components, including a
GridView. When the focus is on QuickUi (i.e. the user has most recently clicked somewhere in QuickUi), I want Ctrl+A to select allGridViewtiles. When the focus is, i.e. in another module's text field, it should, of course, exhibit default behaviour (text selection).My first approach was using Actions in QuickUi. The problem is that when I click on QuickUi's module's borders widget and then back inside the
QQuickView, in many cases the actions don't respond anymore. I then have to click in some other module and back into QuickUi...Second approach was to use a global event filter on the application object, and then distribute events via signals/slots. Works fine, except if I call a slot in QuickUi on Ctrl+A, I have to decide whether I have focus (and only trigger tile selection if I do). But how do I know that?
focusandactiveFocuson the QuickUi's root element is always false. I also don't get anyfocusInEventcalls in any of the container widgets...Is there any way I can find out which
QWidgethas the active focus, i.e. received the most recent mouse click? -
I have an application that uses movable "modules", window-like widgets of different types. They all have a "titlebar" (another widget), "borders" (another outer widget) and an inner content widget. The content of some is implemented using
QWidgets, the content of one uses aQQuickView, let's call it QuickUi.In QuickUi, I have various components, including a
GridView. When the focus is on QuickUi (i.e. the user has most recently clicked somewhere in QuickUi), I want Ctrl+A to select allGridViewtiles. When the focus is, i.e. in another module's text field, it should, of course, exhibit default behaviour (text selection).My first approach was using Actions in QuickUi. The problem is that when I click on QuickUi's module's borders widget and then back inside the
QQuickView, in many cases the actions don't respond anymore. I then have to click in some other module and back into QuickUi...Second approach was to use a global event filter on the application object, and then distribute events via signals/slots. Works fine, except if I call a slot in QuickUi on Ctrl+A, I have to decide whether I have focus (and only trigger tile selection if I do). But how do I know that?
focusandactiveFocuson the QuickUi's root element is always false. I also don't get anyfocusInEventcalls in any of the container widgets...Is there any way I can find out which
QWidgethas the active focus, i.e. received the most recent mouse click?I just did some more experiments and it seems that if I subclass
QQuickViewand put debug outputs in thefocusInEventandfocusOutEventhandlers, there are cases in which clicking any element in the QML structure gives the quickview focus, but in other cases (e.g. when I click on one of the "border" widgets, not necessarily its own one, and then back into it) it doesn't get focus. How is that possible?