[Development] QAction in Qt 6 - next step proposal
Olivier Goffart
olivier at woboq.com
Wed Nov 27 12:14:15 CET 2019
On 27.11.19 11:19, Friedemann Kleint wrote:
> Hi,
>
> as discussed on the change, there is not much one can do with the newly
> introduced QGuiAction; it serves as a base class for QAction and
> QQuickAction, The naming follows the Q(Gui)Application pattern.
>
> > QMenu *menu() const;
> > -> static QMenu *QMenu::menuForAction(QAction *action);
>
> > void setMenu(QMenu *menu);
> > -> static void QMenu::setMenuForAction(QAction *action, QMenu *menu);
>
> ThisĀ in my opinion is a no-go, we cannot do source-incompatible changes
> in this area because there have been many deprecations already and code
> needs to compile against 5 and 6 with minimal changes.
>
> Ofc, having one QAction class in QtGui is desirable; but it must not
> infer source-incompatible changes (and no, hacks like forward declaring
> QWidget from QtGui or similar are also a no-go since it causes trouble
> for Qt for Python).
You can keep the API as is in QAction in QtGui, and have the implementation in
QtWidgets:
in QtGui/qaction.h
// forward declare classes from QtWidget
class QMenu;
class QWidget;
class Q_GUI_EXPORT QAction {
// ...
// that's ok, the class is forward declared
void setMenu(QMenu *);
QMenu *menu() const;
}
// in QtGui/private/qaction_p.h
class Q_GUI_EXPORT QActionHooks {
public:
virtual void setMenu(QAction *, QMenu *) = 0;
virtual QMenu *menu(const QAction *) = 0;
// ...
static QActionWidgetsHooks *instance;
};
// in QtGui/qaction.cpp
void QAction::setMenu(QMenu *menu) {
if (!QActionHooks::instance) {
qWarning("QAction::setMenu: can only be used in a QApplication") ;
return;
}
QActionHooks::instance->setMenu(this, menu);
}
// in QtWidgets/qapplication.cpp
#include <QtWidgets/private/qwidgetsactionhook_p.h> // implements QActionHooks
void QApplication::QApplication(...) {
// ...
static const QWidgetActionHooks actionHooks;
QActionWidgetsHooks::instance = &actionHooks;
// ...
}
That's just an example, there is other ways to do it.
More information about the Development
mailing list