diff options
author | Liang Qi <liang.qi@qt.io> | 2023-07-20 04:26:14 +0200 |
---|---|---|
committer | Liang Qi <liang.qi@qt.io> | 2023-10-17 10:18:51 +0200 |
commit | bc97aa94daab1083b182844de7c193b316b82473 (patch) | |
tree | e8ba48729c91c89886ad5860175f9cb71baca0b4 | |
parent | 4771b0da1126b744f07d50b5ec4f3498fe65816e (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.2
Change-Id: I3d102cebe807da379fa4d9ee2aee1e72b8fdf004
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
(cherry picked from commit fc556e3571b7e2d7fe307778b17e6cf0ff9e1bfc)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
(cherry picked from commit 718bb11701e768c64cb68cfca48baab2cc2e1727)
Reviewed-by: Axel Spoerl <axel.spoerl@qt.io>
-rw-r--r-- | src/widgets/accessible/complexwidgets.cpp | 116 |
1 files changed, 65 insertions, 51 deletions
diff --git a/src/widgets/accessible/complexwidgets.cpp b/src/widgets/accessible/complexwidgets.cpp index 4690a6e57f..204fca49b2 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,9 +375,10 @@ QAccessible::State QAccessibleComboBox::state() const { QAccessible::State s = QAccessibleWidget::state(); - s.expandable = true; - s.expanded = isValid() && comboBox()->view()->isVisible(); - + if (QComboBox *cBox = comboBox()) { + s.expandable = true; + s.expanded = isValid() && cBox->view()->isVisible(); + } return s; } @@ -384,26 +396,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 + } } } } |