From 5fb8a54e14899dad99049e2a4c8901a0075e588c Mon Sep 17 00:00:00 2001 From: ali kettab Date: Fri, 15 Dec 2023 17:18:00 +0100 Subject: [PATCH] Change the return type of QtGetScrollBarsContainer() under wxQt Neither QListWidget nor QTextEdit derive from QScrollArea and the cast to it is just UB. Instead, using the common base class QAbstractScrollArea is safer and eliminates the need to these dangerous and insidious crosscast'ings. --- include/wx/qt/frame.h | 4 ++-- include/wx/qt/listbox.h | 4 ++-- include/wx/qt/textctrl.h | 4 ++-- include/wx/qt/window.h | 6 +++--- src/qt/dcclient.cpp | 2 +- src/qt/frame.cpp | 3 +-- src/qt/listbox.cpp | 4 ++-- src/qt/textctrl.cpp | 10 +++++----- src/qt/window.cpp | 4 ++-- 9 files changed, 20 insertions(+), 21 deletions(-) diff --git a/include/wx/qt/frame.h b/include/wx/qt/frame.h index 3c1db1e60b..d9b7e6b02c 100644 --- a/include/wx/qt/frame.h +++ b/include/wx/qt/frame.h @@ -13,7 +13,7 @@ #include "wx/frame.h" class QMainWindow; -class QScrollArea; +class QAbstractScrollArea; class WXDLLIMPEXP_CORE wxFrame : public wxFrameBase { @@ -51,7 +51,7 @@ public: virtual void RemoveChild( wxWindowBase *child ) override; QMainWindow *GetQMainWindow() const; - virtual QScrollArea *QtGetScrollBarsContainer() const override; + virtual QAbstractScrollArea *QtGetScrollBarsContainer() const override; protected: virtual wxPoint GetClientAreaOrigin() const override; diff --git a/include/wx/qt/listbox.h b/include/wx/qt/listbox.h index a8b072d568..4a123d712c 100644 --- a/include/wx/qt/listbox.h +++ b/include/wx/qt/listbox.h @@ -10,7 +10,7 @@ class QListWidget; class QModelIndex; -class QScrollArea; +class QAbstractScrollArea; class WXDLLIMPEXP_CORE wxListBox : public wxListBoxBase { @@ -87,7 +87,7 @@ protected: virtual int DoListHitTest(const wxPoint& point) const override; - virtual QScrollArea *QtGetScrollBarsContainer() const override; + virtual QAbstractScrollArea *QtGetScrollBarsContainer() const override; #if wxUSE_CHECKLISTBOX bool m_hasCheckBoxes; diff --git a/include/wx/qt/textctrl.h b/include/wx/qt/textctrl.h index 7b24c03773..741f90122e 100644 --- a/include/wx/qt/textctrl.h +++ b/include/wx/qt/textctrl.h @@ -8,7 +8,7 @@ #ifndef _WX_QT_TEXTCTRL_H_ #define _WX_QT_TEXTCTRL_H_ -class QScrollArea; +class QAbstractScrollArea; class wxQtEdit; class WXDLLIMPEXP_CORE wxTextCtrl : public wxTextCtrlBase @@ -93,7 +93,7 @@ protected: virtual bool DoLoadFile(const wxString& file, int fileType) override; virtual bool DoSaveFile(const wxString& file, int fileType) override; - virtual QScrollArea *QtGetScrollBarsContainer() const override; + virtual QAbstractScrollArea *QtGetScrollBarsContainer() const override; // From wxTextEntry: virtual wxWindow *GetEditableWindow() override { return this; } diff --git a/include/wx/qt/window.h b/include/wx/qt/window.h index 27eb929b00..62ac510cd0 100644 --- a/include/wx/qt/window.h +++ b/include/wx/qt/window.h @@ -15,7 +15,7 @@ class QShortcut; template < class T > class QList; class QWidget; -class QScrollArea; +class QAbstractScrollArea; class QScrollBar; class QPicture; class QPainter; @@ -181,7 +181,7 @@ public: virtual void QtHandleShortcut ( int command ); #endif // wxUSE_ACCEL - virtual QScrollArea *QtGetScrollBarsContainer() const; + virtual QAbstractScrollArea *QtGetScrollBarsContainer() const; #if wxUSE_TOOLTIPS // applies tooltip to the widget. @@ -232,7 +232,7 @@ protected: private: void Init(); - QScrollArea *m_qtContainer; // either nullptr or the same as m_qtWindow pointer + QAbstractScrollArea *m_qtContainer; // either nullptr or the same as m_qtWindow pointer // Return the viewport of m_qtContainer, if it's used, or just m_qtWindow. // diff --git a/src/qt/dcclient.cpp b/src/qt/dcclient.cpp index 5327ccfccc..4bd150c0ef 100644 --- a/src/qt/dcclient.cpp +++ b/src/qt/dcclient.cpp @@ -10,6 +10,7 @@ #include +#include #ifndef WX_PRECOMP #include "wx/log.h" @@ -20,7 +21,6 @@ #include "wx/qt/dcclient.h" #include "wx/qt/private/converter.h" -#include #include //############################################################################## diff --git a/src/qt/frame.cpp b/src/qt/frame.cpp index f47a4bab03..6d94f5670e 100644 --- a/src/qt/frame.cpp +++ b/src/qt/frame.cpp @@ -19,7 +19,6 @@ #include "wx/qt/private/converter.h" #include "wx/qt/private/winevent.h" -#include #include #include @@ -210,7 +209,7 @@ void wxFrame::RemoveChild( wxWindowBase *child ) wxFrameBase::RemoveChild( child ); } -QScrollArea *wxFrame::QtGetScrollBarsContainer() const +QAbstractScrollArea *wxFrame::QtGetScrollBarsContainer() const { return nullptr; } diff --git a/src/qt/listbox.cpp b/src/qt/listbox.cpp index b34c62fb3d..324ae12d6d 100644 --- a/src/qt/listbox.cpp +++ b/src/qt/listbox.cpp @@ -368,9 +368,9 @@ void wxListBox::QtSendEvent(wxEventType evtType, int rowIndex, bool selected) SendEvent(evtType, rowIndex, selected); } -QScrollArea *wxListBox::QtGetScrollBarsContainer() const +QAbstractScrollArea *wxListBox::QtGetScrollBarsContainer() const { - return (QScrollArea *) m_qtListWidget; + return static_cast(m_qtListWidget); } void wxListBox::UnSelectAll() diff --git a/src/qt/textctrl.cpp b/src/qt/textctrl.cpp index c1e59da2b5..6ed0428e3d 100644 --- a/src/qt/textctrl.cpp +++ b/src/qt/textctrl.cpp @@ -44,7 +44,7 @@ public: virtual long XYToPosition(long x, long y) const = 0; virtual bool PositionToXY(long pos, long *x, long *y) const = 0; virtual wxTextCtrlHitTestResult HitTest(const wxPoint& pt, long *pos) const = 0; - virtual QScrollArea *ScrollBarsContainer() const = 0; + virtual QAbstractScrollArea *ScrollBarsContainer() const = 0; virtual void WriteText( const wxString &text ) = 0; virtual void SetMaxLength(unsigned long len) = 0; virtual void MarkDirty() = 0; @@ -353,9 +353,9 @@ public: m_edit->ensureCursorVisible(); } - QScrollArea *ScrollBarsContainer() const override + QAbstractScrollArea *ScrollBarsContainer() const override { - return (QScrollArea *) m_edit; + return static_cast(m_edit); } virtual void SetStyleFlags(long flags) override @@ -559,7 +559,7 @@ public: return wxTE_HT_ON_TEXT; } - virtual QScrollArea *ScrollBarsContainer() const override + virtual QAbstractScrollArea *ScrollBarsContainer() const override { return nullptr; } @@ -911,7 +911,7 @@ QWidget *wxTextCtrl::GetHandle() const return (QWidget *) m_qtEdit->GetHandle(); } -QScrollArea *wxTextCtrl::QtGetScrollBarsContainer() const +QAbstractScrollArea *wxTextCtrl::QtGetScrollBarsContainer() const { return m_qtEdit->ScrollBarsContainer(); } diff --git a/src/qt/window.cpp b/src/qt/window.cpp index 1f4f008610..549db5d0e5 100644 --- a/src/qt/window.cpp +++ b/src/qt/window.cpp @@ -701,7 +701,7 @@ QWidget *wxWindowQt::QtGetClientWidget() const /* Returns a scrollbar for the given orientation */ QScrollBar *wxWindowQt::QtGetScrollBar( int orientation ) const { - QScrollArea *scrollArea = QtGetScrollBarsContainer(); + QAbstractScrollArea *scrollArea = QtGetScrollBarsContainer(); wxCHECK_MSG( scrollArea, nullptr, "Window without scrolling area" ); if ( orientation == wxHORIZONTAL ) @@ -1774,7 +1774,7 @@ QWidget *wxWindowQt::GetHandle() const return m_qtWindow; } -QScrollArea *wxWindowQt::QtGetScrollBarsContainer() const +QAbstractScrollArea *wxWindowQt::QtGetScrollBarsContainer() const { return m_qtContainer; }