>> I find the idea of adding a new QCoreAction base class that is shared 
>> between QML Action and QAction and only carries a small subset of properties 
>> an unnecessary layer of abstraction. The idea of QAction is to have the 
>> convenience of icons, text and shortcuts predefined for you in a shared 
>> location. If you remove most of those properties, you anyway have to 
>> redefine the shortcuts and icon every time you use them and quite frankly I 
>> see no added benefit of this core action class that I cannot cover by simply 
>> having a shared signal that my MenuItem connects to.

> Well, I disagree with that view of what an action represents. To me, the 
> core of an action really is bundling a bit of state with a trigger for 
> something to happen (I try to avoid the word 'action' here) in a 
> convenient API. That piece of state includes at minimum if that action
> is available right now, and can also contain a value ('checked' is the 
> value that QAction can currently carry, so basically a boolean). That by 
> itself is already a very useful thing to have, as it provides a very 
> nice and clean way to expose functions on an API, especially for code in 
> a core layer of the application.

Action has clear semantics in Qt. It is a GUI concept to describe properties 
that belong in a specific implementation of a UI. What you are proposing should 
not be called CoreAction as it has nothing todo with QAction. You are proposing 
a new concept to Qt. I still find it redundant since it is trivial to implement 
yourself,  but if your backend needs a signal that can be disabled I would 
suggest that we introduce it as a different class called QTrigger and keep it 
outside of this discussion.

If you have doubts that Action is a GUI concept, take a  look at the properties:
autoRepeat, checkable, checked, enabled, font, icon, iconText, 
iconVisibleInMenu, menuRole, priority, shortcut, shortcutContext, softKeyRole, 
statusTip, text, toolTip, visible, whatsThis. How many of those belong in a 
backend? How many can you reuse in both mobile and desktop UI's?

> You claim that you'd have to "redefine" the shortcuts and other GUI 
> related properties every time you use the (core) action. Why so? Your 
> GUI layer can simply get these core actions and re-expose them once, 
> right? At the moment, you frequently see methods that are responsible 
> for creating all the actions in the application. You'd have the same, 
> only instead of having to manage multiple connections to keep track of 
> state in the core and the action that represents that, you set a 
> coreAction on the action and have that part taken care of. Then, you set 
> the QAction you created on your toolbar, your menu and whatever else you 
> fancy.

So you redeclare your Actions in your fronted and somehow associate them with 
CoreAction?

QGuiAction openAction(Core::openCoreAction):
openAction.setShortcut(); 
openAction.setIcon()
openAction.setToolTip, setEtc…

Again, I gain nothing from this apart from having to declare all my actions 
twice. Though if the concept is worth implementing we can alway add a 
setTrigger function to QGuiAction in the future.

> The benefit is in the way that you bundle the relevant bit of state, a 
> handle to an action and a value into one convenient abstraction. Instead 
> of having to expose and connect to these separately to keep your GUI 
> consistent with application state, you only need to reference a single 
> object. And that single object can be used both in the widget world as 
> well as in the QML world. At the same time, if you like.
>> What I would propose is that we keep the QAction exactly as it is and make 
>> it possible to use it from QML as well as introduce a new slightly 
>> simplified QML Action component as previously suggested. The only drawback 
>> to this approach is that actions you declare in QML won't be immediately 
>> usable from C++, but I don't see this as a big issue. You will either keep 
>> everything in QML or have your business logic including your QActions 
>> defined in in C++.
> As mentioned by others, this would mean that any C++ core that you write 
> would *have* to pull in QtWidgets in order to be able to use actions. 
> Even if you only have a QML gui. Not very attractive, if you ask me.

No it does not. QtWidgets is in a separate library. We will put the new C++ 
class in QtGui and expose it to QtQuick. This would then be just as available 
to widgets as it is in QtQuick. But I am not a sure how much effort we should 
use to make it usable in widgets. I would like it to be optimised for QtQuick. 
QAction already works great for widgets. Making QQuick also support QAction 
seems more important to existing users.

Jens

_______________________________________________
Development mailing list
[email protected]
http://lists.qt-project.org/mailman/listinfo/development

Reply via email to