Uploaded image for project: 'Qt'
  1. Qt
  2. QTBUG-69478

Move QAction to QtGui

    XMLWordPrintable

    Details

    • Type: Suggestion
    • Status: Closed
    • Priority: Not Evaluated
    • Resolution: Done
    • Affects Version/s: 6.0 (Next Major Release)
    • Fix Version/s: None
    • Labels:
      None
    • Commits:
      c92cb78b6d7c6590c79ec0e2df4dd577617bd3e1 (qt/qtbase/dev)

      Description

      Qt Quick Controls had to make their own version of QAction, to not depend on QtWidget. We should have a generic one in QtGui (ditto QActionGroup). QActionEvent (handled by widgets is already in QtGui). There is also QWidgetAction providing virtuals for creating/removing custom widgets.

      Should wait for https://codereview.qt-project.org/c/qt/qtbase/+/255770

      Functionality

      • Maintains a list of controls/widgets triggering the same , well, action
      • For propagating enabled/state, checked, etc to the controls, QAction emits changed() and sends QEvent::ActionChanged via sendEvent
      • Widgets have a list QWidgetPrivate::actions. QWidget::add/insertAction() adds them to the list and sends Event::ActionAdded, which the widgets handle to do the graphics setup and connections. Similarly for removeAction()
      • To trigger, controls call QAction::activate(ActionEvent { Trigger, Hover }

        ); this handles checkable internally) from the list of their actions

      • QAction::event(QEvent *e) catches keyboard shortcuts and triggers and calls activate()

      Problematic API in QAction:

       QMenu *QAction::menu() const/QAction::setMenu(QMenu *menu);
      QWidget *QAction::parentWidget() const
      QList<QWidget *> QAction::associatedWidgets() const
      QList<QGraphicsWidget *> QAction::associatedGraphicsWidgets() const
      bool QAction::showStatusText(QWidget *widget = nullptr);
      

      accesses

      qWidgetShortcutContextMatcher
      

      QActionGroup does not appear to have problematic dependencies.

      Workshop 6/19 conclusion

      QAction as such is pretty much tied to a list of controls (of some kind), so it does not make sense to move it as is into QtGui.

      It is suggested to extract a class QGuiAction into QtGui which has virtuals operating on the controls (sendEventToControls/removeFromControls()), following the QGuiApplication naming scheme.

      This would also minimize the porting hassle for widget applications.

      It might be worth trying the same with QShortcut.

        Attachments

          Issue Links

          No reviews matched the request. Check your Options in the drop-down menu of this sections header.

            Activity

              People

              Assignee:
              kleint Friedemann Kleint
              Reporter:
              allan.jensen Allan Sandfeld Jensen
              Votes:
              0 Vote for this issue
              Watchers:
              3 Start watching this issue

                Dates

                Created:
                Updated:
                Resolved: