[Development] Should QObject::event() be protected or public?
Volker Hilsheimer
volker.hilsheimer at qt.io
Fri Mar 15 14:28:29 CET 2024
> On 15 Mar 2024, at 12:30, Marc Mutz via Development <development at qt-project.org> wrote:
> On 15.03.24 09:11, apoenitz wrote:
>> On Fri, Mar 15, 2024 at 07:16:59AM +0000, Marc Mutz via Development wrote:
> [...]
>>> Please note that this means that any override (and all new QObject
>>> classes should contain one, since, in case we ever need it, it might not
>>> be possible to add it after the fact) should also be public.
>>
>> Neither is a necessary consequence, and I don't think this new rule
>> would be helpful.
>
> I have explained this here and over in TTLOFIR. If people choose to not
> read, or, if read, choose not to understand, or, if understood, choose
> to not accept, there's nothing more that I can do.
I have read, but not understood, what or where “TTLOFIR” is.
>> What kind of setups do you expect where an event() override in the
>> middle of the inheritance chain needs to be called from outside to
>> warrant this rule requiring class-implementor to regularly write code
>> that's unlikely (and I claim: Never) needed?
>
> It's not my job to argue why we should keep breaking a very general C++
> rule, one most C++ developers probably don't know _can_ be broken, but
> I'll throw you a bone: qcompleter.cpp
That there exists code that calls QObject::event directly, whether because it can (and the author didn’t know about QCoreApplication::sendEvent), or because it has to (to avoid recursion when using sendEvent), doesn’t make it any less of a smell.
And we evidently need to have a public QObject::event so that code that must call it (for whatever reason) has a way to do so. Some smells have valid reasons to exist, and making them visible in code by requiring
(static_cast<QObject *>(d->widget))->event(ke);
(unnecessary parenthesis presumably not required for it to raise eyebrows in code review) is a good thing.
But I still don’t see a reason why we now need to start arguing about a pattern that has been used in Qt quite consistently for 30 years, i.e. making overrides of event handlers, including QObject::event and QObject::eventFilter, protected.
Volker
PS: and indeed, just that something has been done for 30 years is not an argument in itself; that it’s a pattern that has worked, has been accepted, and has prevented mistakes however is.
More information about the Development
mailing list