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.
This commit is contained in:
ali kettab 2023-12-15 17:18:00 +01:00
parent 484785fb88
commit 5fb8a54e14
9 changed files with 20 additions and 21 deletions

View file

@ -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;

View file

@ -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;

View file

@ -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; }

View file

@ -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.
//

View file

@ -10,6 +10,7 @@
#include <QtGui/QPicture>
#include <QtWidgets/QWidget>
#ifndef WX_PRECOMP
#include "wx/log.h"
@ -20,7 +21,6 @@
#include "wx/qt/dcclient.h"
#include "wx/qt/private/converter.h"
#include <QtWidgets/QScrollArea>
#include <QtGui/QPainter>
//##############################################################################

View file

@ -19,7 +19,6 @@
#include "wx/qt/private/converter.h"
#include "wx/qt/private/winevent.h"
#include <QtWidgets/QScrollArea>
#include <QtWidgets/QMainWindow>
#include <QtWidgets/QMenuBar>
@ -210,7 +209,7 @@ void wxFrame::RemoveChild( wxWindowBase *child )
wxFrameBase::RemoveChild( child );
}
QScrollArea *wxFrame::QtGetScrollBarsContainer() const
QAbstractScrollArea *wxFrame::QtGetScrollBarsContainer() const
{
return nullptr;
}

View file

@ -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<QAbstractScrollArea*>(m_qtListWidget);
}
void wxListBox::UnSelectAll()

View file

@ -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<QAbstractScrollArea*>(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();
}

View file

@ -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;
}