diff options
author | Liang Qi <liang.qi@qt.io> | 2023-07-20 04:26:14 +0200 |
---|---|---|
committer | Axel Spoerl <axel.spoerl@qt.io> | 2023-09-27 19:44:59 +0200 |
commit | fc556e3571b7e2d7fe307778b17e6cf0ff9e1bfc (patch) | |
tree | ac97ed3a99d7b5f8ef4b0697bf4f21511953908e /src/widgets/accessible | |
parent | 185c3b080c5d4875266833eda703fca57f8a30af (diff) |
QAccessibleComboBox: Cleanup comboBox() calls
Handle comboBox() returning nullptr.
Avoid repeated qobject_cast by calling comboBox() once per function.
Fixes: QTBUG-115161
Pick-to: 6.6 6.5 6.2
Change-Id: I3d102cebe807da379fa4d9ee2aee1e72b8fdf004
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
Diffstat (limited to 'src/widgets/accessible')
-rw-r--r-- | src/widgets/accessible/complexwidgets.cpp | 118 |
1 files changed, 66 insertions, 52 deletions
diff --git a/src/widgets/accessible/complexwidgets.cpp b/src/widgets/accessible/complexwidgets.cpp index 1248007417..d9f5a5ae81 100644 --- a/src/widgets/accessible/complexwidgets.cpp +++ b/src/widgets/accessible/complexwidgets.cpp @@ -283,17 +283,19 @@ QAccessibleComboBox::QAccessibleComboBox(QWidget *w) */ QComboBox *QAccessibleComboBox::comboBox() const { - return qobject_cast<QComboBox*>(object()); + return qobject_cast<QComboBox *>(object()); } QAccessibleInterface *QAccessibleComboBox::child(int index) const { - if (index == 0) { - QAbstractItemView *view = comboBox()->view(); - //QWidget *parent = view ? view->parentWidget() : 0; - return QAccessible::queryAccessibleInterface(view); - } else if (index == 1 && comboBox()->isEditable()) { - return QAccessible::queryAccessibleInterface(comboBox()->lineEdit()); + if (QComboBox *cBox = comboBox()) { + if (index == 0) { + QAbstractItemView *view = cBox->view(); + //QWidget *parent = view ? view->parentWidget() : 0; + return QAccessible::queryAccessibleInterface(view); + } else if (index == 1 && cBox->isEditable()) { + return QAccessible::queryAccessibleInterface(cBox->lineEdit()); + } } return nullptr; } @@ -301,22 +303,28 @@ QAccessibleInterface *QAccessibleComboBox::child(int index) const int QAccessibleComboBox::childCount() const { // list and text edit - return comboBox()->isEditable() ? 2 : 1; + if (QComboBox *cBox = comboBox()) + return (cBox->isEditable()) ? 2 : 1; + return 0; } QAccessibleInterface *QAccessibleComboBox::childAt(int x, int y) const { - if (comboBox()->isEditable() && comboBox()->lineEdit()->rect().contains(x, y)) - return child(1); + if (QComboBox *cBox = comboBox()) { + if (cBox->isEditable() && cBox->lineEdit()->rect().contains(x, y)) + return child(1); + } return nullptr; } int QAccessibleComboBox::indexOfChild(const QAccessibleInterface *child) const { - if (comboBox()->view() == child->object()) - return 0; - if (comboBox()->isEditable() && comboBox()->lineEdit() == child->object()) - return 1; + if (QComboBox *cBox = comboBox()) { + if (cBox->view() == child->object()) + return 0; + if (cBox->isEditable() && cBox->lineEdit() == child->object()) + return 1; + } return -1; } @@ -325,8 +333,10 @@ QAccessibleInterface *QAccessibleComboBox::focusChild() const // The editable combobox is the focus proxy of its lineedit, so the // lineedit itself never gets focus. But it is the accessible focus // child of an editable combobox. - if (comboBox()->isEditable()) - return child(1); + if (QComboBox *cBox = comboBox()) { + if (cBox->isEditable()) + return child(1); + } return nullptr; } @@ -334,29 +344,30 @@ QAccessibleInterface *QAccessibleComboBox::focusChild() const QString QAccessibleComboBox::text(QAccessible::Text t) const { QString str; - - switch (t) { - case QAccessible::Name: + if (QComboBox *cBox = comboBox()) { + switch (t) { + case QAccessible::Name: #ifndef Q_OS_UNIX // on Linux we use relations for this, name is text (fall through to Value) str = QAccessibleWidget::text(t); break; #endif - case QAccessible::Value: - if (comboBox()->isEditable()) - str = comboBox()->lineEdit()->text(); - else - str = comboBox()->currentText(); - break; + case QAccessible::Value: + if (cBox->isEditable()) + str = cBox->lineEdit()->text(); + else + str = cBox->currentText(); + break; #ifndef QT_NO_SHORTCUT - case QAccessible::Accelerator: - str = QKeySequence(Qt::Key_Down).toString(QKeySequence::NativeText); - break; + case QAccessible::Accelerator: + str = QKeySequence(Qt::Key_Down).toString(QKeySequence::NativeText); + break; #endif - default: - break; + default: + break; + } + if (str.isEmpty()) + str = QAccessibleWidget::text(t); } - if (str.isEmpty()) - str = QAccessibleWidget::text(t); return str; } @@ -364,10 +375,11 @@ QAccessible::State QAccessibleComboBox::state() const { QAccessible::State s = QAccessibleWidget::state(); - s.expandable = true; - s.expanded = isValid() && comboBox()->view()->isVisible(); - s.editable = comboBox()->isEditable(); - + if (QComboBox *cBox = comboBox()) { + s.expandable = true; + s.expanded = isValid() && cBox->view()->isVisible(); + s.editable = cBox->isEditable(); + } return s; } @@ -385,26 +397,28 @@ QString QAccessibleComboBox::localizedActionDescription(const QString &actionNam void QAccessibleComboBox::doAction(const QString &actionName) { - if (actionName == showMenuAction() || actionName == pressAction()) { - if (comboBox()->view()->isVisible()) { + if (QComboBox *cBox = comboBox()) { + if (actionName == showMenuAction() || actionName == pressAction()) { + if (cBox->view()->isVisible()) { #if defined(Q_OS_ANDROID) - const auto list = child(0)->tableInterface(); - if (list && list->selectedRowCount() > 0) { - comboBox()->setCurrentIndex(list->selectedRows().at(0)); - } - comboBox()->setFocus(); + const auto list = child(0)->tableInterface(); + if (list && list->selectedRowCount() > 0) { + cBox->setCurrentIndex(list->selectedRows().at(0)); + } + cBox->setFocus(); #endif - comboBox()->hidePopup(); - } else { - comboBox()->showPopup(); + cBox->hidePopup(); + } else { + cBox->showPopup(); #if defined(Q_OS_ANDROID) - const auto list = child(0)->tableInterface(); - if (list && list->selectedRowCount() > 0) { - auto selectedCells = list->selectedCells(); - QAccessibleEvent ev(selectedCells.at(0),QAccessible::Focus); - QAccessible::updateAccessibility(&ev); - } + const auto list = child(0)->tableInterface(); + if (list && list->selectedRowCount() > 0) { + auto selectedCells = list->selectedCells(); + QAccessibleEvent ev(selectedCells.at(0),QAccessible::Focus); + QAccessible::updateAccessibility(&ev); + } #endif + } } } } |