[Interest] Qt 6.5.2 and qmllint questions/issues

Matthew Fincham matthewf at cat.co.za
Thu Aug 31 11:12:06 CEST 2023


Hi

I'm sorry for the burst of emails, and I'm not sure if this should be a 
new thread or not.

Another issue we are having with qmllint is adding type information for 
objects added to the global object in C++. We've used this to provide 
custom log and assert functions, but obviously the linter doesn't know 
about them. If they are added to qml/jsroot.qmltypes (along similar 
lines to the 'Console' type) then the linter does know about the type.

Is there a way to register types in the global property 'externally' ? 
I've tried a few variations of using the '-i' option in the linter, but 
without success.

Many thanks
Matthew Fincham



On 2023/08/30 15:24, Matthew Fincham via Interest wrote:
> Hi Ulf
>
> Thank you for your response.
>
>>> -- QtLocation --
>> Thanks for catching this. See 
>> https://codereview.qt-project.org/c/qt/qtlocation/+/500504 for a fix.
>>
> That's great, thank you.
>
>
>>> -- 'as' operator --
>> This should work. Type assertions (aka "as cast") are documented in 
>> https://doc.qt.io/qt-6/qtqml-javascript-hostenvironment.html . What 
>> kind of object does the loader produce here? Can you please open a 
>> bug report with a minimal example?
>>
> A bug report has been added: https://bugreports.qt.io/browse/QTBUG-116614
>
>
>>> -- Enums in gadgets --
>> So, what you want to do is expose MyType as a namespace instead:
>>
>> namespace MyTypeNamespace {
>>     Q_NAMESPACE
>>     QML_FOREIGN_NAMESPACE(MyType)
>>     QML_NAMED_ELEMENT(MyType)
>> }
>>
>> You cannot have reference semantics on a value type. A type with 
>> reference semantics (aka an "object type") needs to be derived from 
>> QObject and have a Q_OBJECT macro. The engine plays somewhat loose 
>> with that and allows you to still access enums from such broken 
>> types. We should amend the documentation to warn about this problem 
>> and also generate a run time warning from the engine.
>
> The example gadget was not the best. The gadget is used as an actual 
> value type in qml. A fuller example (as I have it) would be:
>
> C++:
>
>     struct TestGadget
>     {
>         Q_GADGET
>         QML_ELEMENT
>
>         Q_PROPERTY(int value MEMBER value)
>
>     public:
>         enum class GadgetEnum
>         {
>             OptionA,
>             OptionB,
>             OptionC,
>         };
>         Q_ENUM(GadgetEnum)
>
>     public:
>         static void registerType();
>
>     public:
>         int value = 0;
>     };
>
>
> QML: (apart from where it is used as a data type) example usage would be
>
>     // reference an instance of the gadget
>     ... someGadgetValue.value ...
>
>     // use the enum
>     console.log(TestGadget.GadgetEnum.OptionB)
>
>
> I've tried various permutations of the namespace macros you described, 
> but can't get it right. Firstly, is this possible, and if it is, what 
> is the canonical way of doing this? As it is it works, but you have 
> said it is actually a broken type.
>
> As a side note - a Google search for "qml q_gadget enum" has these as 
> the top two results (at least for me) which both recommend something 
> along the lines of the above.
> - 
> https://stackoverflow.com/questions/66855134/how-to-access-a-q-enum-declared-in-c-class-from-qml
> - https://qml.guide/enums-in-qt-qml
>
> I know they are not Qt documentation. Just pointing it out - it would 
> be nice if the Qt could somehow get a canonical example to the top of 
> that search.
>
> Thanks again for the feedback
>
> Kind regards
> Matthew
>
>
> _______________________________________________
> Interest mailing list
> Interest at qt-project.org
> https://lists.qt-project.org/listinfo/interest
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/interest/attachments/20230831/0f73e835/attachment.htm>


More information about the Interest mailing list