diff options
| author | Marc Mutz <marc.mutz@qt.io> | 2025-11-03 07:04:21 +0100 |
|---|---|---|
| committer | Marc Mutz <marc.mutz@qt.io> | 2025-11-13 14:05:23 +0100 |
| commit | ec32a2c69e47ea16c5acf622bff5d046e8d94fe6 (patch) | |
| tree | 3bd460dcc6497ef62f3df5125f7cbfbe85883201 | |
| parent | f2ea9d8dc8dc8d52490722f78ea46cd374d8e649 (diff) | |
De-inline QComboBoxListView
Virtual functions should not be implemented inline. In particular, all
virtual functions were implemented inline (incl. the dtor), so this
class caused -Wweak-vtable, incl. all the negative effects that
entails.
As a drive-by, mark the contructor explicit.
Picking to all active branches to avoid conflicts going forward.
Pick-to: 6.10 6.8 6.5
Change-Id: I53d87871d77b82442745f1b77383c209e5d7141d
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
| -rw-r--r-- | src/widgets/widgets/qcombobox.cpp | 50 | ||||
| -rw-r--r-- | src/widgets/widgets/qcombobox_p.h | 46 |
2 files changed, 55 insertions, 41 deletions
diff --git a/src/widgets/widgets/qcombobox.cpp b/src/widgets/widgets/qcombobox.cpp index 2f51b83a49d..8f6582c50aa 100644 --- a/src/widgets/widgets/qcombobox.cpp +++ b/src/widgets/widgets/qcombobox.cpp @@ -60,6 +60,56 @@ QT_BEGIN_NAMESPACE using namespace Qt::StringLiterals; +// +// QComboBoxListView +// + +QComboBoxListView::QComboBoxListView(QComboBox *cmb) : combo(cmb) +{ + if (cmb) + setScreen(cmb->screen()); +} + +QComboBoxListView::~QComboBoxListView() + = default; + +void QComboBoxListView::resizeEvent(QResizeEvent *event) +{ + resizeContents(viewport()->width(), contentsSize().height()); + QListView::resizeEvent(event); +} + +void QComboBoxListView::initViewItemOption(QStyleOptionViewItem *option) const +{ + QListView::initViewItemOption(option); + option->showDecorationSelected = true; + if (combo) + option->font = combo->font(); +} + +void QComboBoxListView::paintEvent(QPaintEvent *e) +{ + if (combo) { + QStyleOptionComboBox opt; + opt.initFrom(combo); + opt.editable = combo->isEditable(); + if (combo->style()->styleHint(QStyle::SH_ComboBox_Popup, &opt, combo)) { + //we paint the empty menu area to avoid having blank space that can happen when scrolling + QStyleOptionMenuItem menuOpt; + menuOpt.initFrom(this); + menuOpt.palette = palette(); + menuOpt.state = QStyle::State_None; + menuOpt.checkType = QStyleOptionMenuItem::NotCheckable; + menuOpt.menuRect = e->rect(); + menuOpt.maxIconWidth = 0; + menuOpt.reservedShortcutWidth = 0; + QPainter p(viewport()); + combo->style()->drawControl(QStyle::CE_MenuEmptyArea, &menuOpt, &p, this); + } + } + QListView::paintEvent(e); +} + QComboBoxPrivate::QComboBoxPrivate() : QWidgetPrivate(), shownOnce(false), diff --git a/src/widgets/widgets/qcombobox_p.h b/src/widgets/widgets/qcombobox_p.h index 0bffbb26292..c6f9f0c6b41 100644 --- a/src/widgets/widgets/qcombobox_p.h +++ b/src/widgets/widgets/qcombobox_p.h @@ -48,49 +48,13 @@ class QComboBoxListView : public QListView { Q_OBJECT public: - QComboBoxListView(QComboBox *cmb = nullptr) : combo(cmb) - { - if (cmb) - setScreen(cmb->screen()); - } + explicit QComboBoxListView(QComboBox *cmb = nullptr); + ~QComboBoxListView() override; protected: - void resizeEvent(QResizeEvent *event) override - { - resizeContents(viewport()->width(), contentsSize().height()); - QListView::resizeEvent(event); - } - - void initViewItemOption(QStyleOptionViewItem *option) const override - { - QListView::initViewItemOption(option); - option->showDecorationSelected = true; - if (combo) - option->font = combo->font(); - } - - void paintEvent(QPaintEvent *e) override - { - if (combo) { - QStyleOptionComboBox opt; - opt.initFrom(combo); - opt.editable = combo->isEditable(); - if (combo->style()->styleHint(QStyle::SH_ComboBox_Popup, &opt, combo)) { - //we paint the empty menu area to avoid having blank space that can happen when scrolling - QStyleOptionMenuItem menuOpt; - menuOpt.initFrom(this); - menuOpt.palette = palette(); - menuOpt.state = QStyle::State_None; - menuOpt.checkType = QStyleOptionMenuItem::NotCheckable; - menuOpt.menuRect = e->rect(); - menuOpt.maxIconWidth = 0; - menuOpt.reservedShortcutWidth = 0; - QPainter p(viewport()); - combo->style()->drawControl(QStyle::CE_MenuEmptyArea, &menuOpt, &p, this); - } - } - QListView::paintEvent(e); - } + void resizeEvent(QResizeEvent *event) override; + void initViewItemOption(QStyleOptionViewItem *option) const override; + void paintEvent(QPaintEvent *e) override; private: QComboBox *combo; |
