diff -pruN 6.8.2-4/.QT-ENTERPRISE-LICENSE-AGREEMENT 6.9.1-1/.QT-ENTERPRISE-LICENSE-AGREEMENT
--- 6.8.2-4/.QT-ENTERPRISE-LICENSE-AGREEMENT	2025-01-24 19:57:20.451778700 +0000
+++ 6.9.1-1/.QT-ENTERPRISE-LICENSE-AGREEMENT	2025-05-29 12:06:54.825387200 +0000
@@ -108,155 +108,481 @@ Version 2024-02
 3. Appendix for Privacy and Security Terms https://www.qt.io/terms-conditions/privacy-and-security
 
 Appendix for Qt Development Framework
-Version 2024-02
+Version 2025-02, compliant with Qt Frame Agreement 2023-06 or later
 
-1. This Appendix for Qt Development Framework is an integral part of the Agreement and specifies the legal terms for the licensing of Licensed Software (as defined below) between The Qt Company and the Customer. Entry into this Appendix governs the use of and supersedes any prior contracts between the Parties (including prior License Agreements and similar prior agreements), with respect to the Licensed Software under this Appendix.
+1. This Appendix for Qt Development Framework is an integral part of the Agreement and specifies the legal terms for the licensing of Licensed Software (as defined below) between The Qt Company and Customer. Entry into this Appendix governs the use of and supersedes any prior contracts between the Parties (including prior License Agreements and similar prior agreements), with respect to Licensed Software governed by this Appendix.
 
 2. DEFINITIONS
-2.1. Capitalized words used in this Appendix shall have the meanings described in the Agreement or as defined below.
-2.2. "Add-on Products" shall mean The Qt Company's specific add-on software products which are not licensed as part of The Qt Company's standard Services offerings, but shall be included into the scope of Licensed Software only if so specifically agreed between the Parties.
-2.3. "Application" means software products created using the Licensed Software, which include the Redistributables, or part thereof.
-2.4. "End Customer" shall mean Customer's customer(s) to whom Customer, directly or indirectly, distributes copies of the Redistributables as integrated or incorporated into Applications or Devices.
-2.5. "Data Protection Legislation" shall mean the General Data Protection Regulation (EU 2016/679) (GDPR) and any national implementing laws, regulations and secondary legislation, as may be amended or updated from time to time, as well as any other data protection laws or regulations applicable in the relevant territory.
-2.6. "Deployment Platforms" shall mean target operating systems and/or hardware specified in the License Certificate, on which the Redistributables can be distributed pursuant to the terms and conditions of this Appendix.
-2.7. "Designated User(s)" shall mean the employee(s) of Customer or Customer's Affiliates acting within the scope of their employment or Customer's Contractors acting within the scope of their services on behalf of Customer.
-2.8. "Development License" shall mean the license needed by the Customer for each Designated User to use Licensed Software under the license grant described in Section 5 of this Appendix. Development Licenses are available per respective Licensed Software products; each product having its designated scope and purpose of use.
-2.9. "Development Platforms" shall mean the host operating system(s) specified in the License Certificate, on which Licensed Software can be used under the Development License.
-2.10. "Devices" shall mean
-(i) hardware devices or products that
-a. are manufactured and/or distributed by the Customer, its Affiliates, Contractors or End Customer, and
-b. incorporate, integrate or link to Applications such that substantial functionality of such unit, when used by an End User, is provided by Application(s) or otherwise depends on the Licensed Software; or
-(ii) Applications designed for the hardware devices specified in item (i).
-Devices covered by this Appendix shall be specified in the Pricing Appendix or Purchase Document.
-2.11. "Distribution License(s)" shall mean a royalty-bearing license required for any kind of sale, trade, exchange, loan, lease, rental or other distribution by or on behalf of Customer to a third party of Redistributables in connection with Devices pursuant to license grant described in Section 5.3 of this Appendix. Distribution Licenses are sold separately for each type of Device respectively and cannot be used for any other type of Devices.
-2.12. "Distribution License Packs" shall mean set of prepaid Distribution Licenses for distribution of Redistributables, as defined in The Qt Company's standard price list, quote, Pricing Appendix  or in the Purchase Document, as applicable.
-2.13. "Evaluation License Term" shall mean a time period specified in the License Certificate for the Customer to use the relevant Licensed Software for evaluation purposes according to Section 5.6 of this Appendix.
-2.14. "Intellectual Property Rights" shall mean patents (including utility models), design patents, and designs (whether or not capable of registration), chip topography rights and other like protection, copyrights, trademarks, service marks, trade names, logos or other words or symbols and any other form of statutory protection of any kind and applications for any of the foregoing as well as any trade secrets.
-2.15. "License Certificate" shall mean a certificate generated by The Qt Company for each Designated User respectively upon their download of the Licensed Software, which will be available under the respective Designated User's Qt Account at account.qt.io. License Certificates will specify relevant information pertaining to the Licensed Software purchased by Customer and the license to the Licensed Software.
-2.16. "License Fee" shall mean the fee charged to Customer for rights granted under this Appendix.
-2.17. "Licensed Software" shall mean the specified product(s) of Qt Software which Customer has purchased and which is provided to Customer under the terms of this Appendix (including its Exhibits). Licensed Software shall include corresponding online or electronic documentation, associated media and printed materials, including source code (where applicable), example programs and the documentation. Licensed Software does not include Third Party Software (as defined in Section 6) or Qt Community Edition. The Qt Company may, in the course of its development activities, at its free and absolute discretion and without any obligation to send or publish any notifications to Customer or in general, make changes, additions or deletions in the components and functionalities of the Licensed Software, provided that no such changes, additions or deletions will affect the already released version of the Licensed Software, but only upcoming version(s).
-2.18. "License Term" shall mean the agreed validity period of the Development License during which the relevant Licensed Software product can be used pursuant to this Appendix. The agreed License Term, as ordered and paid for by Customer, shall be memorialized in the applicable License Certificate.
-2.19. "Customer's Records" shall mean books and records that contain information bearing on Customer's compliance with the  Agreement, Customer's use of Qt Community Edition and/or the payments due to The Qt Company under the Agreement, including, but not limited to user information, assembly logs, sales records and distribution records.
-2.20. "Modified Software" shall have the meaning as set forth below in Section 4.
-2.21. "Qt Software" shall mean the development and design software of The Qt Company, which The Qt Company makes available under commercial and/or open source licenses as either the "Licensed Software" or the "Qt Community Edition".
-2.22. "Permitted Software" shall mean third party products that are generally available to the public, which may include parts of Qt Community Edition or be developed using Qt Community Edition.
-2.23. "Pre-Release Code" shall have the meaning as set forth in Section 7.
-2.24. "Prohibited Combination" shall mean any effort to use, combine, incorporate, link or integrate Licensed Software with any software created with or incorporating Qt Community Edition, or use Licensed Software for creation of any such software.
-2.25. "Qt Community Edition" shall mean  the open source version of Qt Software available under the terms of the GNU Lesser General Public License, version 2.1 or later ("LGPL") or the GNU General Public License, version 2.0 or later ("GPL"). For clarity, Qt Community Edition shall not be provided, governed or used under this Appendix.
-2.26. "Redistributables" shall mean the portions of Licensed Software as set forth in Exhibit 1 hereto that may be distributed pursuant to this Appendix in object code form only, including any relevant documentation. Where relevant, any reference to Licensed Software in this Appendix includes and refers  to Redistributables.
-2.27. "Renewal Term" shall mean an extension of the previous License Term as agreed between the Parties.
-2.28. "Submitted Modified Software" shall have the meaning as set forth in Section 4.2 of this Appendix.
-2.29. "Third-Party Software" shall have the meaning set forth in Section 6 of this Appendix.
-2.30. "Updates" shall mean a release or version of the Licensed Software containing bug fixes, error corrections and other changes that are generally made available to users of the Licensed Software that have contracted for Support. Updates are generally depicted as a change to the digits following the decimal in the Licensed Software version number. The Qt Company shall make Updates available to Customer under the Support. Updates shall be considered as part of the Licensed Software hereunder.
-2.31. "Upgrades" shall mean a release or version of the Licensed Software containing enhancements and new features and are generally depicted as a change to the first digit of the Licensed Software version number. In the event that Upgrades are provided to Customer under this Appendix, they shall be considered as part of the Licensed Software hereunder.
+2.1. Capitalized words used in this Appendix and not defined below shall have the meanings described in the Agreement.
+2.2. “Add-on Products” means The Qt Company’s specific add-on software products which are not licensed as part of The Qt Company’s standard Services offerings, and are included in the scope of Licensed Software only if specifically agreed between the Parties.
+2.3. “Application” means software products created using the Licensed Software, which include the Redistributables, or part thereof.
+2.4. “Customer’s Records” means books and records that contain information bearing on Customer’s compliance with the Agreement, Customer’s use of Qt Community Edition and/or the payments due to The Qt Company under the Agreement, including, but not limited to user information, assembly and/or build logs, portions of Licensed Software used, sales records and distribution records.
+2.5. “Data Protection Legislation” means the General Data Protection Regulation (EU 2016/679) (GDPR) and any national implementing laws, regulations and secondary legislation, as may be amended or updated from time to time, as well as any other data protection laws or regulations applicable in the relevant territory.
+2.6. “Deployment Platforms” means target operating systems and/or hardware specified in the License Certificate, on which the Redistributables can be distributed pursuant to the terms and conditions of this Appendix.
+2.7. “Designated User(s)” means the employee(s) of Customer or Customer’s Affiliates acting within the scope of their employment or Customer’s Contractors acting within the scope of their services on behalf of Customer.
+2.8. “Development License” means the license needed by Customer for each Designated User to use Licensed Software under the license grant in Section 5 of this Appendix. Development Licenses are available per respective Licensed Software product; each product having its designated scope and purpose of use.
+2.9. “Development Platforms” means the host operating system(s) specified in the License Certificate, on which Licensed Software can be used under the Development License.
+2.10. “Devices” means
+(i) hardware or compute units that are manufactured and/or distributed by the Customer, its Affiliates, Contractors, or End Customer, and incorporate or include Licensed Software; or
+(ii) Applications which provide Substantial Functionality (as defined below) by communicating, integrating, or otherwise interacting in any way with a hardware or compute unit, regardless of whether the Application is provided together with the hardware or compute unit, or separate therefrom.
+For the purpose of defining a Device, “Substantial Functionality” means that a normal, intended or specified operation of a hardware or compute unit is dependent on or limited by the Application.
+Devices covered by this Appendix are specified in the Pricing Appendix or Purchase Document. Customer’s end product may contain more than one Device and require more than one Distribution License per end product.
+2.11. “Distribution License(s)” means a royalty-bearing license required for any kind of sale, trade, exchange, loan, lease, rental or other distribution by or on behalf of Customer to a third party (including Affiliates) of a Device pursuant to Section 5.3 of this Appendix. Use of Distribution Licenses is valid for the agreed period (either in perpetuity or for a period defined in the Purchase Document(s)), sold separately for each type of Device, and cannot be used for other types of Devices.
+2.12. “Distribution License Packs” means set of prepaid Distribution Licenses as defined in The Qt Company’s standard price list, quote, Pricing Appendix or in the Purchase Document, as applicable.
+2.13. “End Customer” means Customer’s customer(s) to whom Customer, directly or indirectly, distributes copies of the Redistributables as integrated or incorporated into Applications or Devices.
+2.14. “Evaluation License Term” means a time period specified in the License Certificate for Customer to use the relevant Licensed Software for evaluation purposes according to Section 5.5 of this Appendix.
+2.15. “Intellectual Property Rights” means patents (including utility models), design patents, and designs (whether or not capable of registration), chip topography rights and other like protection, copyrights, trademarks, service marks, trade names, logos or other words or symbols, any other form of statutory protection of any kind and applications for any of the foregoing, as well as any trade secrets.
+2.16. “License Certificate” means a certificate generated by The Qt Company for each Designated User upon their download of the Licensed Software, which will be available under the respective Designated User’s Qt Account at account.qt.io. License Certificates specify relevant information pertaining to the Licensed Software purchased by Customer and the license to the Licensed Software.
+2.17. “License Fee” means the fee charged to Customer for rights granted under this Appendix.
+2.18. “Licensed Software” means the specified product(s) of Qt Software which Customer has purchased, and which is provided to Customer under the terms of this Appendix and Agreement (including its Exhibits). Licensed Software shall include corresponding online or electronic documentation, associated media and printed materials, including source code (where applicable), example programs and documentation. Licensed Software does not include Third Party Software (as defined in Section 6) or Qt Community Edition. The Qt Company may, in the course of its development activities, at its free and absolute discretion and without any obligation to send or publish any notifications, make changes, additions or deletions in the components and functionalities of the Licensed Software, provided that no such changes, additions or deletions will affect the already released version of the Licensed Software, but only upcoming version(s).
+2.19. “License Term” means the agreed validity period of the Development License during which the relevant Licensed Software can be used pursuant to this Appendix. The agreed License Term, as ordered and paid for by Customer, is stated in the applicable License Certificate.
+2.20. “Modified Software” has the meaning set forth below in Section 4.
+2.21. “Permitted Software” means third party products that are generally available to the public, which may include parts of Qt Community Edition or be developed using Qt Community Edition.
+2.22. “Pre-Release Code” has the meaning set forth in Section 7.
+2.23. “Prohibited Combination” means any effort to use, combine, incorporate, link or integrate Licensed Software with any software created with or incorporating Qt Community Edition, or use Licensed Software for creation of any such software.
+2.24. “Qt Community Edition” means the open source version of Qt Software primarily available under the terms of the GNU Lesser General Public License, version 2.1 or later (“LGPL”) or the GNU General Public License, version 2.0 or later (“GPL”). For clarity, Qt Community Edition shall not be provided, governed or used under this Appendix.
+2.25. “Qt Software” means the development and design software of The Qt Company, which The Qt Company makes available under commercial and/or open source licenses as either the “Licensed Software” or the “Qt Community Edition”.
+2.26. “Redistributables" means the portions of Licensed Software set forth in Exhibit 1 that may be distributed pursuant to this Appendix in object code form only, including any relevant documentation. Where relevant, any reference to Licensed Software in this Appendix includes and refers to Redistributables.
+2.27. “Renewal Term” means an extension of the previous License Term as agreed between the Parties.
+2.28. “Submitted Modified Software” has the meaning set forth in Section 4.2 of this Appendix.
+2.29. “Third-Party Software" has the meaning set forth in Section 6 of this Appendix.
+2.30. “Updates” means a release or version of the Licensed Software containing bug fixes, error corrections and other changes that are generally made available to users of the Licensed Software that have contracted for Support. Updates are generally depicted as a change to the digits following the decimal in the Licensed Software version number. The Qt Company shall make Updates available to Customer under the Support. Updates shall be considered as part of the Licensed Software hereunder.
+2.31. “Upgrades” means a release or version of the Licensed Software containing enhancements and new features and are generally depicted as a change to the first digit of the Licensed Software version number. In the event that Upgrades are provided to Customer under this Appendix, they shall be considered as part of the Licensed Software.
 
 3. OWNERSHIP
 3.1. Ownership of The Qt Company
 3.1.1. The Licensed Software is protected by copyright laws and international copyright treaties, as well as other intellectual property laws and treaties. The Licensed Software is licensed, not sold.
-3.1.2. All of The Qt Company's Intellectual Property Rights are and shall remain the exclusive property of The Qt Company or its respective licensors . No rights to The Qt Company's Intellectual Property Rights are assigned or granted to Customer under this Appendix, except when and to the extent expressly specified herein.
+3.1.2. All of The Qt Company's Intellectual Property Rights are and shall remain the exclusive property of The Qt Company or its respective licensors. No rights to The Qt Company’s Intellectual Property Rights are assigned or granted to Customer under this Appendix, except when and solely to the extent expressly specified herein.
 3.2. Ownership of Customer
-3.2.1. All of Customer's Intellectual Property Rights are and shall remain the exclusive property of Customer or its licensors respectively.
+3.2.1. All of Customer’s Intellectual Property Rights are and shall remain the exclusive property of Customer or its licensors respectively.
 3.2.2. Except to the extent set forth in this Appendix, all Intellectual Property Rights to the Modified Software, Applications and Devices (except to Redistributables included therein) shall remain with Customer.
 
 4. MODIFIED SOFTWARE
-4.1. Customer may create bug-fixes, error corrections, patches or modifications to the Licensed Software ("Modified Software"). To the extent that Customer's Modified Software breaks source or binary compatibility or other functionality with the Licensed Software, Customer acknowledges that The Qt Company's ability to provide Support may be prevented or limited and Customer's ability to make use of Updates may be restricted.
-4.2. Customer may, at its sole and absolute discretion, choose to submit Modified Software to The Qt Company ("Submitted Modified Software") in connection with Customer's Support request, service request or otherwise. In the event Customer does so, then, Customer hereby grants The Qt Company a sublicensable, assignable, irrevocable, perpetual, worldwide, non-exclusive, royalty-free and fully paid-up license, under all of Customer's Intellectual Property Rights, to reproduce, adapt, translate, modify, and prepare derivative works of, publicly display, publicly perform, sublicense, make available and distribute such Submitted Modified Software as The Qt Company sees fit at its free and absolute discretion.
+4.1. Customer may create bug-fixes, error corrections, patches or modifications to the Licensed Software (“Modified Software”). To the extent that Customer’s Modified Software breaks source or binary compatibility or other functionality with the Licensed Software, Customer acknowledges that The Qt Company’s ability to provide Support may be prevented or limited and Customer’s ability to make use of Updates may be restricted.
+4.2. Customer may, at its sole and absolute discretion, choose to submit Modified Software to The Qt Company (“Submitted Modified Software”) in connection with Customer’s Support request, service request or otherwise. In the event Customer does so, then, Customer hereby grants The Qt Company a sublicensable, assignable, irrevocable, perpetual, worldwide, non-exclusive, royalty-free and fully paid-up license, under all of Customer’s Intellectual Property Rights, to reproduce, adapt, translate, modify, and prepare derivative works of, publicly display, publicly perform, sublicense, make available and distribute such Submitted Modified Software as The Qt Company sees fit at its free and absolute discretion.
 
 5. LICENSES GRANTED
 5.1. Development with Licensed Software
-5.1.1. Subject to the terms of the Agreement, The Qt Company grants to Customer a worldwide, non-exclusive, non-transferable license, valid for each License Term, to use, modify and copy the Licensed Software by Designated Users on the Development Platforms for the sole purposes of designing, developing, demonstrating and testing Application(s) and/or Devices, and to provide support and other services related to such Applications and Devices to End Customers. Each Application and/or Device can only include, incorporate or integrate contributions by such Designated Users who are duly licensed for the applicable Development Platform(s) and Deployment Platform(s) (i.e have a valid license for the appropriate Licensed Software product and only use one type of Qt Development License per Customer Application and/or Device(s)).
+5.1.1. Subject to the terms of the Agreement, The Qt Company grants to Customer a worldwide, non-exclusive, non-transferable license, valid for each License Term, to use, modify and copy the Licensed Software by Designated Users on the Development Platforms for the sole purposes of designing, developing, demonstrating and testing Application(s) and/or Devices, and to provide support, maintenance, updates, and other services related to such Applications and Devices to End Customers. Each Application or Device can only include, incorporate or integrate contributions by Designated Users who are duly licensed for the applicable Development Platform(s) and Deployment Platform(s) (i.e. have a current and valid Development License for the appropriate Licensed Software and only use one type of Development License per Customer Application or Device(s)).
 5.1.2. Customer may install copies of the Licensed Software on five (5) computers per Designated User, provided that only Designated Users who have a valid Development License may use the Licensed Software.
-5.1.3. Customer may designate another Designated User to replace a then-current Designated User by notifying The Qt Company in writing, where such replacement is due to termination of employment, long-term absence or other permanent reason affecting Designated User's need for Licensed Software.
-5.1.4. Upon expiry of the initially agreed License Term, the respective License Term shall be automatically extended by one or more Renewal Term(s), unless and until either Party notifies the other Party in writing, that it does not wish to continue the License Term, such notification to be provided to the other Party no less than thirty (30) days before expiry of the respective License Term. The Qt Company shall, in good time before the due date for the above notification, remind the Customer on the coming Renewal Term. Unless otherwise agreed between the Parties, Renewal Term shall be equal to the length of the previous License Term, but no longer than thirty-six (36) months.
-5.1.5. Any such Renewal Term shall be subject to License Fees agreed between the Parties or, if no advance agreement exists, subject to The Qt Company's standard list pricing applicable at the commencement date of any such Renewal Term.
-5.2. Distribution of Applications
-5.2.1. Subject to the terms of the Agreement, The Qt Company grants to Customer a worldwide, non-exclusive, non-transferable, perpetual, royalty-free and revocable (only for Customer’s material breach of agreement) right and license to:
-(i) distribute, by itself or through its Contractors, Redistributables as installed, incorporated or integrated into Applications for execution on the Deployment Platforms; and
-(ii) grant perpetual and irrevocable sublicenses to Redistributables, as distributed hereunder, for End Customers solely to the extent necessary in order for the End Customers to use the Applications for their respective intended purposes.
-5.2.2. Right to distribute the Redistributables as part of an Application as provided herein is not royalty-bearing but is conditional upon the Application having been created, updated and maintained under a valid and duly paid Development License.
+5.1.3. Customer may designate another Designated User to replace a then-current Designated User by notifying The Qt Company in writing, where such replacement is due to termination of employment, long-term absence or other permanent reason affecting Designated User’s need for Licensed Software.
+5.1.4. Upon expiry of the initially agreed License Term, the respective License Term shall be automatically extended by one or more Renewal Term(s), unless and until either Party notifies the other Party in writing, that it does not wish to continue the License Term, such notification to be provided to the other Party no less than thirty (30) days before expiry of the respective License Term. The Qt Company shall, in good time before the due date for the above notification, remind the Customer of the coming Renewal Term. Unless otherwise agreed between the Parties, Renewal Term shall be equal to the length of the previous License Term, but no longer than thirty-six (36) months.
+5.1.5. Any such Renewal Term shall be subject to License Fees agreed between the Parties or, if no advance agreement exists, subject to The Qt Company’s standard list pricing applicable at the commencement date of any such Renewal Term.
+5.2. Distribution of Applications. Subject to the terms of the Agreement, The Qt Company grants Customer a worldwide, non-exclusive, non-transferable, perpetual, royalty-free and revocable (for Customer’s material breach of the Agreement) right and license to:
+(i) distribute, by itself or through its Contractors, Applications for use on the Deployment Platforms; and
+(ii) grant End Customers perpetual sublicenses to Redistributables used in Applications solely to the extent necessary for End Customers to use the Applications as intended.
 5.3. Distribution of Devices
-5.3.1. Subject to the terms of the Agreement, The Qt Company grants to Customer a worldwide, non-exclusive, non-transferable, perpetual, revocable (only for Customer’s material breach of agreement), royalty-bearing right and license to:
-(i) distribute, by itself or through one or more tiers of Contractors, Redistributables as installed, incorporated or integrated, or intended to be installed, incorporated or integrated into Devices for execution on the Deployment Platforms; and
-(ii) grant perpetual and irrevocable sublicenses to Redistributables, as distributed hereunder, for End Customers solely to the extent necessary in order for the End Customers to use the Devices for their respective intended purposes.
-5.3.2. Right to distribute the Devices as provided herein is conditional upon (i) the Devices having been created, updated and maintained under a valid and duly paid Development License, and (ii) Customer having acquired corresponding Distribution Licenses at the time of distribution of any Devices to End Customers.
+5.3.1. Subject to the terms of the Agreement, The Qt Company grants Customer a worldwide, non-exclusive, non-transferable, revocable (for Customer’s material breach of the Agreement), royalty-bearing right and license to:
+(i) distribute (including through its Contractors), Devices for use on the Deployment Platforms; and
+(ii) grant End Customers perpetual sublicenses to Redistributables used in Devices, solely to the extent necessary for End Customers to use the Devices as intended.
+5.3.2. Right to distribute the Devices requires that:
+(i) the Devices are created, updated and maintained under a current and valid Development License,
+(ii) Customer has purchased corresponding Distribution Licenses before distribution of any Devices to End Customers, and
+(iii) the Distribution Licenses are valid for distribution at the date of distribution.
 5.4. Further Requirements
 5.4.1. The licenses granted in this Section 5 by The Qt Company to Customer are conditional and subject to Customer's compliance with the following terms:
-(i) Customer acknowledges that The Qt Company has separate products for the purpose of Applications and Devices respectively, where development and distribution of Devices is only allowed using the correct designated product. Customer shall ensure and bear the burden of proof that Customer is using a correct product entitling Customer to development and distribution of Devices;
+(i)  Customer acknowledges that The Qt Company has separate products for the purpose of Applications and Devices respectively, where development and distribution of Devices is only allowed using the correct designated product. Customer shall ensure and bear the burden of proof that Customer is using a correct product entitling Customer to development and distribution of Devices;
 (ii) Customer shall not remove or alter any copyright, trademark or other proprietary rights notice(s) contained in any portion of the Licensed Software;
-(iii) Applications must add primary and substantial functionality to Licensed Software so as not to compete with the Licensed Software;
-(iv) Applications may not pass on functionality which in any way makes it possible for others to create software with Licensed Software; provided however that Customer may use Licensed Software’s scripting and QML ("Qt Quick") functionality solely in order to enable scripting, themes and styles that augment the functionality and appearance of the Application(s) without adding primary and substantial functionality to the Application(s);
+(iii)  Applications must add primary and material functionality to Licensed Software so as not to compete with the Licensed Software;
+(iv)   Applications may not pass on functionality which in any way makes it possible for others to create software with Licensed Software; provided however that Customer may use Licensed Software’s scripting and QML ("Qt Quick") functionality solely in order to enable scripting, themes and styles that augment the functionality and appearance of the Application(s) without adding primary and substantial functionality to the Application(s);
 (v) Customer shall not use Licensed Software in any manner or for any purpose that infringes, misappropriates or otherwise violates any Intellectual Property Right or right of any third party, or that violates any applicable law;
 (vi) Customer shall not use The Qt Company's or any of its suppliers' names, logos, or trademarks to market Applications, except that Customer may use “Built with Qt” logo to indicate that an Application or Device was developed using Licensed Software;
 (vii) Customer shall not distribute, sublicense or disclose source code of Licensed Software to any third party (provided however that Customer may appoint employee(s) of Contractors and Affiliates as Designated Users to use Licensed Software pursuant to this Appendix).
 (viii) Customer shall not grant the End Customers a right to: (a) make copies of the Redistributables except when and to the extent required to use the Applications and/or Devices for their intended purpose; (b) modify the Redistributables or create derivative works thereof; (c) decompile, disassemble or otherwise reverse engineer Redistributables; or (d) redistribute any copy or portion of the Redistributables to any third party, except as part of the onward sale of the Application or Device on which the Redistributables are installed;
-(ix) Customer shall not, and shall cause that its Affiliates or Contractors shall not, use Licensed Software in any Prohibited Combination, unless Customer has received specific advance written permission from The Qt Company to do so. Absent such written permission, any and all distribution by Customer during the term of the Agreement of a hardware device or product: a) which incorporates or integrates any part of Licensed Software or Qt Community Edition; or b) where substantial functionality is provided by software built with Licensed Software or Qt Community Edition or otherwise depends on Licensed Software or Qt Community Edition, shall be considered to be Device distribution under this Appendix and shall be dependent on Customer’s compliance thereof (including but not limited to the obligation to pay applicable License Fees for such distribution). Notwithstanding the foregoing, Customer is entitled to use and combine Licensed Software with Permitted Software;
-(x) Customer shall cause all of its Affiliates, Contractors and End Customer entitled to make use of the licenses granted under this Appendix, to be contractually bound to comply with the relevant terms hereof and not to use the Licensed Software beyond the terms hereof nor for any purposes other than operating within the scope of their services for Customer. Customer shall be responsible for any and all actions and omissions of its Affiliates, Contractors, and End Customers relating to the Licensed Software and use thereof (including but not limited to payment of all applicable License Fees);
+(ix) Customer shall not and shall cause that its Affiliates, Contractors or End Customers shall not, use Licensed Software in any Prohibited Combination, unless Customer has received specific advance written permission from The Qt Company to do so. Without the written permission of The Qt Company, any and all distribution by Customer of a hardware device or product: a) which incorporates or integrates any part of Licensed Software or Qt Community Edition; or b) where material functionality is provided by software built with Licensed Software or Qt Community Edition or otherwise depends on Licensed Software or Qt Community Edition, shall be considered to be Device distribution under this Appendix and shall be dependent on Customer’s compliance thereof (including but not limited to the obligation to pay applicable License Fees for such distribution). Notwithstanding the foregoing, Customer is entitled to use and combine Licensed Software with Permitted Software;
+(x) Customer shall cause all of its Affiliates, Contractors and End Customers entitled to make use of the licenses granted under this Appendix, to be contractually bound to comply with the relevant terms hereof and not to use the Licensed Software beyond the terms hereof nor for any purposes other than operating within the scope of their services for Customer. Customer shall be responsible for any and all actions and omissions of its Designated Users, Affiliates, Contractors, and End Customers relating to the Licensed Software and use thereof (including but not limited to payment of all applicable License Fees);
 (xi) Except when and to the extent explicitly provided in this Section 5, Customer shall not transfer, publish, disclose, display or otherwise make available the Licensed Software; and
 (xii) Customer shall not attempt or enlist a third party to conduct or attempt to conduct any of the above.
 5.4.2. The above terms shall not be applicable if and solely to the extent they conflict with any mandatory provisions of applicable laws.
-5.4.3. Any use of Licensed Software beyond the provisions of this Appendix is strictly prohibited and requires, at a minimum an additional license from The Qt Company (e.g. certain additional rights granted under software development kit “SDK” agreement with regard to limitations of Section 5.4.1 iv, vii or viii).
+5.4.3. Any use of Licensed Software beyond the provisions of this Appendix is strictly prohibited and requires, at a minimum an additional license from The Qt Company (e.g. certain additional rights may be granted under a software development kit “SDK” agreement with regard to limitations of Section 5.4.1 iv, vii or viii).
 5.5. Evaluation License
 5.5.1. Subject to the terms of this Appendix, The Qt Company grants to Customer a worldwide, non-exclusive, non-transferable license, valid for the Evaluation License Term to use the relevant Licensed Software product solely for Customer’s internal use to evaluate and determine whether the Licensed Software meets Customer's business requirements, specifically excluding any commercial use of the Licensed Software or any derived work thereof.
-5.5.2. Upon the expiry of the Evaluation License Term, Customer must either discontinue use of the relevant Licensed Software or acquire a commercial Development License specified herein.
+5.5.2. Upon the expiry of the Evaluation License Term, Customer must either discontinue use of the relevant Licensed Software or acquire a commercial Development License.
 
 6. THIRD-PARTY SOFTWARE. The Licensed Software may provide links or access to third party libraries or code (collectively "Third-Party Software") to implement various functions. Third-Party Software does not, however, comprise part of the Licensed Software, but is provided to Customer complimentary and use thereof is discretionary for Customer. Third-Party Software will be listed in the ".../src/3rdparty" source tree delivered with the Licensed Software or documented in the Licensed Software, as such may be amended from time to time. Customer acknowledges that use or distribution of Third-Party Software is in all respects subject to applicable license terms of applicable third-party right holders.
 
 7. PRE-RELEASE CODE
-7.1. The Licensed Software may contain pre-release code and functionality, or sample code marked or otherwise stated with appropriate designation such as "Technology Preview", "Alpha", "Beta", "Experimental", "Sample", "Example" etc. ("Pre-Release Code").
-7.2. Such Pre-Release Code may be provided complimentary for  Customer, in order to provide experimental support or information for new platforms or preliminary versions of one or more new functionalities, or for other similar reasons. Pre-Release Code may not be at the level of performance and compatibility of a final, generally available, product offering.  Pre-Release Code may not operate correctly, may contain errors and may be substantially modified by The Qt Company prior to a commercial product release, if any. The Qt Company is under no obligation to make Pre-Release Code commercially available, or provide any Support or Updates relating thereto. To the maximum extent permitted by law, the Qt Company assumes no liability whatsoever regarding any Pre-Release Code and any use thereof is exclusively at Customer's own risk and expense.
-7.3.  Unless Licensed Software specifies different license terms for the respective Pre-Release Code, Customer is entitled to use such pre-release code pursuant to Section 5 of this Appendix, just like other Licensed Software.
+7.1. The Licensed Software may contain pre-release code and functionality, or sample code marked or otherwise stated with appropriate designation such as “Technology Preview”, “Alpha”, “Beta”, “Experimental”, “Sample”, “Example” etc. (“Pre-Release Code”).
+7.2. Such Pre-Release Code may be provided complimentary for Customer (e.g., to provide experimental support or information for new platforms or preliminary versions of one or more new functionalities). Pre-Release Code may not be at the level of performance and compatibility of a final, generally available, product offering. Pre-Release Code may not operate correctly, may contain errors and may be substantially modified by The Qt Company prior to a commercial product release, if any. The Qt Company is under no obligation to make Pre-Release Code commercially available or provide any Support or Updates relating thereto. To the maximum extent permitted by law, the Qt assumes no liability whatsoever regarding any Pre-Release Code and any use thereof is exclusively at Customer’s own risk and expense.
+7.3. Unless Licensed Software specifies different license terms for the respective Pre-Release Code, Customer is entitled to use such Pre-Release Code pursuant to Section 5 of this Appendix.
 
 8. SUPPORT. Support is provided according to agreed support level and subject to applicable requirements and restrictions, as specified in the Appendix for Support Terms.
 
 9. FEES AND ORDERING: DISTRIBUTION LICENSES
-9.1. Distribution License Packs
-9.1.1. Unless otherwise agreed in writing, Distribution Licenses shall be purchased by way of Distribution License Packs.
-9.1.2. Upon due payment of the ordered Distribution License Pack(s), Customer will have an account of Distribution Licenses available for distributing the Redistributables in accordance with this Agreement.
-9.2. Each time Customer distributes a copy of Redistributables, one Distribution License is used and Customer's account of available Distribution Licenses is decreased accordingly.
-9.3. Customer may distribute copies of the Redistributables so long as Customer has Distribution Licenses remaining on its account.
+9.1. Unless otherwise agreed in writing, Distribution Licenses shall be purchased by way of Distribution License Packs. Further Distribution License parameters may be set forth in the applicable Pricing Appendix.
+9.2. Upon due payment of the ordered Distribution Licenses, Customer will have an account of Distribution Licenses available for distributing Devices during the validity period of the respective Distribution Licenses in accordance with this Agreement.
+9.3. Each time Customer distributes a Device, one Distribution License is used and Customer’s account of available Distribution Licenses is decreased accordingly.
 
 10. RECORD-KEEPING AND REPORTING OBLIGATIONS; AUDIT RIGHTS
-10.1. Customer's Record-keeping
-10.1.1. Customer shall at all times during the term of the Agreement or validity of any of the licenses hereunder, whichever is later, and for a period of two (2) years thereafter, maintain Customer's Records in an accurate and up-to-date form. Customer's Records shall be adequate to reasonably enable The Qt Company to determine Customer's compliance with the provisions of the Agreement. The records shall conform to general good accounting practices.
-10.1.2. Customer shall, within thirty (30) days from receiving The Qt Company's request to that effect, deliver to The Qt Company a report based on Customer's Records, such report to contain information, in sufficient detail, on: (i) number and identity of users working with Licensed Software or Qt Community Edition, (ii) copies of Redistributables distributed by Customer during the most recent calendar quarter and/or any other term specified by The Qt Company, and (iii) any other information pertaining to Customer's compliance with the terms of the Agreement (e.g. information on products and/or projects relating to use of Distribution Licenses), as The Qt Company may reasonably require from time to time.
-10.2. The Qt Company's Audit Rights
-10.2.1. The Qt Company or an independent auditor acting on behalf of The Qt Company may, upon at least thirty (30) days' prior written notice and at The Qt Company expense, audit Customer with respect to Customer's use of the Licensed Software, but not more frequently than once during each six (6) month period. Such audit may be conducted by mail, electronic means or through an in-person visit to Customer's place of business. Any possible in-person audit shall be conducted during regular business hours at Customer's facilities, shall not unreasonably interfere with Customer's business activities and shall be limited in scope to verify Customer's compliance with the terms of the Agreement. The Qt Company or its independent auditor shall be entitled to inspect Customer's Records and conduct necessary interviews of Customer's relevant employees and Contractors. All Customer's Records and use thereof shall be subject to the obligation of confidentiality under the Agreement.
-10.2.2. If an audit reveals that Customer is using the Licensed Software beyond scope of the licenses Customer has paid for, Customer shall pay to The Qt Company any amounts owed for such unauthorized use within thirty (30) days from receipt of the corresponding invoice from The Qt Company.
-10.2.3. In addition, in the event the audit reveals a material violation of the terms of the Agreement (without limitation, either (i) underpayment of more than 10% of License Fees or 10,000 euros (whichever is more) or (ii) distribution of products, which include or result from Prohibited Combination, shall be deemed a material violation for purposes of this section), then Customer shall pay The Qt Company's reasonable cost of conducting such audit.
+10.1. Customer’s Record-keeping
+10.1.1. Customer shall at all times during the term of the Agreement or validity of any of the licenses hereunder, whichever is later, and for a period of two (2) years thereafter, maintain Customer’s Records in an accurate and up-to-date form. Customer’s Records shall be adequate to reasonably enable The Qt Company to determine Customer’s compliance with the provisions of the Agreement. The records shall conform to general good accounting practices.
+10.1.2. Customer shall, within thirty (30) days from receiving The Qt Company’s request to that effect, deliver to The Qt Company a report based on Customer’s Records, such report to contain information, in sufficient detail, on: (i) number and identity of users working with Licensed Software or Qt Community Edition, (ii) Devices distributed by Customer during the most recent calendar quarter and/or any other term specified by The Qt Company, and (iii) any other information pertaining to Customer’s compliance with the terms of the Agreement (e.g. information on products and/or projects relating to use of Licensed Software), as The Qt Company may reasonably require from time to time.
+10.2. The Qt Company’s Audit Rights
+10.2.1. The Qt Company or an independent auditor acting on behalf of The Qt Company may, upon at least thirty (30) days’ prior written notice and at The Qt Company expense, audit Customer with respect to Customer’s use of the Licensed Software, but not more frequently than once during each six (6) month period. Such audit may be conducted by mail, electronic means or through an in-person visit to Customer’s place of business. Any possible in-person audit shall be conducted during regular business hours at Customer's facilities, shall not unreasonably interfere with Customer's business activities and shall be limited in scope to verify Customer’s compliance with the terms of the Agreement. The Qt Company or its independent auditor shall be entitled to inspect Customer’s Records and conduct necessary interviews of Customer’s relevant employees and Contractors. All Customer’s Records and use thereof shall be subject to the obligation of confidentiality under the Agreement.
+10.2.2. If an audit reveals that Customer is using the Licensed Software beyond the scope of the licenses Customer has paid for, Customer shall pay to The Qt Company any amounts owed for such unauthorized use within thirty (30) days from receipt of the corresponding invoice from The Qt Company.
+10.2.3. In addition, in the event the audit reveals a material violation of the terms of the Agreement (without limitation, either (i) underpayment of more than 10% of License Fees or 10,000 Euros (whichever is more) or (ii) distribution of products, which include or result from Prohibited Combination, shall be deemed a material violation for purposes of this section), then Customer shall pay The Qt Company's reasonable cost of conducting such audit.
 
 11. TERMINATION
 11.1. Termination of Licenses
-11.1.1. The Qt Company may terminate Customer's rights to any and all Licensed Software (including access to Support), if Customer:
-(i) commits a material breach of the Agreement (including this Appendix) and has not remedied the breach within a reasonable period of time (which shall be no less than 30 days) of The Qt Company's written notice specifying the breach, or
+11.1.1. The Qt Company may terminate Customer’s rights to any and all Licensed Software (including access to Support), if Customer:
+(i) commits a material breach of the Agreement (including this Appendix) and has not remedied the breach within a reasonable period of time (which shall be no less than thirty (30) days) of The Qt Company’s written notice specifying the breach, or
 (ii) becomes bankrupt, insolvent or goes into liquidation or debt restructuring.
-11.2. Suspension of rights: Instead of termination, The Qt Company reserves the right to suspend or withhold grants of any and all rights to the Licensed Software (including Support), should Customer fail to make payment in timely fashion or otherwise violate or is reasonably suspected of violating its obligations under the Agreement and/or this Appendix, and where such violation or breach is not cured within ten (10) business days following The Qt Company's written notice thereof.
-11.3. Parties  Rights and Duties upon Termination
-11.3.1. Upon expiry or termination of the Development Licenses, Customer shall cease and shall cause all Designated Users (including those of its Affiliates' and Contractors') to cease using the relevant Licensed Software.
-11.3.2. Upon such expiry or termination of Development Licenses, Customer shall destroy or return to The Qt Company all copies of the respective Licensed Software and all related materials and will certify the same by Customer's duly authorized officer to The Qt Company upon its request, provided however that Customer may retain and utilize such copies of the Licensed Software to the extent required to provide Customer's continued support to End Customers,  for archiving purposes or as is required under applicable law.
-11.3.3. Distribution Licenses are perpetual and, therefore, Customer's distribution rights hereunder shall only terminate upon The Qt Company's termination of Distribution Licenses due to Customer's material breach as set forth in Section 11.1.1(i) of this Appendix. In case of such termination by The Qt Company due to Customer's material breach, Customer must cease any distribution of Applications and Devices at the effective date of termination.
-11.3.4. Expiry or termination of any of Customer's licenses hereunder for any reason whatsoever shall not:
-(i) relieve Customer of its obligation to pay any License Fees accrued or payable to The Qt Company prior to the effective date of termination, and Customer pay to The Qt Company all such fees within 30 days from the effective date of termination of the licenses;
-(ii) relieve Customer of its obligation to ensure that Applications and Devices (including those already distributed) remain in compliance with the terms of the Agreement; nor
-(iii) affect any rights of End Customer to continue use of Applications and Devices (and therein incorporated Redistributables).
-11.4. Extension of Rights under Special Circumstances. In the event that, during the applicable License Term, The Qt Company is declared bankrupt under a final, non-cancellable decision by relevant court of law, and the Agreement is not, at the date of expiry of the Development License(s), assigned to a party who has assumed The Qt Company's position as a legitimate licensor of Licensed Software under the Agreement, then all valid Development Licenses possessed by Customer at such date of expiry, and which Customer has not notified for expiry, shall be extended to be valid in perpetuity under the terms of the Agreement. Any such extension shall not apply to The Qt Company's Support obligations.
+11.1.2. Suspension of rights: Instead of termination, The Qt Company reserves the right to suspend or withhold grants of any and all rights to the Licensed Software (including Support), should Customer fail to make payment in timely fashion or otherwise violate or is reasonably suspected of violating its obligations under the Agreement and/or this Appendix, and where such violation or breach is not cured within ten (10) business days following The Qt Company’s written notice thereof.
+11.2. Parties´ Rights and Duties upon Termination
+11.2.1. Upon expiry or termination of the Development Licenses, Customer shall cease and shall cause all Designated Users (including those of its Affiliates’ and Contractors’) to cease using the relevant Licensed Software.
+11.2.2. Upon such expiry or termination of Development Licenses, Customer shall destroy or return to The Qt Company all copies of the respective Licensed Software and all related materials and will certify the same by Customer’s duly authorized officer to The Qt Company upon its request, provided however that Customer may retain and utilize such copies of the Licensed Software to the extent required to provide Customer’s continued support to End Customers, for archiving purposes or as is required under applicable law.
+11.2.3. Upon expiry of Distribution Licenses, Customer shall cease (including via its Affiliates and Contractors) distribution of Devices.
+11.2.4. If Customer’s distribution rights for Applications and Devices hereunder are terminated by The Qt Company due to Customer’s material breach, then Customer must cease any distribution of Applications and Devices as of the effective date of termination.
+11.2.5. Expiry or termination of any of Customer’s licenses hereunder for any reason whatsoever shall not:
+(i) relieve Customer of its obligation to pay any License Fees accrued or payable to The Qt Company prior to the effective date of termination, and Customer shall pay to The Qt Company all such fees within thirty (30) days from the effective date of termination of the licenses;
+(ii) relieve Customer of its obligation to ensure that Customer’s actions or inactions do not cause Applications and Devices (including those already distributed) to fall out of compliance with the terms of the Agreement; nor
+(iii) affect any rights of End Customer to continue use of Applications and Devices (and therein incorporated Redistributables) received by the End Customer before the date of such expiry or termination of Customer’s rights.
+11.3. Extension of Rights under Special Circumstances. In the event that, during the applicable License Term, The Qt Company is declared bankrupt under a final, non-cancellable decision by relevant court of law, and the Agreement is not, at the date of expiry of the Development License(s), assigned to a party who has assumed The Qt Company’s position as a legitimate licensor of Licensed Software under the Agreement, then all valid Development Licenses possessed by Customer at such date of expiry, and which Customer has not notified for expiry, shall be extended to be valid in perpetuity under the terms of the Agreement. Any such extension shall not apply to The Qt Company’s Support obligations.
 
 EXHIBIT 1, Licensed Software
-At the time of conclusion of this Appendix, the latest available version of Licensed Software includes the software libraries and tools set forth in Exhibit 1 (as provided below), depending on which product(s) Customer has purchased under the relevant Purchase Document.
-The modules and tools are specific to each product version respectively and may vary from version to version. Modules and tools included in the latest publicly available version of the respective product at any given time are listed in Exhibit 1 of  https://www.qt.io/terms-conditions/qt-dev-framework/exhibit-1. If a new version of Licensed Software does not include a module or tool present in an older version which Customer is entitled to use under a valid license from The Qt Company, then Customer will continue to have such right during the validity of Customer's license to relevant Licensed Software.  In the event a new version of the Licensed Software adds modules or tools to any previous version(s), Customer's rights will extend to cover also such additional modules and tools.
 
-EXHIBIT 2 - Small Business Terms
-1. This Exhibit applies to entities that qualify as a Qualified Small Business (defined below) and provides additional terms and conditions applicable to small business pricing and licensing. In the event that Customer is a Qualified Small Business and there is any conflict between the terms of this Exhibit and any other terms of the Agreement, the terms in this Exhibit shall take precedence.
-
-2. APPLICABILITY FOR SMALL BUSINESS LICENSES. Any small business discounts applied require that Customer (including any Customer Affiliates or group entities) has an annual revenue (including annual capital funding) below 1 Million EUR, or the equivalent thereof, as approved by The Qt Company (each, a "Qualified Small Business"). The annual revenue, including funding, must be evidenced upon request by business records and approved by The Qt Company in its reasonable discretion.
+The modules and tools are specific to each product version respectively and may vary from version to version. Modules and tools included in the latest publicly available version of the respective product at any given time are listed in Exhibit 1 of the latest version of the Qt Frame Agreement available at https://www.qt.io/terms-conditions/qt-dev-framework/exhibit-1. If a new version of Licensed Software does not include a module or tool present in an older version which Customer is entitled to use under a valid license from The Qt Company, then Customer will continue to have such right during the validity of Customer’s license to relevant Licensed Software. In the event a new version of the Licensed Software adds modules or tools to any previous version(s), Customer’s rights will extend to cover also such additional modules and tools.
 
-3. SUPPORT. Support is limited to: (i) Install Support; and (ii) for any other Standard Support issue, five (5) support tickets annually.
+Licensed Software: Developer modules and tools
+The modules and/or tools that are included in the latest publicly available version of the respective product at the effective date of this Appendix, Qt for Application Development Professional (ADP), Qt for Application Development Enterprise (ADE), Qt for Device Creation Professional (DCP), Qt for Device Creation Enterprise (DCE), - are marked with ‘X’ in the below table. Parts of the product that are permitted for distribution in object-code form only (“Redistributables”) are marked with ‘R’ in the below table.
++-----------------------------------------------------------------------------+
+|   Modules / Tools                   |   ADP   |   ADE   |   DCP   |   DCE   |
++-----------------------------------------------------------------------------+
+|Active Qt                            |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt 3D                                |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt5 Core Compatibility APIs          |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Android Extras                    |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Bluetooth                         |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Canvas 3D                         |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Charts                            |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Concurrent                        |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Core                              |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Data Visualization                |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt D-Bus                             |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt for Python                        |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt for WebAssembly                   |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Gamepad                           |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Graphical Effects                 |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt GUI                               |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Help                              |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Image Formats                     |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Location                          |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Lottie Animation                  |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Mac Extras                        |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Multimedia                        |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Multimedia Widgets                |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Network                           |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Network Authorization             |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt NFC                               |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt OpenGL                            |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt PDF                               |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Platform Headers                  |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Positioning                       |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Print Support                     |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Purchasing                        |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt QML                               |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Quick                             |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Quick 3D                          |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Quick Controls 1                  |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Quick Controls                    |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Quick Dialogs                     |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Quick Extras                      |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Quick Layouts                     |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Quick Test                        |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Quick Timeline                    |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Quick WebGL                       |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Quick Widgets                     |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Remote Objects                    |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Script                            |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Script Tools                      |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt SCXML                             |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Sensors                           |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Serial Bus                        |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Serial Port                       |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Shader Tools                      |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Speech                            |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt State Machine                     |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt SQL                               |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt SVG                               |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Test                              |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt UI Tools                          |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Virtual Keyboard                  |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Wayland Compositor                |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt WebChannel                        |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt WebEngine                         |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt WebSockets                        |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt WebView                           |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Widgets                           |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Windows Extras                    |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt X11 Extras                        |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt XML                               |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt XML Patterns                      |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Designer (Qt Widget Designer)     |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Linguist                          |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Assistant                         |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|lupdate                              |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|lrelease                             |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|lrelease                             |   X,R   |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt MQTT                              |         |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt KNX                               |         |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt OPC UA                            |         |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt CoAP                              |         |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Insight Tracker                   |         |   X,R   |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Boot 2 Qt stacks                     |         |         |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt OTA                               |         |         |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Device Utilities                     |         |         |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Debugging Bridge (QDB) Daemon     |         |         |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Quick Ultralite Controls          |         |         |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Quick Ultralite                   |         |         |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Safe Renderer (QSR)               |         |         |   X,R   |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Application Manager               |         |         |         |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Interface Framework               |         |         |         |   X,R   |
++-----------------------------------------------------------------------------+
+|Neptune Reference UI                 |         |         |         |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt for Android Automotive OS(QAA)    |         |         |         |   X,R   |
++-----------------------------------------------------------------------------+
+|Qt Creator                           |    X    |    X    |    X    |    X    |
++-----------------------------------------------------------------------------+
+|Qt Design Studio (Professional)      |    X    |    X    |    X    |    X    |
++-----------------------------------------------------------------------------+
+|androiddeployqt                      |    X    |    X    |    X    |    X    |
++-----------------------------------------------------------------------------+
+|androidtestrunner                    |    X    |    X    |    X    |    X    |
++-----------------------------------------------------------------------------+
+|canbusutil                           |    X    |    X    |    X    |    X    |
++-----------------------------------------------------------------------------+
+|dumpcpp                              |    X    |    X    |    X    |    X    |
++-----------------------------------------------------------------------------+
+|dumpdoc                              |    X    |    X    |    X    |    X    |
++-----------------------------------------------------------------------------+
+|fixqt4headers.pl                     |    X    |    X    |    X    |    X    |
++-----------------------------------------------------------------------------+
+|idc                                  |    X    |    X    |    X    |    X    |
++-----------------------------------------------------------------------------+
+|moc                                  |    X    |    X    |    X    |    X    |
++-----------------------------------------------------------------------------+
+|pixeltool                            |    X    |    X    |    X    |    X    |
++-----------------------------------------------------------------------------+
+|qdbus                                |    X    |    X    |    X    |    X    |
++-----------------------------------------------------------------------------+
+|qdbuscpp2xml                         |    X    |    X    |    X    |    X    |
++-----------------------------------------------------------------------------+
+|qdbusviewer                          |    X    |    X    |    X    |    X    |
++-----------------------------------------------------------------------------+
+|qdbusxml2cpp                         |    X    |    X    |    X    |    X    |
++-----------------------------------------------------------------------------+
+|qdistancefieldgenerator              |    X    |    X    |    X    |    X    |
++-----------------------------------------------------------------------------+
+|qdoc                                 |    X    |    X    |    X    |    X    |
++-----------------------------------------------------------------------------+
+|qhelpgenerator                       |    X    |    X    |    X    |    X    |
++-----------------------------------------------------------------------------+
+|qlalr                                |    X    |    X    |    X    |    X    |
++-----------------------------------------------------------------------------+
+|qmake                                |    X    |    X    |    X    |    X    |
++-----------------------------------------------------------------------------+
+|qml                                  |    X    |    X    |    X    |    X    |
++-----------------------------------------------------------------------------+
+|qmlcachegen                          |    X    |    X    |    X    |    X    |
++-----------------------------------------------------------------------------+
+|qmldom                               |    X    |    X    |    X    |    X    |
++-----------------------------------------------------------------------------+
+|qmleasing                            |    X    |    X    |    X    |    X    |
++-----------------------------------------------------------------------------+
+|qmlformat                            |    X    |    X    |    X    |    X    |
++-----------------------------------------------------------------------------+
+|qmllint                              |    X    |    X    |    X    |    X    |
++-----------------------------------------------------------------------------+
+|qmlpreview                           |    X    |    X    |    X    |    X    |
++-----------------------------------------------------------------------------+
+|qmlprofiler                          |    X    |    X    |    X    |    X    |
++-----------------------------------------------------------------------------+
+|qmlscene                             |    X    |    X    |    X    |    X    |
++-----------------------------------------------------------------------------+
+|qmltestrunner                        |    X    |    X    |    X    |    X    |
++-----------------------------------------------------------------------------+
+|qmltime                              |    X    |    X    |    X    |    X    |
++-----------------------------------------------------------------------------+
+|qmlviewer                            |    X    |    X    |    X    |    X    |
++-----------------------------------------------------------------------------+
+|qtdiag                               |    X    |    X    |    X    |    X    |
++-----------------------------------------------------------------------------+
+|qtpaths                              |    X    |    X    |    X    |    X    |
++-----------------------------------------------------------------------------+
+|qtplugininfo                         |    X    |    X    |    X    |    X    |
++-----------------------------------------------------------------------------+
+|qvkgen                               |    X    |    X    |    X    |    X    |
++-----------------------------------------------------------------------------+
+|rcc                                  |    X    |    X    |    X    |    X    |
++-----------------------------------------------------------------------------+
+|tracegen                             |    X    |    X    |    X    |    X    |
++-----------------------------------------------------------------------------+
+|uic                                  |    X    |    X    |    X    |    X    |
++-----------------------------------------------------------------------------+
+|windeployqt                          |    X    |    X    |    X    |    X    |
++-----------------------------------------------------------------------------+
+|Target toolchains                    |         |         |    X    |    X    |
++-----------------------------------------------------------------------------+
+|Qt Debugging Bridge (QDB) Host Tools |         |         |    X    |    X    |
++-----------------------------------------------------------------------------+
+|qtconfig-gui                         |         |         |    X    |    X    |
++-----------------------------------------------------------------------------+
+|Qt Emulator                          |         |         |    X    |    X    |
++-----------------------------------------------------------------------------+
+|Qt Creator VxWorks plugin            |         |         |    X    |    X    |
++-----------------------------------------------------------------------------+
+|qulrcc                               |         |         |    X    |    X    |
++-----------------------------------------------------------------------------+
+|qmlinterfacegenerator                |         |         |    X    |    X    |
++-----------------------------------------------------------------------------+
+|qmltocpp                             |         |         |    X    |    X    |
++-----------------------------------------------------------------------------+
+|qulfontcompiler                      |         |         |    X    |    X    |
++-----------------------------------------------------------------------------+
+|qmlprojectexporter                   |         |         |    X    |    X    |
++-----------------------------------------------------------------------------+
+|Qt Deployment Server                 |         |         |    X    |    X    |
++-----------------------------------------------------------------------------+
+|Qt Creator plugin for                |         |         |         |         |
+|Qt Application Manager               |         |         |    X    |    X    |
++-----------------------------------------------------------------------------+
+
+Rights for Application and Device use cases
+Following table summarizes the rights afforded by different products of the Licensed Software to create and distribute Applications and Devices as defined in this Appendix (X marks for rights):
++-----------------------------------------------------------------------------+
+|                                     |   Applications    |      Devices      |
++-----------------------------------------------------------------------------+
+|ADP                                  |         X         |                   |
++-----------------------------------------------------------------------------+
+|ADE                                  |         X         |                   |
++-----------------------------------------------------------------------------+
+|DCP                                  |         X         |         X         |
++-----------------------------------------------------------------------------+
+|DCE                                  |         X         |         X         |
++-----------------------------------------------------------------------------+
+
+Redistributables and Tools - Data collection
+Customer is responsible for Customer’s use of Licensed Software, including the developer modules and tools. Any use of modules and tools by Customer to track, access, process, or otherwise handle data (including telemetry data) is the responsibility of Customer and must be done in compliance with applicable laws. If Customer uses the Licensed Software to perform any operation or set of operations on personal data, The Qt Company has no access or visibility into such operations by Customer. The Qt Company in no way acts as a data processor to Customer.
+
+Licensed Software: Designer tools and modules
+The modules and/or tools that are included in the respective product Qt for Design Studio Professional (DSP), Qt for Design Studio Enterprise (DSE) - are marked with X in the below table.
++-----------------------------------------------------------------------------+
+|                                     |        DSP        |        DSE        |
++-----------------------------------------------------------------------------+
+|Qt Design Studio                     |         X         |         X         |
++-----------------------------------------------------------------------------+
+|Qt Design Bridges                    |                   |         X         |
++-----------------------------------------------------------------------------+
+|QML Live on host                     |         X         |         X         |
++-----------------------------------------------------------------------------+
+|QML Live on target                   |                   |         X         |
++-----------------------------------------------------------------------------+
+|Variant Management                   |                   |         X         |
++-----------------------------------------------------------------------------+
+|Shader creation tools                |                   |         X         |
++-----------------------------------------------------------------------------+
+|Profiling tools                      |                   |         X         |
++-----------------------------------------------------------------------------+
+|Simulink support                     |                   |         X         |
++-----------------------------------------------------------------------------+
+Designer tools include no Redistributables. Both DSP and DSE can be used to create an user interface for use cases covered by ADP, ADE, DCP and DCE.
 
-4. LIMITATION ON NUMBER OF SMALL BUSINESS DEVELOPER LICENSES. Qualified Small Business discounts and purchasing structure may be applied to a maximum of  three discounted developer licenses (either ADE or DCP) per Qualified Small Business. Any additional licenses purchased will be at The Qt Company list price in effect at the time.
+EXHIBIT 2 – Small Business Terms
 
+1. This Exhibit applies to entities that qualify as a Qualified Small Business (defined below) and provides additional terms and conditions applicable to small business pricing and licensing. In the event that Customer is a Qualified Small Business and there is any conflict between the terms of this Exhibit and any other terms of the Agreement, the terms in this Exhibit shall take precedence.
+2. APPLICABILITY FOR SMALL BUSINESS LICENSES. Any small business discounts applied require that Customer (including any Customer Affiliates or group entities) has an annual revenue (including annual capital funding) below 1 Million EUR, or the equivalent thereof, as approved by The Qt Company (each, a “Qualified Small Business”). The annual revenue, including funding, must be evidenced upon request by business records and approved by The Qt Company in its reasonable discretion.
+3. SUPPORT. Support is limited to: (i) Install Support; and (ii) for any other Standard Support issue, five (5) support tickets annually.
+4. LIMITATION ON NUMBER OF SMALL BUSINESS DEVELOPER LICENSES. Qualified Small Business discounts and purchasing structure may be applied to a maximum of three discounted developer licenses (either ADE or DCP) per Qualified Small Business. Any additional licenses purchased will be at The Qt Company list price in effect at the time.
 5. LIMITATION FOR NUMBER OF INSTALLATIONS. Customer may install copies of the Licensed Software on two (2) computers per Designated User, provided that only the Designated Users who have a valid Development License may use the Licensed Software.
-
-6. CONDITIONAL WAIVER OF DISTRIBUTION LICENSES. For Qualified Small Businesses, the Agreement requirements to purchase Distribution Licenses for Devices shall apply only when Customer ceases to be a Qualified Small Business (e.g., when annual revenue threshholds  are bypassed).
-
-7. ADDITIONAL TERMS FOR RENEWALS. The initial subscription purchase term for Qualified Small Business Licenses is twelve (12) months. Upon expiration of the initial twelve (12) month term and unless terminated in accordance with the Agreement, the Licenses will automatically renew for additional twelve (12) month terms with applicable Qualified Small Business discounts. If Customer ceases to be a Qualified Small Business, renewal pricing shall be at The Qt Company list price in effect at the time of renewal, or as agreed in writing between the parties.
-
+6. CONDITIONAL WAIVER OF DISTRIBUTION LICENSES. For Qualified Small Businesses, the Agreement requirements to purchase Distribution Licenses for Devices shall apply only when Customer ceases to be a Qualified Small Business (e.g., when annual revenue thresholds are bypassed).
+7. ADDITIONAL TERMS FOR RENEWALS. The initial subscription purchase term for Qualified Small Business Licenses is twelve (12) months. Upon expiration of the initial twelve (12) month term, Customer’s Qualified Small Business Licenses may be renewed with applicable Qualified Small Business pricing so long as Customer remains a Qualified Small Business and accepts The Qt Company’s terms and conditions at the time of renewal. If Customer ceases to be a Qualified Small Business, renewal pricing shall be at The Qt Company list price in effect at the time of renewal, or as agreed in writing between the parties.
 8. ADDITIONAL AUDIT RIGHTS. In addition to the audit rights set forth in the Agreement, The Qt Company reserves the right to audit Customer financial records in order to determine whether Customer is a Qualified Small Business.
diff -pruN 6.8.2-4/.cmake.conf 6.9.1-1/.cmake.conf
--- 6.8.2-4/.cmake.conf	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/.cmake.conf	2025-05-29 02:19:47.000000000 +0000
@@ -1,4 +1,4 @@
-set(QT_REPO_MODULE_VERSION "6.8.2")
+set(QT_REPO_MODULE_VERSION "6.9.1")
 set(QT_REPO_MODULE_PRERELEASE_VERSION_SEGMENT "alpha1")
 set(QT_EXTRA_INTERNAL_TARGET_DEFINES "QT_NO_AS_CONST=1")
 list(APPEND QT_EXTRA_INTERNAL_TARGET_DEFINES "QT_NO_FOREACH=1")
diff -pruN 6.8.2-4/.gitreview 6.9.1-1/.gitreview
--- 6.8.2-4/.gitreview	1970-01-01 00:00:00.000000000 +0000
+++ 6.9.1-1/.gitreview	2025-05-29 02:19:47.000000000 +0000
@@ -0,0 +1,4 @@
+[gerrit]
+host=codereview.qt-project.org
+project=qt/qtgraphs
+defaultbranch=dev
diff -pruN 6.8.2-4/.tag 6.9.1-1/.tag
--- 6.8.2-4/.tag	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/.tag	2025-05-29 02:19:47.000000000 +0000
@@ -1 +1 @@
-ae3dc40d745b63ec9e5f53719c4287c3cbff194b
+0e849b494cbe8128ecec6d7079bd9d0171ae56c0
diff -pruN 6.8.2-4/REUSE.toml 6.9.1-1/REUSE.toml
--- 6.8.2-4/REUSE.toml	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/REUSE.toml	2025-05-29 02:19:47.000000000 +0000
@@ -19,28 +19,29 @@ SPDX-FileCopyrightText = "Copyright (C)
 SPDX-License-Identifier = "LicenseRef-Qt-Commercial OR GPL-3.0-only"
 
 [[annotations]]
-path = ["**.pro", "**.qrc", ".cmake.conf", "**.yaml", "**.json", "**.pri", "sync.profile"]
+path = ["**.pro", "**.qrc", ".cmake.conf", "**.yaml", "**.pri", "sync.profile",
+        "**ci_config_linux.json", "**CMakeLists.txt", ".tag"]
 precedence = "closest"
 comment = "build system"
 SPDX-FileCopyrightText = "Copyright (C) 2024 The Qt Company Ltd."
 SPDX-License-Identifier = "BSD-3-Clause"
 
 [[annotations]]
-path = [".tag", "**/.gitattributes", "**.gitignore"]
+path = ["**/.gitattributes", "**.gitignore", "**.gitreview"]
 precedence = "closest"
 comment = "version control system. Licensed as build system"
 SPDX-FileCopyrightText = "Copyright (C) 2024 The Qt Company Ltd."
-SPDX-License-Identifier = "BSD-3-Clause"
+SPDX-License-Identifier = "LicenseRef-Qt-Commercial OR BSD-3-Clause"
 
 [[annotations]]
-path = ["**/doc/images/**", "examples/**"]
+path = ["examples/**"]
 comment = "this must be after the build system table because example and snippets take precedence over build system"
 precedence = "closest"
 SPDX-FileCopyrightText = "Copyright (C) 2024 The Qt Company Ltd."
 SPDX-License-Identifier = "LicenseRef-Qt-Commercial OR BSD-3-Clause"
 
 [[annotations]]
-path = ["**.qdocconf", "**.metainfo"]
+path = ["**/doc/images/**", "**.qdocconf", "**.metainfo"]
 comment = "documentation"
 precedence = "closest"
 SPDX-FileCopyrightText = "Copyright (C) 2024 The Qt Company Ltd."
@@ -50,7 +51,7 @@ SPDX-License-Identifier = "LicenseRef-Qt
 path = ["**.toml", "licenseRule.json"]
 precedence = "override"
 SPDX-FileCopyrightText = "Copyright (C) 2024 The Qt Company Ltd."
-SPDX-License-Identifier = "LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only"
+SPDX-License-Identifier = "LicenseRef-Qt-Commercial OR BSD-3-Clause"
 
 [[annotations]]
 path = ["**/qt_attribution.json"]
diff -pruN 6.8.2-4/coin/module_config.yaml 6.9.1-1/coin/module_config.yaml
--- 6.8.2-4/coin/module_config.yaml	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/coin/module_config.yaml	2025-05-29 02:19:47.000000000 +0000
@@ -6,6 +6,9 @@ accept_configuration:
 
 instructions:
   Build:
+    - type: EnvironmentVariable
+      variableName: VERIFY_SOURCE_SBOM
+      variableValue: "ON"
     - !include "{{qt/qtbase}}/coin_module_build_template_v2.yaml"
 
   Test:
diff -pruN 6.8.2-4/debian/changelog 6.9.1-1/debian/changelog
--- 6.8.2-4/debian/changelog	2025-03-01 11:36:32.000000000 +0000
+++ 6.9.1-1/debian/changelog	2025-08-01 11:15:27.000000000 +0000
@@ -1,3 +1,14 @@
+qt6-graphs (6.9.1-1) experimental; urgency=medium
+
+  [ Patrick Franz ]
+  * New upstream release (6.9.1).
+  * Bump Qt B-Ds to 6.9.1.
+  * Update list of installed files.
+  * Update symbols from buildlogs.
+  * Bump Standards-Version to 4.7.2 (no changes needed).
+
+ -- Patrick Franz <deltaone@debian.org>  Fri, 01 Aug 2025 13:15:27 +0200
+
 qt6-graphs (6.8.2-4) unstable; urgency=medium
 
   * Upload to unstable.
diff -pruN 6.8.2-4/debian/control 6.9.1-1/debian/control
--- 6.8.2-4/debian/control	2025-03-01 11:36:24.000000000 +0000
+++ 6.9.1-1/debian/control	2025-08-01 11:15:10.000000000 +0000
@@ -3,22 +3,23 @@ Section: libs
 Priority: optional
 Maintainer: Debian Qt/KDE Maintainers <debian-qt-kde@lists.debian.org>
 Uploaders: Patrick Franz <deltaone@debian.org>,
-Build-Depends: cmake (>= 3.24~),
-               debhelper-compat (= 13),
+Build-Depends: debhelper-compat (= 13),
                dh-sequence-qmldeps,
+               ccache,
+               cmake (>= 3.24~),
                libcups2-dev,
                ninja-build,
                pkg-kde-tools,
                pkgconf,
-               qt6-base-dev (>= 6.8.2+dfsg~),
-               qt6-base-private-dev (>= 6.8.2+dfsg~),
-               qt6-declarative-dev (>= 6.8.2+dfsg~),
-               qt6-declarative-private-dev (>= 6.8.2+dfsg~),
-               qt6-quick3d-dev (>= 6.8.2~),
-               qt6-quick3d-private-dev (>= 6.8.2~),
-Build-Depends-Indep: qt6-base-dev (>= 6.8~) <!nodoc>,
-                     qt6-documentation-tools (>= 6.8~) <!nodoc>,
-Standards-Version: 4.7.0
+               qt6-base-dev (>= 6.9.1+dfsg~),
+               qt6-base-private-dev (>= 6.9.1+dfsg~),
+               qt6-declarative-dev (>= 6.9.1+dfsg~),
+               qt6-declarative-private-dev (>= 6.9.1+dfsg~),
+               qt6-quick3d-dev (>= 6.9.1~),
+               qt6-quick3d-private-dev (>= 6.9.1~),
+Build-Depends-Indep: qt6-base-dev (>= 6.9~) <!nodoc>,
+                     qt6-documentation-tools (>= 6.9~) <!nodoc>,
+Standards-Version: 4.7.2
 Homepage: https://www.qt.io/developers/
 Vcs-Browser: https://salsa.debian.org/qt-kde-team/qt6/qt6-graphs
 Vcs-Git: https://salsa.debian.org/qt-kde-team/qt6/qt6-graphs.git
diff -pruN 6.8.2-4/debian/libqt6graphs6.symbols 6.9.1-1/debian/libqt6graphs6.symbols
--- 6.8.2-4/debian/libqt6graphs6.symbols	2025-03-01 11:36:24.000000000 +0000
+++ 6.9.1-1/debian/libqt6graphs6.symbols	2025-08-01 11:13:47.000000000 +0000
@@ -1,4 +1,4 @@
-# SymbolsHelper-Confirmed: 6.8.2 amd64 armel armhf i386
+# SymbolsHelper-Confirmed: 6.9.1 amd64
 libQt6Graphs.so.6 libqt6graphs6 #MINVER#
 * Build-Depends-Package: qt6-graphs-dev
  NonQt@NonQt 6.7.2
@@ -36,6 +36,7 @@ libQt6Graphs.so.6 libqt6graphs6 #MINVER#
  _ZN10QBarSeries11updatedBarsEv@Qt_6 6.8.2
  _ZN10QBarSeries12barsetsAddedERK5QListIP7QBarSetE@Qt_6 6.8.2
  _ZN10QBarSeries12countChangedEv@Qt_6 6.8.2
+ _ZN10QBarSeries13doubleClickedExP7QBarSet@Qt_6 6.9.1
  (subst)_ZN10QBarSeries13setValueAddedE{qptrdiff}{qptrdiff}P7QBarSet@Qt_6 6.8.2
  _ZN10QBarSeries14barSetsChangedEv@Qt_6 6.8.2
  _ZN10QBarSeries14barsetsRemovedERK5QListIP7QBarSetE@Qt_6 6.8.2
@@ -77,9 +78,12 @@ libQt6Graphs.so.6 libqt6graphs6 #MINVER#
  (subst)_ZN10QBarSeries6insertE{qptrdiff}P7QBarSet@Qt_6 6.8.2
  _ZN10QBarSeries6removeEP7QBarSet@Qt_6 6.8.2
  (subst)_ZN10QBarSeries6removeE{qptrdiff}@Qt_6 6.8.2
+ _ZN10QBarSeries7clickedExP7QBarSet@Qt_6 6.9.1
+ _ZN10QBarSeries7pressedExP7QBarSet@Qt_6 6.9.1
  _ZN10QBarSeries7replaceEP7QBarSetS1_@Qt_6 6.8.2
  _ZN10QBarSeries7replaceERK5QListIP7QBarSetE@Qt_6 6.8.2
  (subst)_ZN10QBarSeries7replaceE{qptrdiff}P7QBarSet@Qt_6 6.8.2
+ _ZN10QBarSeries8releasedExP7QBarSet@Qt_6 6.9.1
  _ZN10QBarSeries9selectAllEv@Qt_6 6.8.2
  _ZN10QBarSeriesC1EP7QObject@Qt_6 6.7.2
  _ZN10QBarSeriesC1ER17QBarSeriesPrivateP7QObject@Qt_6_PRIVATE_API 6.8.2
@@ -95,6 +99,7 @@ libQt6Graphs.so.6 libqt6graphs6 #MINVER#
  _ZN10QPieSeries11setEndAngleEd@Qt_6 6.8.2
  _ZN10QPieSeries11setHoleSizeEd@Qt_6 6.8.2
  _ZN10QPieSeries12countChangedEv@Qt_6 6.8.2
+ _ZN10QPieSeries13doubleClickedEP9QPieSlice@Qt_6 6.9.1
  _ZN10QPieSeries13setStartAngleEd@Qt_6 6.8.2
  _ZN10QPieSeries14pieSizeChangedEv@Qt_6 6.8.2
  (subst)_ZN10QPieSeries14removeMultipleE{qptrdiff}i@Qt_6 6.8.2
@@ -121,10 +126,13 @@ libQt6Graphs.so.6 libqt6graphs6 #MINVER#
  (subst)_ZN10QPieSeries6insertE{qptrdiff}P9QPieSlice@Qt_6 6.8.2
  _ZN10QPieSeries6removeEP9QPieSlice@Qt_6 6.8.2
  (subst)_ZN10QPieSeries6removeE{qptrdiff}@Qt_6 6.8.2
+ _ZN10QPieSeries7clickedEP9QPieSlice@Qt_6 6.9.1
+ _ZN10QPieSeries7pressedEP9QPieSlice@Qt_6 6.9.1
  _ZN10QPieSeries7removedERK5QListIP9QPieSliceE@Qt_6 6.8.2
  _ZN10QPieSeries7replaceEP9QPieSliceS1_@Qt_6 6.8.2
  _ZN10QPieSeries7replaceERK5QListIP9QPieSliceE@Qt_6 6.8.2
  (subst)_ZN10QPieSeries7replaceE{qptrdiff}P9QPieSlice@Qt_6 6.8.2
+ _ZN10QPieSeries8releasedEP9QPieSlice@Qt_6 6.9.1
  _ZN10QPieSeries8replacedERK5QListIP9QPieSliceE@Qt_6 6.8.2
  _ZN10QPieSeriesC1EP7QObject@Qt_6 6.8.2
  _ZN10QPieSeriesC1ER17QPieSeriesPrivateP7QObject@Qt_6_PRIVATE_API 6.8.2
@@ -136,8 +144,10 @@ libQt6Graphs.so.6 libqt6graphs6 #MINVER#
  _ZN10QPieSerieslsEP9QPieSlice@Qt_6 6.8.2
  _ZN10QValueAxis10maxChangedEd@Qt_6 6.7.2
  _ZN10QValueAxis10minChangedEd@Qt_6 6.7.2
+ _ZN10QValueAxis10panChangedEd@Qt_6 6.9.1
  _ZN10QValueAxis11qt_metacallEN11QMetaObject4CallEiPPv@Qt_6 6.7.2
  _ZN10QValueAxis11qt_metacastEPKc@Qt_6 6.7.2
+ _ZN10QValueAxis11zoomChangedEd@Qt_6 6.9.1
  _ZN10QValueAxis12rangeChangedEdd@Qt_6 6.7.2
  _ZN10QValueAxis13setTickAnchorEd@Qt_6 6.7.2
  _ZN10QValueAxis14setLabelFormatERK7QString@Qt_6 6.7.2
@@ -152,6 +162,8 @@ libQt6Graphs.so.6 libqt6graphs6 #MINVER#
  _ZN10QValueAxis20labelDecimalsChangedEi@Qt_6 6.7.2
  _ZN10QValueAxis6setMaxEd@Qt_6 6.7.2
  _ZN10QValueAxis6setMinEd@Qt_6 6.7.2
+ _ZN10QValueAxis6setPanEd@Qt_6 6.9.1
+ _ZN10QValueAxis7setZoomEd@Qt_6 6.9.1
  _ZN10QValueAxis8setRangeEdd@Qt_6 6.7.2
  _ZN10QValueAxisC1EP7QObject@Qt_6 6.7.2
  _ZN10QValueAxisC1ER17QValueAxisPrivateP7QObject@Qt_6_PRIVATE_API 6.7.2
@@ -165,6 +177,7 @@ libQt6Graphs.so.6 libqt6graphs6 #MINVER#
  _ZN11QAreaSeries11qt_metacastEPKc@Qt_6 6.8.2
  _ZN11QAreaSeries11setSelectedEb@Qt_6 6.8.2
  _ZN11QAreaSeries12colorChangedE6QColor@Qt_6 6.8.2
+ _ZN11QAreaSeries13doubleClickedE6QPoint@Qt_6 6.9.1
  _ZN11QAreaSeries14setBorderColorE6QColor@Qt_6 6.8.2
  _ZN11QAreaSeries14setBorderWidthEd@Qt_6 6.8.2
  _ZN11QAreaSeries14setLowerSeriesEP9QXYSeries@Qt_6 6.8.2
@@ -179,6 +192,9 @@ libQt6Graphs.so.6 libqt6graphs6 #MINVER#
  _ZN11QAreaSeries20selectedColorChangedE6QColor@Qt_6 6.8.2
  _ZN11QAreaSeries22setSelectedBorderColorE6QColor@Qt_6 6.8.2
  _ZN11QAreaSeries26selectedBorderColorChangedE6QColor@Qt_6 6.8.2
+ _ZN11QAreaSeries7clickedE6QPoint@Qt_6 6.9.1
+ _ZN11QAreaSeries7pressedE6QPoint@Qt_6 6.9.1
+ _ZN11QAreaSeries8releasedE6QPoint@Qt_6 6.9.1
  _ZN11QAreaSeries8setColorE6QColor@Qt_6 6.8.2
  _ZN11QAreaSeriesC1EP7QObject@Qt_6 6.8.2
  _ZN11QAreaSeriesC1ER18QAreaSeriesPrivateP7QObject@Qt_6_PRIVATE_API 6.8.2
@@ -205,9 +221,11 @@ libQt6Graphs.so.6 libqt6graphs6 #MINVER#
  _ZN11QGraphsView10hoverEnterERK7QString7QPointFS3_@Qt_6_PRIVATE_API 6.8.2
  _ZN11QGraphsView10removeAxisEP13QAbstractAxis@Qt_6_PRIVATE_API 6.8.2
  _ZN11QGraphsView10seriesListEv@Qt_6_PRIVATE_API 6.8.2
+ _ZN11QGraphsView10wheelEventEP11QWheelEvent@Qt_6_PRIVATE_API 6.9.1
  _ZN11QGraphsView11handleHoverERK7QString7QPointFS3_@Qt_6_PRIVATE_API 6.8.2
  _ZN11QGraphsView11qt_metacallEN11QMetaObject4CallEiPPv@Qt_6_PRIVATE_API 6.8.2
  _ZN11QGraphsView11qt_metacastEPKc@Qt_6_PRIVATE_API 6.8.2
+ _ZN11QGraphsView11setPanStyleENS_8PanStyleE@Qt_6_PRIVATE_API 6.9.1
  (subst)_ZN11QGraphsView12atSeriesFuncEP16QQmlListPropertyI7QObjectE{qptrdiff}@Qt_6_PRIVATE_API 6.8.2
  _ZN11QGraphsView12axisXChangedEv@Qt_6_PRIVATE_API 6.8.2
  _ZN11QGraphsView12axisYChangedEv@Qt_6_PRIVATE_API 6.8.2
@@ -215,12 +233,12 @@ libQt6Graphs.so.6 libqt6graphs6 #MINVER#
  _ZN11QGraphsView12removeSeriesEP7QObject@Qt_6_PRIVATE_API 6.8.2
  (subst)_ZN11QGraphsView12removeSeriesE{qptrdiff}@Qt_6_PRIVATE_API 6.8.2
  _ZN11QGraphsView12setMarginTopEd@Qt_6_PRIVATE_API 6.8.2
+ _ZN11QGraphsView12setZoomStyleENS_9ZoomStyleE@Qt_6_PRIVATE_API 6.9.1
  _ZN11QGraphsView12themeChangedEv@Qt_6_PRIVATE_API 6.8.2
  _ZN11QGraphsView12updatePolishEv@Qt_6_PRIVATE_API 6.8.2
  _ZN11QGraphsView13setMarginLeftEd@Qt_6_PRIVATE_API 6.8.2
  _ZN11QGraphsView14geometryChangeERK6QRectFS2_@Qt_6_PRIVATE_API 6.8.2
  _ZN11QGraphsView14hoverMoveEventEP11QHoverEvent@Qt_6_PRIVATE_API 6.8.2
- _ZN11QGraphsView14mouseMoveEventEP11QMouseEvent@Qt_6_PRIVATE_API 6.8.2
  _ZN11QGraphsView14setMarginRightEd@Qt_6_PRIVATE_API 6.8.2
  _ZN11QGraphsView14setOrientationEN2Qt11OrientationE@Qt_6_PRIVATE_API 6.8.2
  _ZN11QGraphsView14setShadowColorE6QColor@Qt_6_PRIVATE_API 6.8.2
@@ -228,7 +246,8 @@ libQt6Graphs.so.6 libqt6graphs6 #MINVER#
  _ZN11QGraphsView15clearSeriesFuncEP16QQmlListPropertyI7QObjectE@Qt_6_PRIVATE_API 6.8.2
  _ZN11QGraphsView15countSeriesFuncEP16QQmlListPropertyI7QObjectE@Qt_6_PRIVATE_API 6.8.2
  _ZN11QGraphsView15handleHoverExitERK7QString7QPointF@Qt_6_PRIVATE_API 6.8.2
- _ZN11QGraphsView15mousePressEventEP11QMouseEvent@Qt_6_PRIVATE_API 6.8.2
+ _ZN11QGraphsView15panStyleChangedEv@Qt_6_PRIVATE_API 6.9.1
+ _ZN11QGraphsView15plotAreaChangedEv@Qt_6_PRIVATE_API 6.9.1
  _ZN11QGraphsView15polishAndUpdateEv@Qt_6_PRIVATE_API 6.8.2
  _ZN11QGraphsView15setMarginBottomEd@Qt_6_PRIVATE_API 6.8.2
  _ZN11QGraphsView15updateAxisAreasEv@Qt_6_PRIVATE_API 6.8.2
@@ -241,10 +260,10 @@ libQt6Graphs.so.6 libqt6graphs6 #MINVER#
  _ZN11QGraphsView16setShadowXOffsetEd@Qt_6_PRIVATE_API 6.8.2
  _ZN11QGraphsView16setShadowYOffsetEd@Qt_6_PRIVATE_API 6.8.2
  _ZN11QGraphsView16staticMetaObjectE@Qt_6_PRIVATE_API 6.8.2
+ _ZN11QGraphsView16zoomStyleChangedEv@Qt_6_PRIVATE_API 6.9.1
  _ZN11QGraphsView17componentCompleteEv@Qt_6_PRIVATE_API 6.8.2
  _ZN11QGraphsView17createPieRendererEv@Qt_6_PRIVATE_API 6.8.2
  _ZN11QGraphsView17marginLeftChangedEv@Qt_6_PRIVATE_API 6.8.2
- _ZN11QGraphsView17mouseReleaseEventEP11QMouseEvent@Qt_6_PRIVATE_API 6.8.2
  _ZN11QGraphsView17setAxisXSmoothingEd@Qt_6_PRIVATE_API 6.8.2
  _ZN11QGraphsView17setAxisYSmoothingEd@Qt_6_PRIVATE_API 6.8.2
  _ZN11QGraphsView17setShadowBarWidthEd@Qt_6_PRIVATE_API 6.8.2
@@ -252,12 +271,17 @@ libQt6Graphs.so.6 libqt6graphs6 #MINVER#
  _ZN11QGraphsView18createAxisRendererEv@Qt_6_PRIVATE_API 6.8.2
  _ZN11QGraphsView18createBarsRendererEv@Qt_6_PRIVATE_API 6.8.2
  _ZN11QGraphsView18marginRightChangedEv@Qt_6_PRIVATE_API 6.8.2
+ _ZN11QGraphsView18onPinchGrabChangedEN15QPointingDevice14GrabTransitionE11QEventPoint@Qt_6_PRIVATE_API 6.9.1
  _ZN11QGraphsView18orientationChangedEv@Qt_6_PRIVATE_API 6.8.2
  _ZN11QGraphsView18setShadowSmoothingEd@Qt_6_PRIVATE_API 6.8.2
+ _ZN11QGraphsView18setZoomAreaEnabledEb@Qt_6_PRIVATE_API 6.9.1
+ _ZN11QGraphsView18setZoomSensitivityEd@Qt_6_PRIVATE_API 6.9.1
  _ZN11QGraphsView18shadowColorChangedEv@Qt_6_PRIVATE_API 6.8.2
  _ZN11QGraphsView19createPointRendererEv@Qt_6_PRIVATE_API 6.8.2
  _ZN11QGraphsView19marginBottomChangedEv@Qt_6_PRIVATE_API 6.8.2
+ _ZN11QGraphsView19onPinchScaleChangedEd@Qt_6_PRIVATE_API 6.9.1
  (subst)_ZN11QGraphsView19setGraphSeriesCountE{qptrdiff}@Qt_6_PRIVATE_API 6.8.2
+ _ZN11QGraphsView19setZoomAreaDelegateEP13QQmlComponent@Qt_6_PRIVATE_API 6.9.1
  _ZN11QGraphsView20gridSmoothingChangedEv@Qt_6_PRIVATE_API 6.8.2
  _ZN11QGraphsView20shadowVisibleChangedEv@Qt_6_PRIVATE_API 6.8.2
  _ZN11QGraphsView20shadowXOffsetChangedEv@Qt_6_PRIVATE_API 6.8.2
@@ -268,6 +292,9 @@ libQt6Graphs.so.6 libqt6graphs6 #MINVER#
  _ZN11QGraphsView21shadowBarWidthChangedEv@Qt_6_PRIVATE_API 6.8.2
  _ZN11QGraphsView22getSeriesRendererIndexEP15QAbstractSeries@Qt_6_PRIVATE_API 6.8.2
  _ZN11QGraphsView22shadowSmoothingChangedEv@Qt_6_PRIVATE_API 6.8.2
+ _ZN11QGraphsView22zoomAreaEnabledChangedEv@Qt_6_PRIVATE_API 6.9.1
+ _ZN11QGraphsView22zoomSensitivityChangedEv@Qt_6_PRIVATE_API 6.9.1
+ _ZN11QGraphsView23zoomAreaDelegateChangedEv@Qt_6_PRIVATE_API 6.9.1
  _ZN11QGraphsView5hoverERK7QString7QPointFS3_@Qt_6_PRIVATE_API 6.8.2
  _ZN11QGraphsView7addAxisEP13QAbstractAxis@Qt_6_PRIVATE_API 6.8.2
  _ZN11QGraphsView8setAxisXEP13QAbstractAxis@Qt_6_PRIVATE_API 6.8.2
@@ -316,8 +343,10 @@ libQt6Graphs.so.6 libqt6graphs6 #MINVER#
  _ZN12QBar3DSeries16staticMetaObjectE@Qt_6 6.7.2
  _ZN12QBar3DSeries18selectedBarChangedE6QPoint@Qt_6 6.8.2
  _ZN12QBar3DSeries19columnLabelsChangedEv@Qt_6 6.8.2
+ _ZN12QBar3DSeries23setValueColoringEnabledEb@Qt_6 6.9.1
  _ZN12QBar3DSeries24invalidSelectionPositionEv@Qt_6 6.7.2
  _ZN12QBar3DSeries25handleMeshRotationChangedERK11QQuaternion@Qt_6 6.7.2
+ _ZN12QBar3DSeries27valueColoringEnabledChangedEb@Qt_6 6.9.1
  (subst)_ZN12QBar3DSeries8clearRowE{qptrdiff}@Qt_6 6.8.2
  _ZN12QBar3DSeriesC1EP13QBarDataProxyP7QObject@Qt_6 6.7.2
  _ZN12QBar3DSeriesC1EP7QObject@Qt_6 6.7.2
@@ -476,6 +505,7 @@ libQt6Graphs.so.6 libqt6graphs6 #MINVER#
  _ZN13QAbstractAxis11qt_metacallEN11QMetaObject4CallEiPPv@Qt_6 6.7.2
  _ZN13QAbstractAxis11qt_metacastEPKc@Qt_6 6.7.2
  _ZN13QAbstractAxis12rangeChangedEdd@Qt_6 6.8.2
+ _ZN13QAbstractAxis12setAlignmentE6QFlagsIN2Qt13AlignmentFlagEE@Qt_6 6.9.1
  _ZN13QAbstractAxis12setTitleFontERK5QFont@Qt_6 6.7.2
  _ZN13QAbstractAxis12setTitleTextERK7QString@Qt_6 6.7.2
  _ZN13QAbstractAxis13setTitleColorE6QColor@Qt_6 6.8.2
@@ -484,6 +514,7 @@ libQt6Graphs.so.6 libqt6graphs6 #MINVER#
  _ZN13QAbstractAxis14setLineVisibleEb@Qt_6 6.7.2
  _ZN13QAbstractAxis14visibleChangedEb@Qt_6 6.7.2
  _ZN13QAbstractAxis15setTitleVisibleEb@Qt_6 6.7.2
+ _ZN13QAbstractAxis16alignmentChangedE6QFlagsIN2Qt13AlignmentFlagEE@Qt_6 6.9.1
  _ZN13QAbstractAxis16setLabelDelegateEP13QQmlComponent@Qt_6 6.8.2
  _ZN13QAbstractAxis16setLabelsVisibleEb@Qt_6 6.7.2
  _ZN13QAbstractAxis16staticMetaObjectE@Qt_6 6.7.2
@@ -700,11 +731,13 @@ libQt6Graphs.so.6 libqt6graphs6 #MINVER#
  _ZN15QAbstract3DAxis11qt_metacallEN11QMetaObject4CallEiPPv@Qt_6 6.7.2
  _ZN15QAbstract3DAxis11qt_metacastEPKc@Qt_6 6.7.2
  _ZN15QAbstract3DAxis12rangeChangedEff@Qt_6 6.7.2
+ _ZN15QAbstract3DAxis12setLabelSizeEd@Qt_6 6.9.1
  _ZN15QAbstract3DAxis12titleChangedERK7QString@Qt_6 6.7.2
  _ZN15QAbstract3DAxis13labelsChangedEv@Qt_6 6.7.2
  _ZN15QAbstract3DAxis13setTitleFixedEb@Qt_6 6.7.2
  _ZN15QAbstract3DAxis14setTitleOffsetEf@Qt_6 6.8.2
  _ZN15QAbstract3DAxis15setTitleVisibleEb@Qt_6 6.7.2
+ _ZN15QAbstract3DAxis16labelSizeChangedEd@Qt_6 6.9.1
  _ZN15QAbstract3DAxis16setLabelsVisibleEb@Qt_6 6.8.2
  _ZN15QAbstract3DAxis16staticMetaObjectE@Qt_6 6.7.2
  _ZN15QAbstract3DAxis17setLabelAutoAngleEf@Qt_6 6.8.2
@@ -715,7 +748,9 @@ libQt6Graphs.so.6 libqt6graphs6 #MINVER#
  _ZN15QAbstract3DAxis19labelVisibleChangedEb@Qt_6 6.8.2
  _ZN15QAbstract3DAxis19titleVisibleChangedEb@Qt_6 6.8.2
  _ZN15QAbstract3DAxis21labelAutoAngleChangedEf@Qt_6 6.8.2
+ _ZN15QAbstract3DAxis21setScaleLabelsByCountEb@Qt_6 6.9.1
  _ZN15QAbstract3DAxis22autoAdjustRangeChangedEb@Qt_6 6.7.2
+ _ZN15QAbstract3DAxis25scaleLabelsByCountChangedEb@Qt_6 6.9.1
  _ZN15QAbstract3DAxis6setMaxEf@Qt_6 6.7.2
  _ZN15QAbstract3DAxis6setMinEf@Qt_6 6.7.2
  _ZN15QAbstract3DAxis8setRangeEff@Qt_6 6.7.2
@@ -873,6 +908,30 @@ libQt6Graphs.so.6 libqt6graphs6 #MINVER#
  _ZN15QPieModelMapperD0Ev@Qt_6 6.8.2
  _ZN15QPieModelMapperD1Ev@Qt_6 6.8.2
  _ZN15QPieModelMapperD2Ev@Qt_6 6.8.2
+ _ZN15QSpline3DSeries11qt_metacallEN11QMetaObject4CallEiPPv@Qt_6 6.9.1
+ _ZN15QSpline3DSeries11qt_metacastEPKc@Qt_6 6.9.1
+ _ZN15QSpline3DSeries14setSplineColorE6QColor@Qt_6 6.9.1
+ _ZN15QSpline3DSeries16setSplineLoopingEb@Qt_6 6.9.1
+ _ZN15QSpline3DSeries16setSplineTensionEd@Qt_6 6.9.1
+ _ZN15QSpline3DSeries16setSplineVisibleEb@Qt_6 6.9.1
+ _ZN15QSpline3DSeries16staticMetaObjectE@Qt_6 6.9.1
+ _ZN15QSpline3DSeries17setSplineKnottingEd@Qt_6 6.9.1
+ _ZN15QSpline3DSeries18splineColorChangedE6QColor@Qt_6 6.9.1
+ _ZN15QSpline3DSeries19setSplineResolutionEi@Qt_6 6.9.1
+ _ZN15QSpline3DSeries20splineLoopingChangedEb@Qt_6 6.9.1
+ _ZN15QSpline3DSeries20splineTensionChangedEd@Qt_6 6.9.1
+ _ZN15QSpline3DSeries21splineKnottingChangedEd@Qt_6 6.9.1
+ _ZN15QSpline3DSeries23splineResolutionChangedEi@Qt_6 6.9.1
+ _ZN15QSpline3DSeries23splineVisibilityChangedEb@Qt_6 6.9.1
+ _ZN15QSpline3DSeriesC1EP17QScatterDataProxyP7QObject@Qt_6 6.9.1
+ _ZN15QSpline3DSeriesC1EP7QObject@Qt_6 6.9.1
+ _ZN15QSpline3DSeriesC1ER22QSpline3DSeriesPrivateP7QObject@Qt_6_PRIVATE_API 6.9.1
+ _ZN15QSpline3DSeriesC2EP17QScatterDataProxyP7QObject@Qt_6 6.9.1
+ _ZN15QSpline3DSeriesC2EP7QObject@Qt_6 6.9.1
+ _ZN15QSpline3DSeriesC2ER22QSpline3DSeriesPrivateP7QObject@Qt_6_PRIVATE_API 6.9.1
+ _ZN15QSpline3DSeriesD0Ev@Qt_6 6.9.1
+ _ZN15QSpline3DSeriesD1Ev@Qt_6 6.9.1
+ _ZN15QSpline3DSeriesD2Ev@Qt_6 6.9.1
  _ZN16QBarCategoryAxis10categoriesEv@Qt_6 6.7.2
  _ZN16QBarCategoryAxis10maxChangedERK7QString@Qt_6 6.7.2
  _ZN16QBarCategoryAxis10minChangedERK7QString@Qt_6 6.7.2
@@ -908,6 +967,7 @@ libQt6Graphs.so.6 libqt6graphs6 #MINVER#
  _ZN16QQuickGraphsBars11setBarSpecsEf6QSizeFb@Qt_6_PRIVATE_API 6.8.2
  _ZN16QQuickGraphsBars11updateGraphEv@Qt_6_PRIVATE_API 6.8.2
  (subst)_ZN16QQuickGraphsBars12atSeriesFuncEP16QQmlListPropertyI12QBar3DSeriesE{qptrdiff}@Qt_6_PRIVATE_API 6.8.2
+ _ZN16QQuickGraphsBars12doRayPickingE9QVector3DS0_@Qt_6_PRIVATE_API 6.9.1
  _ZN16QQuickGraphsBars12generateBarsER5QListIP12QBar3DSeriesE@Qt_6_PRIVATE_API 6.8.2
  (subst)_ZN16QQuickGraphsBars12insertSeriesE{qptrdiff}P12QBar3DSeries@Qt_6_PRIVATE_API 6.8.2
  _ZN16QQuickGraphsBars12removeSeriesEP12QBar3DSeries@Qt_6_PRIVATE_API 6.8.2
@@ -990,6 +1050,7 @@ libQt6Graphs.so.6 libqt6graphs6 #MINVER#
  _ZN16QQuickGraphsBars25multiSeriesUniformChangedEb@Qt_6_PRIVATE_API 6.8.2
  _ZN16QQuickGraphsBars25updateBarHeightParametersEPK12QBarDataItem@Qt_6_PRIVATE_API 6.8.2
  _ZN16QQuickGraphsBars26handleDataRowLabelsChangedEv@Qt_6_PRIVATE_API 6.8.2
+ _ZN16QQuickGraphsBars26handleValueColoringChangedEv@Qt_6_PRIVATE_API 6.9.1
  _ZN16QQuickGraphsBars27handleCameraRotationChangedEv@Qt_6_PRIVATE_API 6.8.2
  _ZN16QQuickGraphsBars28calculateSceneScalingFactorsEv@Qt_6_PRIVATE_API 6.8.2
  _ZN16QQuickGraphsBars28calculateSeriesStartPositionEv@Qt_6_PRIVATE_API 6.8.2
@@ -1021,6 +1082,7 @@ libQt6Graphs.so.6 libqt6graphs6 #MINVER#
  _ZN16QQuickGraphsItem12axisXChangedEP15QAbstract3DAxis@Qt_6_PRIVATE_API 6.8.2
  _ZN16QQuickGraphsItem12axisYChangedEP15QAbstract3DAxis@Qt_6_PRIVATE_API 6.8.2
  _ZN16QQuickGraphsItem12axisZChangedEP15QAbstract3DAxis@Qt_6_PRIVATE_API 6.8.2
+ _ZN16QQuickGraphsItem12doRayPickingE9QVector3DS0_@Qt_6_PRIVATE_API 6.9.1
  _ZN16QQuickGraphsItem12doubleTappedE11QEventPointN2Qt11MouseButtonE@Qt_6_PRIVATE_API 6.8.2
  (subst)_ZN16QQuickGraphsItem12insertSeriesE{qptrdiff}P17QAbstract3DSeries@Qt_6_PRIVATE_API 6.8.2
  _ZN16QQuickGraphsItem12polarChangedEb@Qt_6_PRIVATE_API 6.8.2
@@ -1185,6 +1247,7 @@ libQt6Graphs.so.6 libqt6graphs6 #MINVER#
  _ZN16QQuickGraphsItem24handleParentHeightChangeEv@Qt_6_PRIVATE_API 6.8.2
  _ZN16QQuickGraphsItem24radialLabelOffsetChangedEf@Qt_6_PRIVATE_API 6.8.2
  _ZN16QQuickGraphsItem24setHorizontalAspectRatioEd@Qt_6_PRIVATE_API 6.8.2
+ _ZN16QQuickGraphsItem24setTransparencyTechniqueEN10QtGraphs3D21TransparencyTechniqueE@Qt_6_PRIVATE_API 6.9.1
  _ZN16QQuickGraphsItem24unsetDefaultInputHandlerEv@Qt_6_PRIVATE_API 6.8.2
  _ZN16QQuickGraphsItem24unsetDefaultPinchHandlerEv@Qt_6_PRIVATE_API 6.8.2
  _ZN16QQuickGraphsItem24unsetDefaultWheelHandlerEv@Qt_6_PRIVATE_API 6.8.2
@@ -1201,6 +1264,7 @@ libQt6Graphs.so.6 libqt6graphs6 #MINVER#
  _ZN16QQuickGraphsItem25minCameraZoomLevelChangedEf@Qt_6_PRIVATE_API 6.8.2
  _ZN16QQuickGraphsItem25updateSliceFrameMaterialsEP15QCustom3DVolumeRNS_6VolumeE@Qt_6_PRIVATE_API 6.8.2
  _ZN16QQuickGraphsItem26changeLabelBackgroundColorEP16QQuick3DRepeater6QColor@Qt_6_PRIVATE_API 6.8.2
+ _ZN16QQuickGraphsItem26handleAxisLabelSizeChangedEd@Qt_6_PRIVATE_API 6.9.1
  _ZN16QQuickGraphsItem26handleInputPositionChangedE6QPoint@Qt_6_PRIVATE_API 6.8.2
  _ZN16QQuickGraphsItem26handleQueryPositionChangedE6QPoint@Qt_6_PRIVATE_API 6.8.2
  _ZN16QQuickGraphsItem26handleRequestShadowQualityEN10QtGraphs3D13ShadowQualityE@Qt_6_PRIVATE_API 6.8.2
@@ -1220,6 +1284,7 @@ libQt6Graphs.so.6 libqt6graphs6 #MINVER#
  _ZN16QQuickGraphsItem28handleThemeBaseColorsChangedERK5QListI6QColorE@Qt_6_PRIVATE_API 6.8.2
  _ZN16QQuickGraphsItem28handleThemeColorStyleChangedEN12QGraphsTheme10ColorStyleE@Qt_6_PRIVATE_API 6.8.2
  _ZN16QQuickGraphsItem28horizontalAspectRatioChangedEd@Qt_6_PRIVATE_API 6.8.2
+ _ZN16QQuickGraphsItem28transparencyTechniqueChangedEN10QtGraphs3D21TransparencyTechniqueE@Qt_6_PRIVATE_API 6.9.1
  (subst)_ZN16QQuickGraphsItem29handleAxisSegmentCountChangedE{qptrdiff}@Qt_6_PRIVATE_API 6.8.2
  _ZN16QQuickGraphsItem29handleSeriesVisibilityChangedEb@Qt_6_PRIVATE_API 6.8.2
  _ZN16QQuickGraphsItem30calculateCategoryLabelPositionEP15QAbstract3DAxis9QVector3Di@Qt_6_PRIVATE_API 6.8.2
@@ -1240,6 +1305,8 @@ libQt6Graphs.so.6 libqt6graphs6 #MINVER#
  _ZN16QQuickGraphsItem33handleAxisReversedChangedBySenderEP7QObject@Qt_6_PRIVATE_API 6.8.2
  _ZN16QQuickGraphsItem33handleSecondarySubViewportChangedE5QRect@Qt_6_PRIVATE_API 6.8.2
  _ZN16QQuickGraphsItem34handleAxisLabelAutoRotationChangedEf@Qt_6_PRIVATE_API 6.8.2
+ _ZN16QQuickGraphsItem34handleAxisLabelSizeChangedBySenderEP7QObject@Qt_6_PRIVATE_API 6.9.1
+ _ZN16QQuickGraphsItem35handleAxisScaleLabelsByCountChangedEb@Qt_6_PRIVATE_API 6.9.1
  _ZN16QQuickGraphsItem35handleAxisTitleFixedChangedBySenderEP7QObject@Qt_6_PRIVATE_API 6.8.2
  _ZN16QQuickGraphsItem36handleAxisLabelFormatChangedBySenderEP7QObject@Qt_6_PRIVATE_API 6.8.2
  _ZN16QQuickGraphsItem36handleAxisTitleOffsetChangedBySenderEP7QObject@Qt_6_PRIVATE_API 6.8.2
@@ -1253,6 +1320,7 @@ libQt6Graphs.so.6 libqt6graphs6 #MINVER#
  _ZN16QQuickGraphsItem40handleThemeMultiHighlightGradientChangedERK15QLinearGradient@Qt_6_PRIVATE_API 6.8.2
  _ZN16QQuickGraphsItem41handleThemeSingleHighlightGradientChangedERK15QLinearGradient@Qt_6_PRIVATE_API 6.8.2
  _ZN16QQuickGraphsItem42handleAxisLabelAutoRotationChangedBySenderEP7QObject@Qt_6_PRIVATE_API 6.8.2
+ _ZN16QQuickGraphsItem43handleAxisScaleLabelsByCountChangedBySenderEP7QObject@Qt_6_PRIVATE_API 6.9.1
  _ZN16QQuickGraphsItem5eventEP6QEvent@Qt_6_PRIVATE_API 6.8.2
  _ZN16QQuickGraphsItem5pinchEd@Qt_6_PRIVATE_API 6.8.2
  _ZN16QQuickGraphsItem5sceneEv@Qt_6_PRIVATE_API 6.8.2
@@ -1460,8 +1528,10 @@ libQt6Graphs.so.6 libqt6graphs6 #MINVER#
  _ZN19QQuickGraphsScatter12axisXChangedEP12QValue3DAxis@Qt_6_PRIVATE_API 6.8.2
  _ZN19QQuickGraphsScatter12axisYChangedEP12QValue3DAxis@Qt_6_PRIVATE_API 6.8.2
  _ZN19QQuickGraphsScatter12axisZChangedEP12QValue3DAxis@Qt_6_PRIVATE_API 6.8.2
+ _ZN19QQuickGraphsScatter12doRayPickingE9QVector3DS0_@Qt_6_PRIVATE_API 6.9.1
  _ZN19QQuickGraphsScatter12getItemIndexEP13QQuick3DModel@Qt_6_PRIVATE_API 6.8.2
  _ZN19QQuickGraphsScatter12removeSeriesEP16QScatter3DSeries@Qt_6_PRIVATE_API 6.8.2
+ _ZN19QQuickGraphsScatter12updateSplineEPNS_12ScatterModelE@Qt_6_PRIVATE_API 6.9.1
  _ZN19QQuickGraphsScatter13connectSeriesEP16QScatter3DSeries@Qt_6_PRIVATE_API 6.8.2
  _ZN19QQuickGraphsScatter13createTextureEv@Qt_6_PRIVATE_API 6.8.2
  _ZN19QQuickGraphsScatter14clearSelectionEv@Qt_6_PRIVATE_API 6.8.2
@@ -1485,6 +1555,7 @@ libQt6Graphs.so.6 libqt6graphs6 #MINVER#
  _ZN19QQuickGraphsScatter16setSelectionModeE6QFlagsIN10QtGraphs3D13SelectionFlagEE@Qt_6_PRIVATE_API 6.8.2
  _ZN19QQuickGraphsScatter16staticMetaObjectE@Qt_6_PRIVATE_API 6.8.2
  _ZN19QQuickGraphsScatter17componentCompleteEv@Qt_6_PRIVATE_API 6.8.2
+ _ZN19QQuickGraphsScatter17createSplineModelEPNS_12ScatterModelE@Qt_6_PRIVATE_API 6.9.1
  _ZN19QQuickGraphsScatter17recreateDataItemsERK5QListIPNS_12ScatterModelEE@Qt_6_PRIVATE_API 6.8.2
  _ZN19QQuickGraphsScatter17recreateDataItemsEv@Qt_6_PRIVATE_API 6.8.2
  _ZN19QQuickGraphsScatter17scatterSeriesListEv@Qt_6_PRIVATE_API 6.8.2
@@ -1497,6 +1568,7 @@ libQt6Graphs.so.6 libqt6graphs6 #MINVER#
  _ZN19QQuickGraphsScatter19clearSelectionModelEv@Qt_6_PRIVATE_API 6.8.2
  (subst)_ZN19QQuickGraphsScatter19handleItemsInsertedE{qptrdiff}{qptrdiff}@Qt_6_PRIVATE_API 6.8.2
  _ZN19QQuickGraphsScatter19handleSeriesChangedE5QListIP17QAbstract3DSeriesE@Qt_6_PRIVATE_API 6.8.2
+ _ZN19QQuickGraphsScatter19handleSplineChangedEv@Qt_6_PRIVATE_API 6.9.1
  _ZN19QQuickGraphsScatter19optimizationChangedEN10QtGraphs3D16OptimizationHintE@Qt_6_PRIVATE_API 6.8.2
  _ZN19QQuickGraphsScatter19selectedItemInRangeEPKNS_12ScatterModelE@Qt_6_PRIVATE_API 6.8.2
  _ZN19QQuickGraphsScatter19updateLightStrengthEv@Qt_6_PRIVATE_API 6.8.2
@@ -1544,6 +1616,7 @@ libQt6Graphs.so.6 libqt6graphs6 #MINVER#
  _ZN19QQuickGraphsSurface12axisXChangedEP12QValue3DAxis@Qt_6_PRIVATE_API 6.8.2
  _ZN19QQuickGraphsSurface12axisYChangedEP12QValue3DAxis@Qt_6_PRIVATE_API 6.8.2
  _ZN19QQuickGraphsSurface12axisZChangedEP12QValue3DAxis@Qt_6_PRIVATE_API 6.8.2
+ _ZN19QQuickGraphsSurface12doRayPickingE9QVector3DS0_@Qt_6_PRIVATE_API 6.9.1
  _ZN19QQuickGraphsSurface12removeSeriesEP16QSurface3DSeries@Qt_6_PRIVATE_API 6.8.2
  _ZN19QQuickGraphsSurface13addSliceModelEPNS_12SurfaceModelE@Qt_6_PRIVATE_API 6.8.2
  (subst)_ZN19QQuickGraphsSurface13createIndicesEPNS_12SurfaceModelE{qptrdiff}{qptrdiff}@Qt_6_PRIVATE_API 6.8.2
@@ -1975,6 +2048,7 @@ libQt6Graphs.so.6 libqt6graphs6 #MINVER#
  _ZN9QPieSliceD1Ev@Qt_6 6.8.2
  _ZN9QPieSliceD2Ev@Qt_6 6.8.2
  (subst)_ZN9QXYSeries10pointAddedE{qptrdiff}@Qt_6 6.8.2
+ _ZN9QXYSeries11pointsAddedExx@Qt_6 6.9.1
  _ZN9QXYSeries11qt_metacallEN11QMetaObject4CallEiPPv@Qt_6 6.7.2
  _ZN9QXYSeries11qt_metacastEPKc@Qt_6 6.7.2
  (subst)_ZN9QXYSeries11selectPointE{qptrdiff}@Qt_6 6.8.2
@@ -1984,6 +2058,7 @@ libQt6Graphs.so.6 libqt6graphs6 #MINVER#
  (subst)_ZN9QXYSeries12selectPointsERK5QListI{qptrdiff}E@Qt_6 6.8.2
  _ZN9QXYSeries12setDraggableEb@Qt_6 6.8.2
  (subst)_ZN9QXYSeries13deselectPointE{qptrdiff}@Qt_6 6.8.2
+ _ZN9QXYSeries13doubleClickedE6QPoint@Qt_6 6.9.1
  (subst)_ZN9QXYSeries13pointReplacedE{qptrdiff}@Qt_6 6.8.2
  (subst)_ZN9QXYSeries13pointsRemovedE{qptrdiff}{qptrdiff}@Qt_6 6.8.2
  _ZN9QXYSeries13seriesUpdatedEv@Qt_6 6.8.2
@@ -2010,11 +2085,14 @@ libQt6Graphs.so.6 libqt6graphs6 #MINVER#
  _ZN9QXYSeries6removeE7QPointF@Qt_6 6.8.2
  _ZN9QXYSeries6removeEdd@Qt_6 6.7.2
  (subst)_ZN9QXYSeries6removeE{qptrdiff}@Qt_6 6.8.2
+ _ZN9QXYSeries7clickedE6QPoint@Qt_6 6.9.1
+ _ZN9QXYSeries7pressedE6QPoint@Qt_6 6.9.1
  _ZN9QXYSeries7replaceE7QPointFS0_@Qt_6 6.8.2
  _ZN9QXYSeries7replaceERK5QListI7QPointFE@Qt_6 6.7.2
  _ZN9QXYSeries7replaceEdddd@Qt_6 6.7.2
  (subst)_ZN9QXYSeries7replaceE{qptrdiff}7QPointF@Qt_6 6.8.2
  (subst)_ZN9QXYSeries7replaceE{qptrdiff}dd@Qt_6 6.8.2
+ _ZN9QXYSeries8releasedE6QPoint@Qt_6 6.9.1
  _ZN9QXYSeries8setColorE6QColor@Qt_6 6.8.2
  _ZN9QXYSeriesC1ER16QXYSeriesPrivateP7QObject@Qt_6_PRIVATE_API 6.7.2
  _ZN9QXYSeriesC2ER16QXYSeriesPrivateP7QObject@Qt_6_PRIVATE_API 6.7.2
@@ -2060,7 +2138,9 @@ libQt6Graphs.so.6 libqt6graphs6 #MINVER#
  _ZNK10QValueAxis13labelDecimalsEv@Qt_6 6.7.2
  _ZNK10QValueAxis3maxEv@Qt_6 6.7.2
  _ZNK10QValueAxis3minEv@Qt_6 6.7.2
+ _ZNK10QValueAxis3panEv@Qt_6 6.9.1
  _ZNK10QValueAxis4typeEv@Qt_6 6.7.2
+ _ZNK10QValueAxis4zoomEv@Qt_6 6.9.1
  _ZNK11QAreaSeries10isSelectedEv@Qt_6 6.8.2
  _ZNK11QAreaSeries10metaObjectEv@Qt_6 6.8.2
  _ZNK11QAreaSeries11borderColorEv@Qt_6 6.8.2
@@ -2091,12 +2171,17 @@ libQt6Graphs.so.6 libqt6graphs6 #MINVER#
  _ZNK11QGraphsView14shadowBarWidthEv@Qt_6_PRIVATE_API 6.8.2
  _ZNK11QGraphsView15isShadowVisibleEv@Qt_6_PRIVATE_API 6.8.2
  _ZNK11QGraphsView15shadowSmoothingEv@Qt_6_PRIVATE_API 6.8.2
+ _ZNK11QGraphsView15zoomAreaEnabledEv@Qt_6_PRIVATE_API 6.9.1
+ _ZNK11QGraphsView15zoomSensitivityEv@Qt_6_PRIVATE_API 6.9.1
  _ZNK11QGraphsView16graphSeriesCountEv@Qt_6_PRIVATE_API 6.8.2
+ _ZNK11QGraphsView16zoomAreaDelegateEv@Qt_6_PRIVATE_API 6.9.1
  _ZNK11QGraphsView5axisXEv@Qt_6_PRIVATE_API 6.8.2
  _ZNK11QGraphsView5axisYEv@Qt_6_PRIVATE_API 6.8.2
  _ZNK11QGraphsView5themeEv@Qt_6_PRIVATE_API 6.8.2
+ _ZNK11QGraphsView8panStyleEv@Qt_6_PRIVATE_API 6.9.1
  _ZNK11QGraphsView8plotAreaEv@Qt_6_PRIVATE_API 6.8.2
  _ZNK11QGraphsView9marginTopEv@Qt_6_PRIVATE_API 6.8.2
+ _ZNK11QGraphsView9zoomStyleEv@Qt_6_PRIVATE_API 6.9.1
  _ZNK11QLineSeries10metaObjectEv@Qt_6 6.7.2
  _ZNK11QLineSeries4typeEv@Qt_6 6.7.2
  _ZNK11QLineSeries5widthEv@Qt_6 6.7.2
@@ -2104,6 +2189,7 @@ libQt6Graphs.so.6 libqt6graphs6 #MINVER#
  _ZNK12QBar3DSeries10metaObjectEv@Qt_6 6.7.2
  _ZNK12QBar3DSeries11selectedBarEv@Qt_6 6.7.2
  _ZNK12QBar3DSeries12columnLabelsEv@Qt_6 6.8.2
+ _ZNK12QBar3DSeries22isValueColoringEnabledEv@Qt_6 6.9.1
  _ZNK12QBar3DSeries9dataProxyEv@Qt_6 6.7.2
  _ZNK12QBar3DSeries9meshAngleEv@Qt_6 6.7.2
  _ZNK12QBar3DSeries9rowColorsEv@Qt_6 6.7.2
@@ -2159,6 +2245,7 @@ libQt6Graphs.so.6 libqt6graphs6 #MINVER#
  _ZNK13QAbstractAxis13labelsVisibleEv@Qt_6 6.7.2
  _ZNK13QAbstractAxis14isTitleVisibleEv@Qt_6 6.7.2
  _ZNK13QAbstractAxis16isSubGridVisibleEv@Qt_6 6.8.2
+ _ZNK13QAbstractAxis9alignmentEv@Qt_6 6.9.1
  _ZNK13QAbstractAxis9isVisibleEv@Qt_6 6.7.2
  _ZNK13QAbstractAxis9titleFontEv@Qt_6 6.7.2
  _ZNK13QAbstractAxis9titleTextEv@Qt_6 6.7.2
@@ -2217,11 +2304,13 @@ libQt6Graphs.so.6 libqt6graphs6 #MINVER#
  _ZNK15QAbstract3DAxis14isTitleVisibleEv@Qt_6 6.7.2
  _ZNK15QAbstract3DAxis14labelAutoAngleEv@Qt_6 6.8.2
  _ZNK15QAbstract3DAxis17isAutoAdjustRangeEv@Qt_6 6.7.2
+ _ZNK15QAbstract3DAxis20isScaleLabelsByCountEv@Qt_6 6.9.1
  _ZNK15QAbstract3DAxis3maxEv@Qt_6 6.7.2
  _ZNK15QAbstract3DAxis3minEv@Qt_6 6.7.2
  _ZNK15QAbstract3DAxis4typeEv@Qt_6 6.7.2
  _ZNK15QAbstract3DAxis5titleEv@Qt_6 6.7.2
  _ZNK15QAbstract3DAxis6labelsEv@Qt_6 6.7.2
+ _ZNK15QAbstract3DAxis9labelSizeEv@Qt_6 6.9.1
  _ZNK15QAbstractSeries10legendDataEv@Qt_6 6.8.2
  _ZNK15QAbstractSeries10metaObjectEv@Qt_6 6.7.2
  _ZNK15QAbstractSeries11isHoverableEv@Qt_6 6.8.2
@@ -2270,6 +2359,13 @@ libQt6Graphs.so.6 libqt6graphs6 #MINVER#
  _ZNK15QPieModelMapper5firstEv@Qt_6 6.8.2
  _ZNK15QPieModelMapper5modelEv@Qt_6 6.8.2
  _ZNK15QPieModelMapper6seriesEv@Qt_6 6.8.2
+ _ZNK15QSpline3DSeries10metaObjectEv@Qt_6 6.9.1
+ _ZNK15QSpline3DSeries11splineColorEv@Qt_6 6.9.1
+ _ZNK15QSpline3DSeries13splineTensionEv@Qt_6 6.9.1
+ _ZNK15QSpline3DSeries14splineKnottingEv@Qt_6 6.9.1
+ _ZNK15QSpline3DSeries15isSplineLoopingEv@Qt_6 6.9.1
+ _ZNK15QSpline3DSeries15isSplineVisibleEv@Qt_6 6.9.1
+ _ZNK15QSpline3DSeries16splineResolutionEv@Qt_6 6.9.1
  _ZNK16QBarCategoryAxis10metaObjectEv@Qt_6 6.7.2
  (subst)_ZNK16QBarCategoryAxis2atE{qptrdiff}@Qt_6 6.8.2
  _ZNK16QBarCategoryAxis3maxEv@Qt_6 6.7.2
@@ -2318,6 +2414,7 @@ libQt6Graphs.so.6 libqt6graphs6 #MINVER#
  _ZNK16QQuickGraphsItem20horizontalFlipFactorEv@Qt_6_PRIVATE_API 6.8.2
  _ZNK16QQuickGraphsItem20queriedGraphPositionEv@Qt_6_PRIVATE_API 6.8.2
  _ZNK16QQuickGraphsItem21horizontalAspectRatioEv@Qt_6_PRIVATE_API 6.8.2
+ _ZNK16QQuickGraphsItem21transparencyTechniqueEv@Qt_6_PRIVATE_API 6.9.1
  _ZNK16QQuickGraphsItem23selectedCustomItemIndexEv@Qt_6_PRIVATE_API 6.8.2
  _ZNK16QQuickGraphsItem4axesEv@Qt_6_PRIVATE_API 6.8.2
  _ZNK16QQuickGraphsItem5axisXEv@Qt_6_PRIVATE_API 6.8.2
@@ -2561,6 +2658,7 @@ libQt6Graphs.so.6 libqt6graphs6 #MINVER#
  _ZTI15QCategory3DAxis@Qt_6 6.7.2
  _ZTI15QCustom3DVolume@Qt_6 6.7.2
  _ZTI15QPieModelMapper@Qt_6 6.8.2
+ _ZTI15QSpline3DSeries@Qt_6 6.9.1
  _ZTI16QBarCategoryAxis@Qt_6 6.7.2
  _ZTI16QQuickGraphsBars@Qt_6_PRIVATE_API 6.8.2
  _ZTI16QQuickGraphsItem@Qt_6_PRIVATE_API 6.8.2
@@ -2630,6 +2728,7 @@ libQt6Graphs.so.6 libqt6graphs6 #MINVER#
  _ZTS15QCategory3DAxis@Qt_6 6.7.2
  _ZTS15QCustom3DVolume@Qt_6 6.7.2
  _ZTS15QPieModelMapper@Qt_6 6.8.2
+ _ZTS15QSpline3DSeries@Qt_6 6.9.1
  _ZTS16QBarCategoryAxis@Qt_6 6.7.2
  _ZTS16QQuickGraphsBars@Qt_6_PRIVATE_API 6.8.2
  _ZTS16QQuickGraphsItem@Qt_6_PRIVATE_API 6.8.2
@@ -2699,6 +2798,7 @@ libQt6Graphs.so.6 libqt6graphs6 #MINVER#
  _ZTV15QCategory3DAxis@Qt_6 6.7.2
  _ZTV15QCustom3DVolume@Qt_6 6.7.2
  _ZTV15QPieModelMapper@Qt_6 6.8.2
+ _ZTV15QSpline3DSeries@Qt_6 6.9.1
  _ZTV16QBarCategoryAxis@Qt_6 6.7.2
  _ZTV16QQuickGraphsBars@Qt_6_PRIVATE_API 6.8.2
  _ZTV16QQuickGraphsItem@Qt_6_PRIVATE_API 6.8.2
diff -pruN 6.8.2-4/debian/libqt6graphswidgets6.symbols 6.9.1-1/debian/libqt6graphswidgets6.symbols
--- 6.8.2-4/debian/libqt6graphswidgets6.symbols	2025-03-01 11:36:24.000000000 +0000
+++ 6.9.1-1/debian/libqt6graphswidgets6.symbols	2025-08-01 11:06:19.000000000 +0000
@@ -1,4 +1,4 @@
-# SymbolsHelper-Confirmed: 6.8.2 amd64
+# SymbolsHelper-Confirmed: 6.9.1 amd64
 libQt6GraphsWidgets.so.6 libqt6graphswidgets6 #MINVER#
 * Build-Depends-Package: qt6-graphs-dev
  NonQt@NonQt 6.8.2
@@ -44,6 +44,7 @@ libQt6GraphsWidgets.so.6 libqt6graphswid
  _ZN19Q3DGraphsWidgetItem11longPressedEv@Qt_6 6.8.2
  _ZN19Q3DGraphsWidgetItem11qt_metacallEN11QMetaObject4CallEiPPv@Qt_6 6.8.2
  _ZN19Q3DGraphsWidgetItem11qt_metacastEPKc@Qt_6 6.8.2
+ _ZN19Q3DGraphsWidgetItem12doRayPickingE9QVector3DS0_@Qt_6 6.9.1
  _ZN19Q3DGraphsWidgetItem12doubleTappedE11QEventPointN2Qt11MouseButtonE@Qt_6 6.8.2
  _ZN19Q3DGraphsWidgetItem12polarChangedEb@Qt_6 6.8.2
  _ZN19Q3DGraphsWidgetItem12releaseThemeEP12QGraphsTheme@Qt_6 6.8.2
@@ -117,6 +118,7 @@ libQt6GraphsWidgets.so.6 libqt6graphswid
  _ZN19Q3DGraphsWidgetItem23unsetDefaultDragHandlerEv@Qt_6 6.8.2
  _ZN19Q3DGraphsWidgetItem24radialLabelOffsetChangedEf@Qt_6 6.8.2
  _ZN19Q3DGraphsWidgetItem24setHorizontalAspectRatioEd@Qt_6 6.8.2
+ _ZN19Q3DGraphsWidgetItem24setTransparencyTechniqueEN10QtGraphs3D21TransparencyTechniqueE@Qt_6 6.9.1
  _ZN19Q3DGraphsWidgetItem24unsetDefaultInputHandlerEv@Qt_6 6.8.2
  _ZN19Q3DGraphsWidgetItem24unsetDefaultPinchHandlerEv@Qt_6 6.8.2
  _ZN19Q3DGraphsWidgetItem24unsetDefaultWheelHandlerEv@Qt_6 6.8.2
@@ -133,6 +135,7 @@ libQt6GraphsWidgets.so.6 libqt6graphswid
  _ZN19Q3DGraphsWidgetItem27cameraTargetPositionChangedE9QVector3D@Qt_6 6.8.2
  _ZN19Q3DGraphsWidgetItem27queriedGraphPositionChangedE9QVector3D@Qt_6 6.8.2
  _ZN19Q3DGraphsWidgetItem28horizontalAspectRatioChangedEd@Qt_6 6.8.2
+ _ZN19Q3DGraphsWidgetItem28transparencyTechniqueChangedEN10QtGraphs3D21TransparencyTechniqueE@Qt_6 6.9.1
  _ZN19Q3DGraphsWidgetItem5eventEP6QEvent@Qt_6 6.8.2
  _ZN19Q3DGraphsWidgetItem5pinchEd@Qt_6 6.8.2
  _ZN19Q3DGraphsWidgetItem5wheelEP11QWheelEvent@Qt_6 6.8.2
@@ -251,6 +254,7 @@ libQt6GraphsWidgets.so.6 libqt6graphswid
  _ZNK19Q3DGraphsWidgetItem20queriedGraphPositionEv@Qt_6 6.8.2
  _ZNK19Q3DGraphsWidgetItem21horizontalAspectRatioEv@Qt_6 6.8.2
  _ZNK19Q3DGraphsWidgetItem21isZoomAtTargetEnabledEv@Qt_6 6.8.2
+ _ZNK19Q3DGraphsWidgetItem21transparencyTechniqueEv@Qt_6 6.9.1
  _ZNK19Q3DGraphsWidgetItem23selectedCustomItemIndexEv@Qt_6 6.8.2
  _ZNK19Q3DGraphsWidgetItem5sceneEv@Qt_6 6.8.2
  _ZNK19Q3DGraphsWidgetItem6localeEv@Qt_6 6.8.2
diff -pruN 6.8.2-4/debian/not-installed 6.9.1-1/debian/not-installed
--- 6.8.2-4/debian/not-installed	2025-03-01 11:36:24.000000000 +0000
+++ 6.9.1-1/debian/not-installed	2025-08-01 11:04:27.000000000 +0000
@@ -2,3 +2,19 @@ usr/include/${DEB_HOST_MULTIARCH}/qt6/Qt
 usr/include/${DEB_HOST_MULTIARCH}/qt6/QtGraphsWidgets/6.*/QtGraphsWidgets/private/*.h
 usr/lib/${DEB_HOST_MULTIARCH}/qt6/mkspecs/modules/qt_lib_graphs_private.pri
 usr/lib/${DEB_HOST_MULTIARCH}/qt6/mkspecs/modules/qt_lib_graphswidgets_private.pri
+usr/lib/${DEB_HOST_MULTIARCH}/cmake/Qt6GraphsPrivate/Qt6GraphsPrivateAdditionalTargetInfo.cmake
+usr/lib/${DEB_HOST_MULTIARCH}/cmake/Qt6GraphsPrivate/Qt6GraphsPrivateConfig.cmake
+usr/lib/${DEB_HOST_MULTIARCH}/cmake/Qt6GraphsPrivate/Qt6GraphsPrivateConfigVersion.cmake
+usr/lib/${DEB_HOST_MULTIARCH}/cmake/Qt6GraphsPrivate/Qt6GraphsPrivateConfigVersionImpl.cmake
+usr/lib/${DEB_HOST_MULTIARCH}/cmake/Qt6GraphsPrivate/Qt6GraphsPrivateDependencies.cmake
+usr/lib/${DEB_HOST_MULTIARCH}/cmake/Qt6GraphsPrivate/Qt6GraphsPrivateTargets.cmake
+usr/lib/${DEB_HOST_MULTIARCH}/cmake/Qt6GraphsPrivate/Qt6GraphsPrivateVersionlessAliasTargets.cmake
+usr/lib/${DEB_HOST_MULTIARCH}/cmake/Qt6GraphsPrivate/Qt6GraphsPrivateVersionlessTargets.cmake
+usr/lib/${DEB_HOST_MULTIARCH}/cmake/Qt6GraphsWidgetsPrivate/Qt6GraphsWidgetsPrivateAdditionalTargetInfo.cmake
+usr/lib/${DEB_HOST_MULTIARCH}/cmake/Qt6GraphsWidgetsPrivate/Qt6GraphsWidgetsPrivateConfig.cmake
+usr/lib/${DEB_HOST_MULTIARCH}/cmake/Qt6GraphsWidgetsPrivate/Qt6GraphsWidgetsPrivateConfigVersion.cmake
+usr/lib/${DEB_HOST_MULTIARCH}/cmake/Qt6GraphsWidgetsPrivate/Qt6GraphsWidgetsPrivateConfigVersionImpl.cmake
+usr/lib/${DEB_HOST_MULTIARCH}/cmake/Qt6GraphsWidgetsPrivate/Qt6GraphsWidgetsPrivateDependencies.cmake
+usr/lib/${DEB_HOST_MULTIARCH}/cmake/Qt6GraphsWidgetsPrivate/Qt6GraphsWidgetsPrivateTargets.cmake
+usr/lib/${DEB_HOST_MULTIARCH}/cmake/Qt6GraphsWidgetsPrivate/Qt6GraphsWidgetsPrivateVersionlessAliasTargets.cmake
+usr/lib/${DEB_HOST_MULTIARCH}/cmake/Qt6GraphsWidgetsPrivate/Qt6GraphsWidgetsPrivateVersionlessTargets.cmake
diff -pruN 6.8.2-4/debian/qt6-graphs-dev.install 6.9.1-1/debian/qt6-graphs-dev.install
--- 6.8.2-4/debian/qt6-graphs-dev.install	2025-03-01 11:36:24.000000000 +0000
+++ 6.9.1-1/debian/qt6-graphs-dev.install	2025-08-01 11:04:08.000000000 +0000
@@ -34,6 +34,7 @@ usr/include/${DEB_HOST_MULTIARCH}/qt6/Qt
 usr/include/${DEB_HOST_MULTIARCH}/qt6/QtGraphs/QScatterDataItem
 usr/include/${DEB_HOST_MULTIARCH}/qt6/QtGraphs/QScatterDataProxy
 usr/include/${DEB_HOST_MULTIARCH}/qt6/QtGraphs/QScatterSeries
+usr/include/${DEB_HOST_MULTIARCH}/qt6/QtGraphs/QSpline3DSeries
 usr/include/${DEB_HOST_MULTIARCH}/qt6/QtGraphs/QSplineSeries
 usr/include/${DEB_HOST_MULTIARCH}/qt6/QtGraphs/QSurface3DSeries
 usr/include/${DEB_HOST_MULTIARCH}/qt6/QtGraphs/QSurfaceDataItem
@@ -81,6 +82,7 @@ usr/include/${DEB_HOST_MULTIARCH}/qt6/Qt
 usr/include/${DEB_HOST_MULTIARCH}/qt6/QtGraphs/qscatterdataitem.h
 usr/include/${DEB_HOST_MULTIARCH}/qt6/QtGraphs/qscatterdataproxy.h
 usr/include/${DEB_HOST_MULTIARCH}/qt6/QtGraphs/qscatterseries.h
+usr/include/${DEB_HOST_MULTIARCH}/qt6/QtGraphs/qspline3dseries.h
 usr/include/${DEB_HOST_MULTIARCH}/qt6/QtGraphs/qsplineseries.h
 usr/include/${DEB_HOST_MULTIARCH}/qt6/QtGraphs/qsurface3dseries.h
 usr/include/${DEB_HOST_MULTIARCH}/qt6/QtGraphs/qsurfacedataitem.h
diff -pruN 6.8.2-4/debian/qt6-graphs-examples.install 6.9.1-1/debian/qt6-graphs-examples.install
--- 6.8.2-4/debian/qt6-graphs-examples.install	2025-03-01 11:36:24.000000000 +0000
+++ 6.9.1-1/debian/qt6-graphs-examples.install	2025-08-01 11:03:37.000000000 +0000
@@ -1,6 +1,7 @@
 usr/lib/${DEB_HOST_MULTIARCH}/qt6/examples/graphs/2d/cockpit/cockpit
-usr/lib/${DEB_HOST_MULTIARCH}/qt6/examples/graphs/2d/cockpit/lib/${DEB_HOST_MULTIARCH}/qt6/examples/graphprinting
 usr/lib/${DEB_HOST_MULTIARCH}/qt6/examples/graphs/2d/hellographs/hellographs
+usr/lib/${DEB_HOST_MULTIARCH}/qt6/examples/graphs/2d/quickwidgetgraphs/lib/${DEB_HOST_MULTIARCH}/qt6/examples/graphprinting
+usr/lib/${DEB_HOST_MULTIARCH}/qt6/examples/graphs/2d/quickwidgetgraphs/quickwidgetgraphs
 usr/lib/${DEB_HOST_MULTIARCH}/qt6/examples/graphs/3d/axishandling/axishandling
 usr/lib/${DEB_HOST_MULTIARCH}/qt6/examples/graphs/3d/bars/bars
 usr/lib/${DEB_HOST_MULTIARCH}/qt6/examples/graphs/3d/equation/equation
diff -pruN 6.8.2-4/dependencies.yaml 6.9.1-1/dependencies.yaml
--- 6.8.2-4/dependencies.yaml	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/dependencies.yaml	2025-05-29 02:19:47.000000000 +0000
@@ -1,10 +1,10 @@
 dependencies:
   ../qtbase:
-    ref: f1136de66638060b8a1ab9bc0cdf1a91dcb5ec01
+    ref: 2ad23cd72d5f122f88ce95792a4323d639c27d25
     required: true
   ../qtdeclarative:
-    ref: 75534f3e7fff24ed7ccb364e2ed9950a73da879f
+    ref: 1e6adc3d5f1f4cbbb77b41911395782dff43cccd
     required: true
   ../qtquick3d:
-    ref: 54c6b395d954b05c36863433a76ac861e8820479
+    ref: 9dbdffb662559841b284df117c6360b0e8e587c8
     required: true
diff -pruN 6.8.2-4/examples/graphs/2d/CMakeLists.txt 6.9.1-1/examples/graphs/2d/CMakeLists.txt
--- 6.8.2-4/examples/graphs/2d/CMakeLists.txt	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/examples/graphs/2d/CMakeLists.txt	2025-05-29 02:19:47.000000000 +0000
@@ -2,6 +2,15 @@
 # SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
 
 if(TARGET Qt::Quick)
-    qt_internal_add_example(hellographs)
-    qt_internal_add_example(cockpit)
+    if(QT_FEATURE_graphs_2d_bar AND QT_FEATURE_graphs_2d_line)
+        qt_internal_add_example(hellographs)
+    endif()
+    if(QT_FEATURE_graphs_2d_area AND QT_FEATURE_graphs_2d_bar AND QT_FEATURE_graphs_2d_donut_pie AND QT_FEATURE_graphs_2d_line AND QT_FEATURE_graphs_2d_scatter AND QT_FEATURE_graphs_2d_spline)
+        qt_internal_add_example(cockpit)
+    endif()
+endif()
+if(NOT ANDROID AND NOT IOS AND NOT WINRT)
+    if(QT_FEATURE_graphs_2d_donut_pie)
+        qt_internal_add_example(quickwidgetgraphs)
+    endif()
 endif()
diff -pruN 6.8.2-4/examples/graphs/2d/quickwidgetgraphs/CMakeLists.txt 6.9.1-1/examples/graphs/2d/quickwidgetgraphs/CMakeLists.txt
--- 6.8.2-4/examples/graphs/2d/quickwidgetgraphs/CMakeLists.txt	1970-01-01 00:00:00.000000000 +0000
+++ 6.9.1-1/examples/graphs/2d/quickwidgetgraphs/CMakeLists.txt	2025-05-29 02:19:47.000000000 +0000
@@ -0,0 +1,57 @@
+# Copyright (C) 2024 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+cmake_minimum_required(VERSION 3.16)
+project(quickwidgetgraphs LANGUAGES CXX)
+
+set(CMAKE_INCLUDE_CURRENT_DIR ON)
+
+set(CMAKE_AUTOMOC ON)
+set(CMAKE_AUTORCC ON)
+set(CMAKE_AUTOUIC ON)
+
+if(NOT DEFINED INSTALL_EXAMPLESDIR)
+    set(INSTALL_EXAMPLESDIR "examples")
+endif()
+
+set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}")
+
+find_package(Qt6 COMPONENTS Core)
+find_package(Qt6 COMPONENTS Gui)
+find_package(Qt6 COMPONENTS Quick)
+find_package(Qt6 COMPONENTS Graphs)
+find_package(Qt6 COMPONENTS QuickWidgets)
+find_package(Qt6 COMPONENTS Widgets)
+
+qt_add_executable(quickwidgetgraphs
+    main.cpp
+    piewidget.h piewidget.cpp
+    piegraph.h piegraph.cpp
+)
+
+set_target_properties(quickwidgetgraphs PROPERTIES
+    WIN32_EXECUTABLE TRUE
+    MACOSX_BUNDLE TRUE
+)
+
+target_link_libraries(quickwidgetgraphs PUBLIC
+    Qt::Core
+    Qt::Gui
+    Qt::Quick
+    Qt::Graphs
+    Qt::QuickWidgets
+    Qt::Widgets
+)
+
+qt6_add_qml_module(quickwidgetgraphs
+    URI QuickWidgetExample
+    NO_RESOURCE_TARGET_PATH
+    QML_FILES
+        qml/quickwidgetgraphs/main.qml
+)
+
+install(TARGETS quickwidgetgraphs
+    RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}"
+    BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}"
+    LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}"
+)
Binary files 6.8.2-4/examples/graphs/2d/quickwidgetgraphs/doc/images/quickwidgetgraphs-example.png and 6.9.1-1/examples/graphs/2d/quickwidgetgraphs/doc/images/quickwidgetgraphs-example.png differ
diff -pruN 6.8.2-4/examples/graphs/2d/quickwidgetgraphs/doc/src/quickwidgetgraphs.qdoc 6.9.1-1/examples/graphs/2d/quickwidgetgraphs/doc/src/quickwidgetgraphs.qdoc
--- 6.8.2-4/examples/graphs/2d/quickwidgetgraphs/doc/src/quickwidgetgraphs.qdoc	1970-01-01 00:00:00.000000000 +0000
+++ 6.9.1-1/examples/graphs/2d/quickwidgetgraphs/doc/src/quickwidgetgraphs.qdoc	2025-05-29 02:19:47.000000000 +0000
@@ -0,0 +1,103 @@
+// Copyright (C) 2024 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
+
+/*!
+    \example 2d/quickwidgetgraphs
+    \meta tags {Graphs, PieSeries, Widget, QuickWidget}
+    \examplecategory {Data Visualization}
+
+    \title Graphs 2D in Qt Widgets
+    \ingroup qtgraphs_examples
+    \brief Using Graphs for 2D in a Widget based application.
+
+    Graphs 2D support only Qt Quick applications. This example shows how to
+    display a simple 2D pie graph in a Qt Widgets applications using a
+    \l QQuickWidget.
+
+    \image quickwidgetgraphs-example.png
+
+    \include examples-run.qdocinc
+
+    \section1 Main View
+
+    \list 0
+    \li The \c PieWidget class implements the main view of the demo application.
+        In the \c PieWidget class, instantiate the widgets used to implement the
+        application layout and UI elements.
+
+        \snippet 2d/quickwidgetgraphs/piewidget.cpp 0
+        \dots
+
+    \li The \c PieGraph class is used to handle logic for adding and removing
+        slices, and have other functionalities.
+
+        \snippet 2d/quickwidgetgraphs/piewidget.cpp 1
+        \dots
+
+    \li For \l QQuickWidget, set \l{QQuickWidget::}{source} and
+        \l{QQuickWidget::}{resizeMode}, and set the
+        \c context property. The \c Context property allows data to be exposed
+        to QML components instantiated by the QML engine.
+
+        \snippet 2d/quickwidgetgraphs/piewidget.cpp 2
+
+    \li Initialize buttons and add them to layout.
+
+        \snippet 2d/quickwidgetgraphs/piewidget.cpp 3
+        \dots
+    \endlist
+
+    \section1 Manipulating Graph data
+
+    The \c PieGraph class implements all the logic for manipulating Graph data in
+    this example.
+
+    \list 0
+    \li In the \c PieGraph class, declare a \c pieSeries property.
+
+        \dots
+        \snippet 2d/quickwidgetgraphs/piegraph.h 0
+        \dots
+
+    \li Create functions for adding, removing, exploding slices, and clearing
+        pie series.
+
+        \dots
+        \snippet 2d/quickwidgetgraphs/piegraph.h 1
+        \dots
+
+    \li Instantiate a pie series and add several slices in your constructor.
+
+        \dots
+        \snippet 2d/quickwidgetgraphs/piegraph.cpp 0
+        \dots
+
+    \li The \c appendSlice function creates a \l QPieSlice, sets some of its
+        properties and then appends it to the pie series.
+
+        Notice that even if you have set labels visibility to \c true, this does
+        not work on slices added later to the pie series. You need to set
+        visibility to \c true on creation for every added slice.
+
+        \snippet 2d/quickwidgetgraphs/piegraph.cpp 1
+
+    \li In the \c removeSlice function, call \l QPieSeries::remove().
+
+    \li In the \c explodeSlices function, loop through all slices and set
+        \l QPieSlice::setExploded() to \c true or \c false depending on current
+        state.
+
+    \li In the \c clearSeries function, call \l QPieSeries::clear(). This will
+        delete all slices from your pie series. Note that this function does not
+        delete a pie series itself.
+    \endlist
+
+    \section1 Declare a GraphView in Qml
+
+    Declare a \l GraphsView element and set the \l {GraphsView::}{seriesList}
+    property to a pie series created in C++ code.
+
+    To customize the GraphsView theme, set a custom \l GraphsTheme.
+
+    \snippet 2d/quickwidgetgraphs/qml/quickwidgetgraphs/main.qml 0
+*/
diff -pruN 6.8.2-4/examples/graphs/2d/quickwidgetgraphs/main.cpp 6.9.1-1/examples/graphs/2d/quickwidgetgraphs/main.cpp
--- 6.8.2-4/examples/graphs/2d/quickwidgetgraphs/main.cpp	1970-01-01 00:00:00.000000000 +0000
+++ 6.9.1-1/examples/graphs/2d/quickwidgetgraphs/main.cpp	2025-05-29 02:19:47.000000000 +0000
@@ -0,0 +1,16 @@
+// Copyright (C) 2024 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+#include <QApplication>
+#include <QtQml/qqmlengine.h>
+
+#include "piewidget.h"
+
+int main(int argc, char *argv[])
+{
+    QApplication app(argc, argv);
+    PieWidget graph;
+    graph.containerWidget()->show();
+
+    return app.exec();
+}
diff -pruN 6.8.2-4/examples/graphs/2d/quickwidgetgraphs/piegraph.cpp 6.9.1-1/examples/graphs/2d/quickwidgetgraphs/piegraph.cpp
--- 6.8.2-4/examples/graphs/2d/quickwidgetgraphs/piegraph.cpp	1970-01-01 00:00:00.000000000 +0000
+++ 6.9.1-1/examples/graphs/2d/quickwidgetgraphs/piegraph.cpp	2025-05-29 02:19:47.000000000 +0000
@@ -0,0 +1,122 @@
+// Copyright (C) 2024 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+#include "piegraph.h"
+#include <QRandomGenerator>
+
+PieGraph::PieGraph(QObject *parent)
+{
+    Q_UNUSED(parent)
+    //! [0]
+    m_pieSeries = new QPieSeries;
+
+    fillSliceInfo();
+
+    for (int i = 1; i < 5; ++i) {
+        QPieSlice *slice = new QPieSlice;
+        slice->setValue(m_sliceInfo.value.at(QRandomGenerator::global()->bounded(0, 6)));
+        slice->setLabel(m_sliceInfo.label.at(QRandomGenerator::global()->bounded(0, 6)));
+        slice->setLabelColor(m_sliceInfo.color.at(QRandomGenerator::global()->bounded(0, 6)));
+        m_pieSeries->append(slice);
+    }
+    m_pieSeries->setLabelsVisible(true);
+    //! [0]
+}
+
+PieGraph::~PieGraph()
+{
+    delete m_pieSeries;
+}
+
+QPieSeries *PieGraph::pieSeries() const
+{
+    return m_pieSeries;
+}
+
+void PieGraph::appendSlice()
+{
+    //! [1]
+    QPieSlice *slice = new QPieSlice;
+    slice->setValue(m_sliceInfo.value.at(QRandomGenerator::global()->bounded(0, 6)));
+    slice->setLabel(m_sliceInfo.label.at(QRandomGenerator::global()->bounded(0, 6)));
+    slice->setLabelColor(m_sliceInfo.color.at(QRandomGenerator::global()->bounded(0, 6)));
+    slice->setLabelVisible(true);
+    m_pieSeries->append(slice);
+    //! [1]
+}
+
+void PieGraph::removeSlice()
+{
+    m_pieSeries->remove(m_pieSeries->count() - 1);
+}
+
+void PieGraph::explodeSlices()
+{
+    for (auto slice: m_pieSeries->slices()) {
+        if (slice->isExploded())
+            slice->setExploded(false);
+        else
+            slice->setExploded(true);
+    }
+}
+
+void PieGraph::clearSeries()
+{
+    m_pieSeries->clear();
+}
+
+void PieGraph::fillSliceInfo()
+{
+    m_sliceInfo.value = {
+        10,
+        15,
+        20,
+        25,
+        30,
+        35
+    };
+    m_sliceInfo.label = {
+        "Strawberry",
+        "Blueberry",
+        "Raspberry",
+        "Grape",
+        "Banana",
+        "Melon"
+    };
+    m_sliceInfo.color = {
+        "white",
+        "red",
+        "green",
+        "blue",
+        "grey",
+        "yellow"
+    };
+}
+
+void PieGraph::onAddSlice()
+{
+    appendSlice();
+}
+
+void PieGraph::onRemoveSlice()
+{
+    removeSlice();
+}
+
+void PieGraph::onExplode()
+{
+    explodeSlices();
+}
+
+void PieGraph::onClearSeries()
+{
+    clearSeries();
+}
+
+void PieGraph::setPieSeries(QPieSeries *series)
+{
+    if (m_pieSeries != series) {
+        m_pieSeries = series;
+        emit pieSeriesChanged();
+    }
+}
diff -pruN 6.8.2-4/examples/graphs/2d/quickwidgetgraphs/piegraph.h 6.9.1-1/examples/graphs/2d/quickwidgetgraphs/piegraph.h
--- 6.8.2-4/examples/graphs/2d/quickwidgetgraphs/piegraph.h	1970-01-01 00:00:00.000000000 +0000
+++ 6.9.1-1/examples/graphs/2d/quickwidgetgraphs/piegraph.h	2025-05-29 02:19:47.000000000 +0000
@@ -0,0 +1,48 @@
+// Copyright (C) 2024 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+#ifndef PIEGRAPH_H
+#define PIEGRAPH_H
+
+#include <QObject>
+#include <QPieSeries>
+#include <QPieSlice>
+
+class PieGraph : public QObject
+{
+    Q_OBJECT
+    //! [0]
+    Q_PROPERTY(QPieSeries *pieSeries READ pieSeries WRITE setPieSeries NOTIFY pieSeriesChanged FINAL)
+    //! [0]
+public:
+    explicit PieGraph(QObject *parent = nullptr);
+    ~PieGraph();
+
+    QPieSeries *pieSeries() const;
+    void setPieSeries(QPieSeries *series);
+    //! [1]
+    void appendSlice();
+    void removeSlice();
+    void explodeSlices();
+    void clearSeries();
+    void fillSliceInfo();
+public Q_SLOTS:
+    void onAddSlice();
+    void onRemoveSlice();
+    void onExplode();
+    void onClearSeries();
+    //! [1]
+Q_SIGNALS:
+    void pieSeriesChanged();
+private:
+    QPieSeries *m_pieSeries;
+
+    struct SliceInfo
+    {
+        QList<int> value;
+        QList<QColor> color;
+        QList<QString> label;
+    } m_sliceInfo;
+};
+
+#endif // PIEGRAPH_H
diff -pruN 6.8.2-4/examples/graphs/2d/quickwidgetgraphs/piewidget.cpp 6.9.1-1/examples/graphs/2d/quickwidgetgraphs/piewidget.cpp
--- 6.8.2-4/examples/graphs/2d/quickwidgetgraphs/piewidget.cpp	1970-01-01 00:00:00.000000000 +0000
+++ 6.9.1-1/examples/graphs/2d/quickwidgetgraphs/piewidget.cpp	2025-05-29 02:19:47.000000000 +0000
@@ -0,0 +1,77 @@
+// Copyright (C) 2024 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+#include "piewidget.h"
+#include "piegraph.h"
+
+PieWidget::PieWidget(QWidget *parent)
+{
+    Q_UNUSED(parent)
+    //! [1]
+    m_pieGraph = new PieGraph;
+    //! [1]
+    //! [0]
+    m_quickWidget = new QQuickWidget;
+    m_widget = new QWidget;
+    m_vLayout = new QVBoxLayout(m_widget);
+    m_hLayout = new QHBoxLayout;
+    //! [0]
+    initializeQuickWidget();
+    initializeButtons();
+
+    //! [4]
+    m_vLayout->addLayout(m_hLayout);
+    m_vLayout->addWidget(m_quickWidget, 1);
+    //! [4]
+}
+
+PieWidget::~PieWidget()
+{
+    delete m_quickWidget;
+    delete m_hLayout;
+    delete m_vLayout;
+    delete m_widget;
+    delete m_pieGraph;
+}
+
+    //! [3]
+void PieWidget::initializeButtons()
+{
+    QPushButton *addButton = new QPushButton("Add Slice");
+    QPushButton *removeButton = new QPushButton("Remove Slice");
+    QPushButton *explodeButton = new QPushButton("Explode All");
+    QPushButton *clearButton = new QPushButton("Clear Series");
+
+    m_hLayout->addWidget(addButton);
+    m_hLayout->addWidget(removeButton);
+    m_hLayout->addWidget(explodeButton);
+    m_hLayout->addWidget(clearButton);
+
+    QObject::connect(addButton, &QPushButton::clicked, m_pieGraph, &PieGraph::onAddSlice);
+    QObject::connect(removeButton, &QPushButton::clicked, m_pieGraph, &PieGraph::onRemoveSlice);
+    QObject::connect(explodeButton, &QPushButton::clicked, m_pieGraph, &PieGraph::onExplode);
+    QObject::connect(clearButton, &QPushButton::clicked, m_pieGraph, &PieGraph::onClearSeries);
+    //! [3]
+}
+
+void PieWidget::initializeQuickWidget()
+{
+#ifdef Q_OS_WIN
+    QString extraImportPath(QStringLiteral("%1/../../../../%2"));
+#else
+    QString extraImportPath(QStringLiteral("%1/../../../%2"));
+#endif
+    m_quickWidget->engine()->addImportPath(
+        extraImportPath.arg(QGuiApplication::applicationDirPath(), QString::fromLatin1("qml")));
+    //! [2]
+    QQmlContext *context = m_quickWidget->engine()->rootContext();
+    context->setContextProperty("pieGraph", m_pieGraph);
+    m_quickWidget->setSource(QUrl("qrc:/qml/quickwidgetgraphs/main.qml"));
+    m_quickWidget->setResizeMode(QQuickWidget::SizeRootObjectToView);
+    //! [2]
+}
+
+QWidget *PieWidget::containerWidget() const
+{
+    return m_widget;
+}
diff -pruN 6.8.2-4/examples/graphs/2d/quickwidgetgraphs/piewidget.h 6.9.1-1/examples/graphs/2d/quickwidgetgraphs/piewidget.h
--- 6.8.2-4/examples/graphs/2d/quickwidgetgraphs/piewidget.h	1970-01-01 00:00:00.000000000 +0000
+++ 6.9.1-1/examples/graphs/2d/quickwidgetgraphs/piewidget.h	2025-05-29 02:19:47.000000000 +0000
@@ -0,0 +1,35 @@
+// Copyright (C) 2024 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+#ifndef PIEWIDGET_H
+#define PIEWIDGET_H
+
+#include <QWidget>
+#include <QQuickWidget>
+#include <QHBoxLayout>
+#include <QPushButton>
+#include <QQmlContext>
+
+class PieGraph;
+
+class PieWidget : public QWidget
+{
+    Q_OBJECT
+public:
+    explicit PieWidget(QWidget *parent = nullptr);
+    ~PieWidget();
+
+    void initializeButtons();
+    void initializeQuickWidget();
+
+    QWidget *containerWidget() const;
+private:
+    QWidget *m_widget;
+    QQuickWidget *m_quickWidget;
+    QVBoxLayout *m_vLayout;
+    QHBoxLayout *m_hLayout;
+
+    PieGraph *m_pieGraph;
+};
+
+#endif // PIEWIDGET_H
diff -pruN 6.8.2-4/examples/graphs/2d/quickwidgetgraphs/qml/quickwidgetgraphs/main.qml 6.9.1-1/examples/graphs/2d/quickwidgetgraphs/qml/quickwidgetgraphs/main.qml
--- 6.8.2-4/examples/graphs/2d/quickwidgetgraphs/qml/quickwidgetgraphs/main.qml	1970-01-01 00:00:00.000000000 +0000
+++ 6.9.1-1/examples/graphs/2d/quickwidgetgraphs/qml/quickwidgetgraphs/main.qml	2025-05-29 02:19:47.000000000 +0000
@@ -0,0 +1,27 @@
+// Copyright (C) 2024 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+import QtQuick
+import QtGraphs
+
+//! [0]
+Item {
+    id: mainView
+    width: 1280
+    height: 720
+
+    GraphsView {
+        id: graphsView
+        anchors.fill: parent
+
+        theme: GraphsTheme {
+            id: graphsTheme
+            theme: GraphsTheme.Theme.BlueSeries
+            labelBorderVisible: true
+            labelBackgroundVisible: true
+            backgroundColor: "black"
+        }
+        seriesList: pieGraph.pieSeries
+    }
+}
+//! [0]
diff -pruN 6.8.2-4/examples/graphs/2d/quickwidgetgraphs/quickwidgetgraphs.pro 6.9.1-1/examples/graphs/2d/quickwidgetgraphs/quickwidgetgraphs.pro
--- 6.8.2-4/examples/graphs/2d/quickwidgetgraphs/quickwidgetgraphs.pro	1970-01-01 00:00:00.000000000 +0000
+++ 6.9.1-1/examples/graphs/2d/quickwidgetgraphs/quickwidgetgraphs.pro	2025-05-29 02:19:47.000000000 +0000
@@ -0,0 +1,18 @@
+!include( ../examples.pri ) {
+    error( "Couldn't find the examples.pri file!" )
+}
+
+QT += widgets \
+    quickwidgets
+
+SOURCES += main.cpp \
+    piegraph.cpp \
+    piewidget.cpp
+
+HEADERS += piegraph.h \
+    piewidget.h
+
+OTHER_FILES += doc/src/* \
+    doc/images/* \
+    qml/quickwidgetgraphs/*
+
diff -pruN 6.8.2-4/examples/graphs/3d/surfacegallery/qml/surfacegallery/SurfaceOscilloscope.qml 6.9.1-1/examples/graphs/3d/surfacegallery/qml/surfacegallery/SurfaceOscilloscope.qml
--- 6.8.2-4/examples/graphs/3d/surfacegallery/qml/surfacegallery/SurfaceOscilloscope.qml	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/examples/graphs/3d/surfacegallery/qml/surfacegallery/SurfaceOscilloscope.qml	2025-05-29 02:19:47.000000000 +0000
@@ -2,7 +2,7 @@
 // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
 
 import QtQuick
-import QtQuick.Controls
+import QtQuick.Controls.Basic
 import QtGraphs
 //! [0]
 import SurfaceGalleryExample
@@ -82,7 +82,8 @@ Item {
                         x: sampleSlider.leftPadding
                         y: sampleSlider.topPadding + sampleSlider.availableHeight / 2
                            - height / 2
-                        implicitWidth: 200
+                        implicitWidth: samples.width > 300 ? 200 : samples.width
+                                        - samplesText.width - 20
                         implicitHeight: 4
                         width: sampleSlider.availableWidth
                         height: implicitHeight
@@ -154,7 +155,8 @@ Item {
                         x: frequencySlider.leftPadding
                         y: frequencySlider.topPadding + frequencySlider.availableHeight / 2
                            - height / 2
-                        implicitWidth: 200
+                        implicitWidth: frequency.width > 300 ? 200 : frequency.width
+                                        - frequencyText.width - 20
                         implicitHeight: 4
                         width: frequencySlider.availableWidth
                         height: implicitHeight
diff -pruN 6.8.2-4/examples/graphs/3d/widgetgraphgallery/rainfalldata.cpp 6.9.1-1/examples/graphs/3d/widgetgraphgallery/rainfalldata.cpp
--- 6.8.2-4/examples/graphs/3d/widgetgraphgallery/rainfalldata.cpp	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/examples/graphs/3d/widgetgraphgallery/rainfalldata.cpp	2025-05-29 02:19:47.000000000 +0000
@@ -1,5 +1,6 @@
 // Copyright (C) 2023 The Qt Company Ltd.
 // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+// Qt-Security score:critical reason:data-parser
 
 #include "rainfalldata.h"
 #include <QtCore/qfile.h>
diff -pruN 6.8.2-4/examples/graphs/3d/widgetgraphgallery/surfacegraphmodifier.cpp 6.9.1-1/examples/graphs/3d/widgetgraphgallery/surfacegraphmodifier.cpp
--- 6.8.2-4/examples/graphs/3d/widgetgraphgallery/surfacegraphmodifier.cpp	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/examples/graphs/3d/widgetgraphgallery/surfacegraphmodifier.cpp	2025-05-29 02:19:47.000000000 +0000
@@ -499,7 +499,7 @@ void SurfaceGraphModifier::toggleItemOne
         //! [11]
         auto *item = new QCustom3DItem(":/data/oilrig.mesh",
                                        positionOne,
-                                       QVector3D(0.025f, 0.025f, 0.025f),
+                                       QVector3D(0.0125f, 0.0125f, 0.0125f),
                                        QQuaternion::fromAxisAndAngle(0.f, 1.f, 0.f, 45.f),
                                        color);
         //! [11]
@@ -508,7 +508,7 @@ void SurfaceGraphModifier::toggleItemOne
         //! [12]
         item = new QCustom3DItem(":/data/pipe.mesh",
                                  positionOnePipe,
-                                 QVector3D(0.005f, 0.5f, 0.005f),
+                                 QVector3D(0.0025f, 0.25f, 0.0025f),
                                  QQuaternion(),
                                  color);
         item->setShadowCasting(false);
@@ -542,13 +542,13 @@ void SurfaceGraphModifier::toggleItemTwo
         auto *item = new QCustom3DItem();
         item->setMeshFile(":/data/oilrig.mesh");
         item->setPosition(positionTwo);
-        item->setScaling(QVector3D(0.025f, 0.025f, 0.025f));
+        item->setScaling(QVector3D(0.0125f, 0.0125f, 0.0125f));
         item->setRotation(QQuaternion::fromAxisAndAngle(0.f, 1.f, 0.f, 25.f));
         item->setTextureImage(color);
         m_graph->addCustomItem(item);
         item = new QCustom3DItem(":/data/pipe.mesh",
                                  positionTwoPipe,
-                                 QVector3D(0.005f, 0.5f, 0.005f),
+                                 QVector3D(0.0025f, 0.25f, 0.0025f),
                                  QQuaternion(),
                                  color);
         item->setShadowCasting(false);
@@ -577,7 +577,7 @@ void SurfaceGraphModifier::toggleItemThr
         auto *item = new QCustom3DItem();
         item->setMeshFile(":/data/refinery.mesh");
         item->setPosition(positionThree);
-        item->setScaling(QVector3D(0.04f, 0.04f, 0.04f));
+        item->setScaling(QVector3D(0.02f, 0.02f, 0.02f));
         item->setRotation(QQuaternion::fromAxisAndAngle(0.f, 1.f, 0.f, 75.f));
         item->setTextureImage(color);
         m_graph->addCustomItem(item);
diff -pruN 6.8.2-4/examples/graphs/graphprinting/CMakeLists.txt 6.9.1-1/examples/graphs/graphprinting/CMakeLists.txt
--- 6.8.2-4/examples/graphs/graphprinting/CMakeLists.txt	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/examples/graphs/graphprinting/CMakeLists.txt	2025-05-29 02:19:47.000000000 +0000
@@ -40,6 +40,7 @@ target_link_libraries(graphprinting PRIV
     Qt::Quick3D
     Qt::Graphs
     Qt::PrintSupport
+    Qt::GuiPrivate
 )
 
 qt6_add_qml_module(graphprinting
diff -pruN 6.8.2-4/examples/graphs/graphprinting/graphprinter.cpp 6.9.1-1/examples/graphs/graphprinting/graphprinter.cpp
--- 6.8.2-4/examples/graphs/graphprinting/graphprinter.cpp	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/examples/graphs/graphprinting/graphprinter.cpp	2025-05-29 02:19:47.000000000 +0000
@@ -1,8 +1,13 @@
 // Copyright (C) 2024 The Qt Company Ltd.
 // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
 #include "graphprinter.h"
+#include <QtGui/qtguiglobal.h>
 #include <QtGui/qtransform.h>
 #include <QtPrintSupport/QtPrintSupport>
+#if QT_CONFIG(opengl)
+#include <QtGui/qoffscreensurface.h>
+#endif
+#include <rhi/qrhi.h>
 
 GraphPrinter::GraphPrinter(QObject *parent)
     : QObject(parent)
@@ -10,6 +15,45 @@ GraphPrinter::GraphPrinter(QObject *pare
 
 GraphPrinter::~GraphPrinter() {}
 
+static qreal s_maxTextureSize = 0.;
+
+qreal GraphPrinter::maxTextureSize()
+{
+    // Query maximum texture size only once
+    if (!s_maxTextureSize) {
+        std::unique_ptr<QRhi> rhi;
+#if defined(Q_OS_WIN)
+        QRhiD3D12InitParams params;
+        rhi.reset(QRhi::create(QRhi::D3D12, &params));
+#elif defined(Q_OS_MACOS) || defined(Q_OS_IOS)
+        QRhiMetalInitParams params;
+        rhi.reset(QRhi::create(QRhi::Metal, &params));
+#elif QT_CONFIG(opengl)
+        QRhiGles2InitParams params;
+        params.fallbackSurface = QRhiGles2InitParams::newFallbackSurface();
+        rhi.reset(QRhi::create(QRhi::OpenGLES2, &params));
+#elif QT_CONFIG(vulkan)
+        if (!qEnvironmentVariable("QSG_RHI_BACKEND").compare("vulkan")) {
+            QVulkanInstance inst;
+            inst.setExtensions(QRhiVulkanInitParams::preferredInstanceExtensions());
+            if (inst.create()) {
+                QRhiVulkanInitParams params;
+                params.inst = &inst;
+                rhi.reset(QRhi::create(QRhi::Vulkan, &params));
+            } else {
+                qWarning("Failed to create Vulkan instance");
+            }
+        }
+#endif
+        if (rhi)
+            s_maxTextureSize = qreal(rhi->resourceLimit(QRhi::TextureSizeMax));
+        else
+            s_maxTextureSize = 4096.; // Use 4096 as the minimum
+    }
+
+    return s_maxTextureSize;
+}
+
 QString GraphPrinter::generatePDF(const QUrl &path, const QImage &image)
 {
     //! [0]
diff -pruN 6.8.2-4/examples/graphs/graphprinting/graphprinter.h 6.9.1-1/examples/graphs/graphprinting/graphprinter.h
--- 6.8.2-4/examples/graphs/graphprinting/graphprinter.h	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/examples/graphs/graphprinting/graphprinter.h	2025-05-29 02:19:47.000000000 +0000
@@ -19,6 +19,7 @@ public:
   Q_INVOKABLE QString generatePDF(const QUrl &path, const QImage &image);
   Q_INVOKABLE QString print(const QImage &image, const QString printerName);
   Q_INVOKABLE QStringList getPrinters();
+  Q_INVOKABLE qreal maxTextureSize();
 };
 
 #endif // GRAPHPRINTER_H
diff -pruN 6.8.2-4/examples/graphs/graphprinting/qml/graphprinting/Graph3D.qml 6.9.1-1/examples/graphs/graphprinting/qml/graphprinting/Graph3D.qml
--- 6.8.2-4/examples/graphs/graphprinting/qml/graphprinting/Graph3D.qml	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/examples/graphs/graphprinting/qml/graphprinting/Graph3D.qml	2025-05-29 02:19:47.000000000 +0000
@@ -34,26 +34,24 @@ Item {
             ItemModelBarDataProxy {
                 id: barProxy
                 itemModel: ListModel {
-                    ListElement{ coords: "0,0"; data: "20.0/10.0/4.75"; }
-                    ListElement{ coords: "1,0"; data: "21.1/10.3/3.00"; }
-                    ListElement{ coords: "0,1"; data: "20.2/11.2/3.55"; }
-                    ListElement{ coords: "1,1"; data: "21.3/11.5/3.03"; }
-                    ListElement{ coords: "0,2"; data: "20.2/12.3/3.37"; }
-                    ListElement{ coords: "1,2"; data: "21.1/12.4/2.98"; }
-                    ListElement{ coords: "0,3"; data: "20.7/13.3/5.34"; }
-                    ListElement{ coords: "1,3"; data: "21.5/13.2/4.54"; }
-                    ListElement{ coords: "0,4"; data: "20.6/15.0/6.01"; }
-                    ListElement{ coords: "1,4"; data: "21.3/14.6/5.83"; }
+                    ListElement{ coords: "0,0"; data: "4.75"; }
+                    ListElement{ coords: "1,0"; data: "3.00"; }
+                    ListElement{ coords: "0,1"; data: "3.55"; }
+                    ListElement{ coords: "1,1"; data: "3.03"; }
+                    ListElement{ coords: "0,2"; data: "3.37"; }
+                    ListElement{ coords: "1,2"; data: "2.98"; }
+                    ListElement{ coords: "0,3"; data: "5.34"; }
+                    ListElement{ coords: "1,3"; data: "4.54"; }
+                    ListElement{ coords: "0,4"; data: "6.01"; }
+                    ListElement{ coords: "1,4"; data: "5.83"; }
                 }
                 rowRole: "coords"
                 columnRole: "coords"
                 valueRole: "data"
-                rowRolePattern: /(\d),\d/
+                rowRolePattern: /(\d),(\d)/
                 columnRolePattern: /(\d),(\d)/
-                valueRolePattern: /^([^\/]*)\/([^\/]*)\/(.*)$/
                 rowRoleReplace: "\\1"
                 columnRoleReplace: "\\2"
-                valueRoleReplace: "\\3"
             }
 
             Gradient {
diff -pruN 6.8.2-4/examples/graphs/graphprinting/qml/graphprinting/main.qml 6.9.1-1/examples/graphs/graphprinting/qml/graphprinting/main.qml
--- 6.8.2-4/examples/graphs/graphprinting/qml/graphprinting/main.qml	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/examples/graphs/graphprinting/qml/graphprinting/main.qml	2025-05-29 02:19:47.000000000 +0000
@@ -146,6 +146,8 @@ Rectangle {
     }
     MessageDialog {
         id: message
+        onButtonClicked: mainView.cleanAfterPrint()
+
     }
 
     //! [1.1]
@@ -257,7 +259,20 @@ Rectangle {
     //! [3.3]
     function prepareForPrint() {
         if (stackLayout.currentIndex === 1) {
-            outputsize = Qt.size(bargraph.width * 4, bargraph.height * 4)
+            var newsize = Qt.size(bargraph.width * 4, bargraph.height * 4)
+
+            // check that we do not exceed maximum texture size
+            if (newsize.width * Screen.devicePixelRatio > graphPrinter.maxTextureSize() ) {
+                // scale to 25% under max texture size to be on the safe side; some GPUs seem
+                // to glitch when using the abosulute max
+                var ratio = (newsize.width * Screen.devicePixelRatio * 1.25)
+                        / graphPrinter.maxTextureSize()
+                newsize.width /= ratio
+                newsize.height /= ratio
+            }
+            outputsize.width = Math.round(newsize.width)
+            outputsize.height = Math.round(newsize.height)
+
             // resize the bar graph to match the PDF output size
             item.width = outputsize.width
             item.height = outputsize.height
@@ -269,8 +284,8 @@ Rectangle {
     function cleanAfterPrint() {
         if (stackLayout.currentIndex === 1) {
             // resize the bar graph back to the actual visual size
-            item.width = mainView.width
-            item.height = mainView.height
+            item.width = stackLayout.width
+            item.height = stackLayout.height
         }
     }
     //! [3.3]
diff -pruN 6.8.2-4/licenseRule.json 6.9.1-1/licenseRule.json
--- 6.8.2-4/licenseRule.json	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/licenseRule.json	2025-05-29 02:19:47.000000000 +0000
@@ -1,6 +1,6 @@
 [
     {
-        "comment" : ["file_pattern_ending: strings matched against the end of a file name.",
+        "comment": ["file_pattern_ending: strings matched against the end of a file name.",
                      "location keys: regular expression matched against the beginning of",
                      "the file path (relative to the git submodule root).",
                      "spdx: list of SPDX-License-Expression's allowed in the matching files.",
@@ -9,80 +9,100 @@
                      "unless they are examples",
                      "Files with other endings can also be build system files"
                      ],
-        "file_pattern_ending" : ["CMakeLists.txt", ".cmake", ".pro", ".pri", ".prf",
-                     "configure", "configure.bat", "cmake.in", "plist.in", "CMakeLists.txt.in"],
-        "location" : {
-            "" : {
-                "comment" : "Default",
-                "file type" : "build system",
-                "spdx"      : ["BSD-3-Clause"]
-            },
-            "(.*)(examples/|snippets/)" : {
-                "comment" : "Example takes precedent",
-                "file type" : "examples and snippets",
-                "spdx" : ["LicenseRef-Qt-Commercial OR BSD-3-Clause"]
+        "file_pattern_ending": ["CMakeLists.txt", ".cmake", ".pro", ".pri", ".prf",
+                     "configure", "configure.bat", "cmake.in", "plist.in", "CMakeLists.txt.in",
+                     ".cmake.conf", ".tag", ".yaml",
+                     "ci_config_linux.json", ".qrc", "sync.profile"],
+        "location": {
+            "": {
+                "comment": "Default",
+                "file type": "build system",
+                "spdx": ["BSD-3-Clause"]
+            },
+            "(.*)(examples/|snippets/)": {
+                "comment": "Example takes precedent",
+                "file type": "examples and snippets",
+                "spdx": ["LicenseRef-Qt-Commercial OR BSD-3-Clause"]
             }
         }
     },
     {
-        "comments" : ["Files with the following endings are Tool licensed,",
+        "comments": ["Files with the following endings are infrastructure licensed"],
+        "file_pattern_ending": [".gitattributes", ".gitignore", ".gitmodules", ".gitreview",
+                                "_clang-format", "licenseRule.json", "REUSE.toml"],
+        "location":{
+            "": {
+                "comment": "Default",
+                "file type": "infrastructure",
+                "spdx": ["LicenseRef-Qt-Commercial OR BSD-3-Clause"]
+            }
+        }
+    },
+    {
+        "comments": ["Files with the following endings are Tool licensed,",
                       "unless they are examples.",
                       "Files with other endings can also be tool files."],
-        "file_pattern_ending" : [".sh", ".py", ".pl", ".bat", ".ps1"],
-        "location" :{
-            "" : {
-                "comment" : "Default",
-                "file type" : "tools and utils",
-                "spdx"      : ["LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0"]
-            },
-            "(.*)(examples/|snippets/)" : {
-                "comment" : "Example takes precedent",
-                "file type" : "examples and snippets",
-                "spdx" : ["LicenseRef-Qt-Commercial OR BSD-3-Clause"]
+        "file_pattern_ending": [".sh", ".py", ".pl", ".bat", ".ps1"],
+        "location":{
+            "": {
+                "comment": "Default",
+                "file type": "tools and utils",
+                "spdx": ["LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0"]
+            },
+            "(.*)(examples/|snippets/)": {
+                "comment": "Example takes precedent",
+                "file type": "examples and snippets",
+                "spdx": ["LicenseRef-Qt-Commercial OR BSD-3-Clause"]
             }
         }
     },
     {
-        "comment" : "Files with the following endings are Documentation licensed.",
-        "file_pattern_ending" : [".qdoc", ".qdocinc" , ".qdocconf", ".txt", "README", "qt_attribution.json"],
-        "location" :{
-            "" : {
-                "comment" : "",
-                "file type" : "documentation",
-                "spdx"      : ["LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only"]
+        "comment": "Files with the following endings are Documentation licensed.",
+        "file_pattern_ending": [".qdoc", ".qdocinc" , ".qdocconf", "README", "qt_attribution.json",
+                                 ".metainfo"],
+        "location":{
+            "": {
+                "comment": "",
+                "file type": "documentation",
+                "spdx": ["LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only"]
             }
         }
     },
     {
-        "comment" : ["All other files",
+        "comment": ["All other files",
                      "The licensing is defined only by the file location in the Qt module repository.",
                      "NO <file_pattern_ending> key for this case!",
                      "This needs to be the last entry of the file."],
-        "location" : {
-            "" : {
-                "comment" : "Default",
-                "file type" : "module and plugin",
-                "spdx"      : ["LicenseRef-Qt-Commercial OR GPL-3.0-only"]
-            },
-            "src/" : {
-                "comment" : "Default",
-                "file type" : "module and plugin",
-                "spdx"      : ["LicenseRef-Qt-Commercial OR GPL-3.0-only"]
-            },
-            "tests/" : {
-                "comment" : "Default",
-                "file type" : "test",
-                "spdx" : ["LicenseRef-Qt-Commercial OR GPL-3.0-only"]
-            },
-            "(.*)(examples/|snippets/)" : {
-                "comment" : "Default",
-                "file type" : "examples and snippets",
-                "spdx" : ["LicenseRef-Qt-Commercial OR BSD-3-Clause"]
-            },
-            "tests/auto/cpptest/common/cpptestutil\\.h" : {
-                "comment" : "",
-                "file type" : "util",
-                "spdx" : ["LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0"]
+        "location": {
+            "": {
+                "comment": "Default",
+                "file type": "module and plugin",
+                "spdx": ["LicenseRef-Qt-Commercial OR GPL-3.0-only"]
+            },
+            "src/": {
+                "comment": "Default",
+                "file type": "module and plugin",
+                "spdx": ["LicenseRef-Qt-Commercial OR GPL-3.0-only"]
+            },
+            "tests/": {
+                "comment": "Default",
+                "file type": "test",
+                "spdx": ["LicenseRef-Qt-Commercial OR GPL-3.0-only"]
+            },
+            "(.*)(examples/|snippets/)": {
+                "comment": "Default",
+                "file type": "examples and snippets",
+                "spdx": ["LicenseRef-Qt-Commercial OR BSD-3-Clause"]
+            },
+            "(.*|examples).*/doc/images": {
+                "comment": "Default",
+                "file type": "documentation",
+                "spdx": ["LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only"]
+            },
+            "tests/auto/cpptest/common/cpptestutil\\.h": {
+                "comment": "",
+                "file type": "util",
+                "spdx": ["LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0"]
             }
         }
     }
diff -pruN 6.8.2-4/src/CMakeLists.txt 6.9.1-1/src/CMakeLists.txt
--- 6.8.2-4/src/CMakeLists.txt	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/CMakeLists.txt	2025-05-29 02:19:47.000000000 +0000
@@ -56,6 +56,7 @@ else()
         "graphs3d/qml/resources/SurfaceMaterial.qml"
         "graphs3d/qml/resources/ScatterMaterial.qml"
         "graphs3d/qml/resources/ScatterMaterialInstancing.qml"
+        "graphs3d/qml/resources/SplineMaterial.qml"
         "graphs3d/qml/resources/GridSurfaceMaterial.qml"
         "graphs3d/qml/resources/SurfaceSliceMaterial.qml"
         "graphs3d/qml/resources/SurfaceShadowNoTex.qml"
@@ -144,6 +145,8 @@ else()
         "graphs3d/engine/shaders/scatterinstancing.vert"
         "graphs3d/engine/shaders/scatterinstancing.frag"
         "graphs3d/engine/shaders/surfaceSlice.vert"
+        "graphs3d/engine/shaders/spline.vert"
+        "graphs3d/engine/shaders/spline.frag"
         "graphs3d/engine/shaders/texture3d.frag"
         "graphs3d/engine/shaders/texture3d.vert"
         "graphs3d/engine/shaders/texture3dlowdef.frag"
diff -pruN 6.8.2-4/src/common/global/qgraphsglobal.h 6.9.1-1/src/common/global/qgraphsglobal.h
--- 6.8.2-4/src/common/global/qgraphsglobal.h	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/common/global/qgraphsglobal.h	2025-05-29 02:19:47.000000000 +0000
@@ -1,10 +1,17 @@
 // Copyright (C) 2023 The Qt Company Ltd.
 // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
 
-#ifndef QGRAPHSGLOBAL_H
-#define QGRAPHSGLOBAL_H
+#ifndef QTGRAPHS_QGRAPHSGLOBAL_H
+#define QTGRAPHS_QGRAPHSGLOBAL_H
 
 #include <QtCore/qglobal.h>
 #include <QtGraphs/qtgraphsexports.h>
 
+#ifdef QTDATAVIS3D_HEADERS
+#error Mixing QtDataVisualization and QtGraphs in the same TU is unsupported since they use\
+ the same class names.
+#endif
+
+#define QTGRAPHS_HEADERS
+
 #endif
diff -pruN 6.8.2-4/src/common/theme/qgraphstheme.cpp 6.9.1-1/src/common/theme/qgraphstheme.cpp
--- 6.8.2-4/src/common/theme/qgraphstheme.cpp	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/common/theme/qgraphstheme.cpp	2025-05-29 02:19:47.000000000 +0000
@@ -8,7 +8,7 @@
 #include <QLinearGradient>
 #include <QQmlListProperty>
 #include <QStyleHints>
-#include <QtQuick/private/qquickrectangle_p.h>
+
 #include <private/qgraphsglobal_p.h>
 #include <private/qgraphstheme_p.h>
 #include <private/qquickgraphscolor_p.h>
@@ -332,7 +332,7 @@ QT_BEGIN_NAMESPACE
  *
  * The color of the font used for labels.
  *
- * If an axis has specified \l{graphsline.labelTextColor}{labelTextColor} explicitly,
+ * If an axis has specified \l{graphsline::labelTextColor}{labelTextColor} explicitly,
  * this has no effect.
  *
  * The default value depends on \l colorScheme.
diff -pruN 6.8.2-4/src/common/theme/qgraphstheme.h 6.9.1-1/src/common/theme/qgraphstheme.h
--- 6.8.2-4/src/common/theme/qgraphstheme.h	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/common/theme/qgraphstheme.h	2025-05-29 02:19:47.000000000 +0000
@@ -1,8 +1,8 @@
 // Copyright (C) 2024 The Qt Company Ltd.
 // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
 
-#ifndef QGRAPHSTHEME_H
-#define QGRAPHSTHEME_H
+#ifndef QTGRAPHS_QGRAPHSTHEME_H
+#define QTGRAPHS_QGRAPHSTHEME_H
 
 #include <QtCore/qobject.h>
 #include <QtGraphs/qgraphsglobal.h>
@@ -19,7 +19,11 @@ class QQuickGradient;
 class QGraphsThemePrivate;
 struct QGraphsLinePrivate;
 
+#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0)
 QT_DECLARE_QESDP_SPECIALIZATION_DTOR_WITH_EXPORT(QGraphsLinePrivate, Q_GRAPHS_EXPORT)
+#else
+QT_DECLARE_QESDP_SPECIALIZATION_DTOR(QGraphsLinePrivate)
+#endif
 
 struct QGraphsThemeDirtyBitField
 {
diff -pruN 6.8.2-4/src/configure.cmake 6.9.1-1/src/configure.cmake
--- 6.8.2-4/src/configure.cmake	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/configure.cmake	2025-05-29 02:19:47.000000000 +0000
@@ -6,6 +6,36 @@ qt_feature("graphs-2d" PUBLIC
     PURPOSE "Support for 2D graphs"
 )
 
+qt_feature("graphs-2d-area" PUBLIC
+    LABEL "Area"
+    PURPOSE "Support for Area graph"
+)
+
+qt_feature("graphs-2d-bar" PUBLIC
+    LABEL "Bar"
+    PURPOSE "Support for Bar graph"
+)
+
+qt_feature("graphs-2d-donut-pie" PUBLIC
+    LABEL "Donut and Pie"
+    PURPOSE "Support for Donut and Pie graphs"
+)
+
+qt_feature("graphs-2d-line" PUBLIC
+    LABEL "Line"
+    PURPOSE "Support for Line graph"
+)
+
+qt_feature("graphs-2d-scatter" PUBLIC
+    LABEL "Scatter"
+    PURPOSE "Support for Scatter graph"
+)
+
+qt_feature("graphs-2d-spline" PUBLIC
+    LABEL "Spline"
+    PURPOSE "Support for Spline graph"
+)
+
 qt_feature("graphs-3d" PUBLIC
     LABEL "3D Graphs"
     PURPOSE "Support for 3D graphs"
diff -pruN 6.8.2-4/src/doc/qtgraphs-toc.qdoc 6.9.1-1/src/doc/qtgraphs-toc.qdoc
--- 6.8.2-4/src/doc/qtgraphs-toc.qdoc	1970-01-01 00:00:00.000000000 +0000
+++ 6.9.1-1/src/doc/qtgraphs-toc.qdoc	2025-05-29 02:19:47.000000000 +0000
@@ -0,0 +1,36 @@
+// Copyright (C) 2024 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
+
+/*!
+    \page qtgraphs-toc.html
+    \title Qt Graphs module topics
+
+    The following list has links to all the individual topics (HTML files)
+    in the Qt Graphs module.
+
+    \list
+        \li \l {Qt Graphs Overview for 2D}{Qt Graphs 2D}
+            \list
+                \li \l {Qt Graphs Migration from Qt Charts}{Migration from Qt Charts}
+                \li \l {Qt Graphs C++ Classes for 2D}{C++ Classes}
+                \li \l {Qt Graphs QML Types for 2D}{QML Types}
+            \endlist
+        \li \l {Qt Graphs Overview for 3D}{Qt Graphs 3D}
+            \list
+                \li \l {Qt Graphs Integration with Qt Quick 3D}{Integration with Qt Quick 3D}
+                \li \l {Qt Graphs Data Handling with 3D}{Data Handling}
+                \li \l {Qt Graphs Interacting with Data in 3D}{Interacting with Data}
+                \li \l {Qt Graphs Migration from Qt DataVisualization}{Migration from Qt DataVisualization}
+                \li \l {Qt Graphs C++ Classes for 3D}{C++ Classes}
+                \li \l {Qt Graphs QML Types for 3D}{QML Types}
+            \endlist
+        \li \l {Qt Graphs Widgets}
+            \list
+                \li \l {Qt Graphs C++ Classes for Widgets}{C++ Classes}
+            \endlist
+        \li \l {Qt Graphs Theme Overview}{Theming}
+        \li \l {Qt Graphs Configure Options}{Configure Options}
+        \li \l {Qt Graphs Known Issues}{Known Issues}
+    \endlist
+
+*/
diff -pruN 6.8.2-4/src/doc/qtgraphs.qdoc 6.9.1-1/src/doc/qtgraphs.qdoc
--- 6.8.2-4/src/doc/qtgraphs.qdoc	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/doc/qtgraphs.qdoc	2025-05-29 02:19:47.000000000 +0000
@@ -5,12 +5,22 @@
     \module QtGraphs
     \qtcmakepackage Graphs
     \qtvariable graphs
+    \title Qt Graphs Module
+
+    \brief C++ classes for the Qt Graphs API.
+
 */
 
 /*!
     \module QtGraphsWidgets
     \qtcmakepackage GraphsWidgets
     \qtvariable graphswidgets
+    \title Qt Graphs for Widgets
+
+    \brief C++ classes for the Qt Graphs for 3D API used with widgets.
+
+    Widget support is included in its own module to avoid a hard dependency on
+    QtWidgets when building only QML applications.
 */
 
 /*!
@@ -64,6 +74,11 @@
 
 /*!
     \qmlmodule QtGraphs
+    \title Qt Graphs for QML
+    \brief QML types for the Qt Graphs API.
+
+    The Qt Graphs functionality can be accessed via these QML types.
+
 */
 
 /*!
@@ -156,34 +171,84 @@
     \page qtgraphs_configure_options.html
     \title Qt Graphs Configure Options
 
+    This topic lists the configuration options that you can use to configure the
+    Qt Graphs module build.
+
     \section1 Main Features
 
-    When toggling main features, disabling both will result in the module not being built at all.
+    If you disable both of these main features, the module will not be built at
+    all.
 
     \list
-        \li QT_FEATURE_graphs_2d enables building the 2D graph support into the Qt Graphs module.
-        It is \c ON by default. This can be disabled by passing \c{-DFEATURE_graphs_2d=OFF}
-        to CMake.
-        \li QT_FEATURE_graphs_3d enables building the 3D graph support into the Qt Graphs module.
-        It is \c ON by default. This can be disabled by passing \c{-DFEATURE_graphs_3d=OFF}
+        \li \c QT_FEATURE_graphs_2d enables building the 2D graph support into
+        the Qt Graphs module. It is \c ON by default.
+
+        To disable, pass \c{-DFEATURE_graphs_2d=OFF} to CMake.
+        \li \c QT_FEATURE_graphs_3d enables building the 3D graph support into
+        the Qt Graphs module. It is \c ON by default.
+
+        To disable, pass \c{-DFEATURE_graphs_3d=OFF}
         to CMake.
     \endlist
 
+    \section1 Qt Graphs for 2D Features
+
+    If you disable all of these features, the Qt Graphs for 2D module will not
+    be usable for anything. These options are not in effect if
+    \c QT_FEATURE_graphs_2d is disabled.
+
+    \list
+        \li \c QT_FEATURE_graphs_2d_area enables building the area graph support
+            into the Qt Graphs module. It is \c ON by default.
+
+            To disable, pass \c{-DFEATURE_graphs_2d_area=OFF} to CMake.
+
+            Enabling area graph will also enable \l LineSeries support, as that
+            is the minimum requirement for creating area graphs. If
+            \l SplineSeries is required for the \c upperSeries or
+            \c{lowerSeries}, the \c QT_FEATURE_graphs_2d_spline option should
+            also be enabled.
+        \li \c QT_FEATURE_graphs_2d_bar enables building the bar graph support
+            into the Qt Graphs module. It is \c ON by default.
+
+            To disable, pass \c{-DFEATURE_graphs_2d_bar=OFF} to CMake.
+        \li \c QT_FEATURE_graphs_2d_donut_pie enables building the donut and pie
+            graph support into the Qt Graphs module. It is \c ON by default.
+
+            To disable, pass \c{-DFEATURE_graphs_2d_donut_pie=OFF} to CMake.
+        \li \c QT_FEATURE_graphs_2d_line enables building the line graph support
+            into the Qt Graphs module. It is \c ON by default.
+
+            To disable, pass \c{-DFEATURE_graphs_2d_line=OFF} to CMake.
+        \li \c QT_FEATURE_graphs_2d_scatter enables building the scatter graph
+            support into the Qt Graphs module. It is \c ON by default.
+
+            To disable, pass \c{-DFEATURE_graphs_2d_scatter=OFF} to CMake.
+        \li \c QT_FEATURE_graphs_2d_spline enables building the spline graph
+            support into the Qt Graphs module. It is \c ON by default.
+
+            To disable, pass \c{-DFEATURE_graphs_2d_spline=OFF} to CMake.
+    \endlist
+
     \section1 Qt Graphs for 3D Features
 
-    When toggling 3D features, disabling all will result in a module that is not usable for
-    anything. These do not have any effect if \c QT_FEATURE_graphs_3d is disabled.
+    If you disable all of these features, the Qt Graphs for 3D module will not
+    be usable for anything. These options are not in effect if
+    \c QT_FEATURE_graphs_3d is disabled.
 
     \list
-        \li QT_FEATURE_graphs_3d_bars3d enables building the Bars3D graph support into the
-        Qt Graphs module. It is \c ON by default. This can be disabled by passing
-        \c{-DFEATURE_graphs_3d_bars3d=OFF} to CMake.
-        \li QT_FEATURE_graphs_3d_scatter3d enables building the Scatter3D graph support into the
-        Qt Graphs module. It is \c ON by default. This can be disabled by passing
-        \c{-DFEATURE_graphs_3d_scatter3d=OFF} to CMake.
-        \li QT_FEATURE_graphs_3d_surface3d enables building the Surface3D graph support into the
-        Qt Graphs module. It is \c ON by default. This can be disabled by passing
-        \c{-DFEATURE_graphs_3d_surface3d=OFF} to CMake.
+        \li \c QT_FEATURE_graphs_3d_bars3d enables building the Bars3D graph
+            support into the Qt Graphs module. It is \c ON by default.
+
+            To disable, pass \c{-DFEATURE_graphs_3d_bars3d=OFF} to CMake.
+        \li \c QT_FEATURE_graphs_3d_scatter3d enables building the Scatter3D
+            graph support into the Qt Graphs module. It is \c ON by default.
+
+            To disable, pass \c{-DFEATURE_graphs_3d_scatter3d=OFF} to CMake.
+        \li \c QT_FEATURE_graphs_3d_surface3d enables building the Surface3D
+            graph support into the Qt Graphs module. It is \c ON by default.
+
+            To disable, pass \c{-DFEATURE_graphs_3d_surface3d=OFF} to CMake.
     \endlist
 */
 
diff -pruN 6.8.2-4/src/doc/qtgraphs.qdocconf 6.9.1-1/src/doc/qtgraphs.qdocconf
--- 6.8.2-4/src/doc/qtgraphs.qdocconf	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/doc/qtgraphs.qdocconf	2025-05-29 02:19:47.000000000 +0000
@@ -18,7 +18,7 @@ exampledirs += \
 imagedirs  += images \
                 ../graphs3d/widget/doc/images
 
-depends = qtcore qtgui qtqml qtquick qtdoc qtcmake qtwidgets qtquickwidgets qtquick3d qtqmlmodels qtgraphswidgets
+depends = qtcore qtgui qtqml qtquick qtdoc qtcmake qtwidgets qtquick3d qtqmlmodels
 
 qhp.projects                 = QtGraphs
 
@@ -28,15 +28,22 @@ qhp.QtGraphs.virtualFolder   = qtgraphs
 qhp.QtGraphs.indexTitle      = Qt Graphs
 qhp.QtGraphs.indexRoot       =
 
-qhp.QtGraphs.subprojects                             = examples classes types
+qhp.QtGraphs.subprojects                             = manual examples classes types
+
+qhp.QtGraphs.subprojects.manual.title                = Qt Graphs
+qhp.QtGraphs.subprojects.manual.indexTitle           = Qt Graphs module topics
+qhp.QtGraphs.subprojects.manual.type                 = manual
+
 qhp.QtGraphs.subprojects.examples.title              = Examples
 qhp.QtGraphs.subprojects.examples.indexTitle         = Qt Graphs Examples
 qhp.QtGraphs.subprojects.examples.selectors          = example
 qhp.QtGraphs.subprojects.examples.sortPages          = true
+
 qhp.QtGraphs.subprojects.classes.title               = C++ Classes
 qhp.QtGraphs.subprojects.classes.indexTitle          = Qt Graphs C++ Classes
 qhp.QtGraphs.subprojects.classes.selectors           = class
 qhp.QtGraphs.subprojects.classes.sortPages           = true
+
 qhp.QtGraphs.subprojects.types.title                 = QML Types
 qhp.QtGraphs.subprojects.types.indexTitle            = Qt Graphs QML Types
 qhp.QtGraphs.subprojects.types.selectors             = qmltype
@@ -46,6 +53,10 @@ navigation.landingpage = Qt Graphs
 navigation.cppclassespage = Qt Graphs C++ Classes
 navigation.qmltypespage = Qt Graphs QML Types
 
+# Autogenerate navigation linking based on "Qt Graphs module topics":
+navigation.toctitles = "Qt Graphs module topics"
+navigation.toctitles.inclusive = false
+
 manifestmeta.highlighted.names = "QtGraphs/Surface Graph Gallery"
 
 # Enforce zero documentation warnings
diff -pruN 6.8.2-4/src/graphs2d/CMakeLists.txt 6.9.1-1/src/graphs2d/CMakeLists.txt
--- 6.8.2-4/src/graphs2d/CMakeLists.txt	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs2d/CMakeLists.txt	2025-05-29 02:19:47.000000000 +0000
@@ -1,41 +1,104 @@
 # Copyright (C) 2023 The Qt Company Ltd.
 # SPDX-License-Identifier: BSD-3-Clause
 
-qt_internal_extend_target(Graphs
-    SOURCES
-        qgraphsview.cpp qgraphsview_p.h
-        qabstractseries.cpp qabstractseries.h qabstractseries_p.h
-        charthelpers_p.h
-        barchart/qbarseries.cpp barchart/qbarseries.h barchart/qbarseries_p.h
-        barchart/qbarset.cpp barchart/qbarset.h barchart/qbarset_p.h
-        barchart/qbarmodelmapper.cpp barchart/qbarmodelmapper.h barchart/qbarmodelmapper_p.h
-        linechart/qlineseries.cpp linechart/qlineseries.h linechart/qlineseries_p.h
-        piechart/qpieseries.cpp piechart/qpieseries.h piechart/qpieseries_p.h
-        piechart/qpieslice.cpp piechart/qpieslice.h piechart/qpieslice_p.h
-        piechart/qpiemodelmapper.cpp piechart/qpiemodelmapper.h piechart/qpiemodelmapper_p.h
-        scatterchart/qscatterseries.cpp scatterchart/qscatterseries.h scatterchart/qscatterseries_p.h
-        xychart/qxyseries.cpp xychart/qxyseries.h xychart/qxyseries_p.h
-        xychart/qxypoint.cpp xychart/qxypoint_p.h
-        xychart/qxymodelmapper.cpp xychart/qxymodelmapper.h xychart/qxymodelmapper_p.h
-        axis/qabstractaxis.cpp axis/qabstractaxis.h axis/qabstractaxis_p.h
-        axis/barcategoryaxis/qbarcategoryaxis.cpp axis/barcategoryaxis/qbarcategoryaxis.h axis/barcategoryaxis/qbarcategoryaxis_p.h
-        axis/axisgrid.cpp axis/axisgrid_p.h
-        axis/axisticker.cpp axis/axisticker_p.h
-        axis/axisline.cpp axis/axisline_p.h
-        axis/valueaxis/qvalueaxis.cpp axis/valueaxis/qvalueaxis.h axis/valueaxis/qvalueaxis_p.h
-        qsgrenderer/barsrenderer.cpp qsgrenderer/barsrenderer_p.h
-        qsgrenderer/pointrenderer.cpp qsgrenderer/pointrenderer_p.h
-        qsgrenderer/axisrenderer.cpp qsgrenderer/axisrenderer_p.h
-        qsgrenderer/pierenderer.cpp qsgrenderer/pierenderer_p.h
-        qsgrenderer/arearenderer.cpp qsgrenderer/arearenderer_p.h
-        splinechart/qsplineseries.cpp splinechart/qsplineseries.h splinechart/qsplineseries_p.h
-        areachart/qareaseries.cpp areachart/qareaseries.h areachart/qareaseries_p.h
-        animation/qgraphanimation.cpp animation/qgraphanimation_p.h
-        animation/qsplinecontrolanimation.cpp animation/qsplinecontrolanimation_p.h
-        animation/qgraphpointanimation.cpp animation/qgraphpointanimation_p.h
-        animation/qgraphtransition_p.h animation/qgraphtransition.cpp
-        animation/qxyseriesanimation_p.h animation/qxyseriesanimation.cpp
-        axis/datetimeaxis/qdatetimeaxis.h axis/datetimeaxis/qdatetimeaxis.cpp axis/datetimeaxis/qdatetimeaxis_p.h
-)
+qt_configure_add_summary_section(NAME "Qt Graphs 2D")
+qt_configure_add_summary_entry(ARGS "graphs-2d-area")
+qt_configure_add_summary_entry(ARGS "graphs-2d-bar")
+qt_configure_add_summary_entry(ARGS "graphs-2d-donut-pie") # These are tightly wound together
+qt_configure_add_summary_entry(ARGS "graphs-2d-line")
+qt_configure_add_summary_entry(ARGS "graphs-2d-scatter")
+qt_configure_add_summary_entry(ARGS "graphs-2d-spline")
+qt_configure_end_summary_section() # end of "Qt Graphs 2D" section
+
+if(NOT QT_FEATURE_graphs_2d_area AND NOT QT_FEATURE_graphs_2d_bar AND NOT QT_FEATURE_graphs_2d_donut_pie AND NOT QT_FEATURE_graphs_2d_line AND NOT QT_FEATURE_graphs_2d_scatter AND NOT QT_FEATURE_graphs_2d_spline)
+    message("You must have one of the 2D features ON, or nothing will be built.")
+else()
+    qt_internal_extend_target(Graphs
+        SOURCES
+            qgraphsview.cpp qgraphsview_p.h
+            qabstractseries.cpp qabstractseries.h qabstractseries_p.h
+            charthelpers_p.h
+
+            axis/qabstractaxis.cpp axis/qabstractaxis.h axis/qabstractaxis_p.h
+            axis/axisgrid.cpp axis/axisgrid_p.h
+            axis/axisticker.cpp axis/axisticker_p.h
+            axis/axisline.cpp axis/axisline_p.h
+            axis/valueaxis/qvalueaxis.cpp axis/valueaxis/qvalueaxis.h axis/valueaxis/qvalueaxis_p.h
+            axis/datetimeaxis/qdatetimeaxis.h axis/datetimeaxis/qdatetimeaxis.cpp axis/datetimeaxis/qdatetimeaxis_p.h
+
+            qsgrenderer/axisrenderer.cpp qsgrenderer/axisrenderer_p.h
+
+            animation/qgraphanimation.cpp animation/qgraphanimation_p.h
+        INCLUDE_DIRECTORIES
+            axis
+            qsgrenderer
+            animation
+    )
+    qt_internal_extend_target(Graphs CONDITION QT_FEATURE_graphs_2d_area OR QT_FEATURE_graphs_2d_line OR QT_FEATURE_graphs_2d_scatter OR QT_FEATURE_graphs_2d_spline
+        SOURCES
+            xychart/qxyseries.cpp xychart/qxyseries.h xychart/qxyseries_p.h
+            xychart/qxypoint.cpp xychart/qxypoint_p.h
+            xychart/qxymodelmapper.cpp xychart/qxymodelmapper.h xychart/qxymodelmapper_p.h
+
+            qsgrenderer/pointrenderer.cpp qsgrenderer/pointrenderer_p.h
+
+            animation/qgraphpointanimation.cpp animation/qgraphpointanimation_p.h
+            animation/qgraphtransition_p.h animation/qgraphtransition.cpp
+            animation/qxyseriesanimation_p.h animation/qxyseriesanimation.cpp
+        DEFINES
+            USE_POINTS
+        )
+    qt_internal_extend_target(Graphs CONDITION QT_FEATURE_graphs_2d_area
+        SOURCES
+            areachart/qareaseries.cpp areachart/qareaseries.h areachart/qareaseries_p.h
+
+            qsgrenderer/arearenderer.cpp qsgrenderer/arearenderer_p.h
+        DEFINES
+            USE_AREAGRAPH
+    )
+    qt_internal_extend_target(Graphs CONDITION QT_FEATURE_graphs_2d_bar
+        SOURCES
+            barchart/qbarseries.cpp barchart/qbarseries.h barchart/qbarseries_p.h
+            barchart/qbarset.cpp barchart/qbarset.h barchart/qbarset_p.h
+            barchart/qbarmodelmapper.cpp barchart/qbarmodelmapper.h barchart/qbarmodelmapper_p.h
+
+            axis/barcategoryaxis/qbarcategoryaxis.cpp axis/barcategoryaxis/qbarcategoryaxis.h axis/barcategoryaxis/qbarcategoryaxis_p.h
+
+            qsgrenderer/barsrenderer.cpp qsgrenderer/barsrenderer_p.h
+        DEFINES
+            USE_BARGRAPH
+    )
+    qt_internal_extend_target(Graphs CONDITION QT_FEATURE_graphs_2d_donut_pie
+        SOURCES
+            piechart/qpieseries.cpp piechart/qpieseries.h piechart/qpieseries_p.h
+            piechart/qpieslice.cpp piechart/qpieslice.h piechart/qpieslice_p.h
+            piechart/qpiemodelmapper.cpp piechart/qpiemodelmapper.h piechart/qpiemodelmapper_p.h
+
+            qsgrenderer/pierenderer.cpp qsgrenderer/pierenderer_p.h
+        DEFINES
+            USE_PIEGRAPH
+    )
+    qt_internal_extend_target(Graphs CONDITION QT_FEATURE_graphs_2d_line OR QT_FEATURE_graphs_2d_area
+        # area graph requires at least line series support
+        SOURCES
+            linechart/qlineseries.cpp linechart/qlineseries.h linechart/qlineseries_p.h
+        DEFINES
+            USE_LINEGRAPH
+    )
+    qt_internal_extend_target(Graphs CONDITION QT_FEATURE_graphs_2d_scatter
+        SOURCES
+            scatterchart/qscatterseries.cpp scatterchart/qscatterseries.h scatterchart/qscatterseries_p.h
+        DEFINES
+            USE_SCATTERGRAPH
+    )
+    qt_internal_extend_target(Graphs CONDITION QT_FEATURE_graphs_2d_spline
+        SOURCES
+            splinechart/qsplineseries.cpp splinechart/qsplineseries.h splinechart/qsplineseries_p.h
+
+            animation/qsplinecontrolanimation.cpp animation/qsplinecontrolanimation_p.h
+        DEFINES
+            USE_SPLINEGRAPH
+    )
+endif()
 
 add_subdirectory(qml/designer)
diff -pruN 6.8.2-4/src/graphs2d/animation/qgraphanimation.cpp 6.9.1-1/src/graphs2d/animation/qgraphanimation.cpp
--- 6.8.2-4/src/graphs2d/animation/qgraphanimation.cpp	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs2d/animation/qgraphanimation.cpp	2025-05-29 02:19:47.000000000 +0000
@@ -9,7 +9,6 @@
     \qmlabstract
     \inqmlmodule QtGraphs
     \ingroup graphs_qml_2D
-    \inherits VariantAnimation
     \brief The GraphAnimation type is the base type for all animations for 2D Qt Graphs series.
 
     GraphAnimation is based on VariantAnimation and provides an interface for interpolation for child animations.
diff -pruN 6.8.2-4/src/graphs2d/animation/qgraphtransition.cpp 6.9.1-1/src/graphs2d/animation/qgraphtransition.cpp
--- 6.8.2-4/src/graphs2d/animation/qgraphtransition.cpp	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs2d/animation/qgraphtransition.cpp	2025-05-29 02:19:47.000000000 +0000
@@ -88,10 +88,12 @@ void QGraphTransition::onPointChanged(Tr
         childAnimation->animate();
     }
 
+#ifdef USE_SPLINEGRAPH
     auto spline = qobject_cast<QSplineSeries *>(series);
 
     if (spline && !contains(QGraphAnimation::GraphAnimationType::ControlPoint))
         spline->d_func()->calculateSplinePoints();
+#endif
 
     m_animationGroup.start();
 }
diff -pruN 6.8.2-4/src/graphs2d/areachart/qareaseries.cpp 6.9.1-1/src/graphs2d/areachart/qareaseries.cpp
--- 6.8.2-4/src/graphs2d/areachart/qareaseries.cpp	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs2d/areachart/qareaseries.cpp	2025-05-29 02:19:47.000000000 +0000
@@ -164,6 +164,32 @@ QT_BEGIN_NAMESPACE
     This signal is emitted when the lower series changes.
 */
 
+/*!
+    \qmlsignal AreaSeries::clicked(point point)
+    This signal is emitted when the user clicks or taps an area graph.
+    The \a point specifies the event triggered position.
+*/
+
+/*!
+    \qmlsignal AreaSeries::doubleClicked(point point)
+    This signal is emitted when the user double-clicks or double-taps an area graph.
+    The \a point specifies the event triggered position.
+    This signal always occurs after \l clicked.
+*/
+
+/*!
+    \qmlsignal AreaSeries::pressed(point point)
+    This signal is emitted when the user clicks or taps the area graph and holds down
+    the mouse button or gesture.
+    The \a point specifies the event triggered position.
+*/
+
+/*!
+    \qmlsignal AreaSeries::released(point point)
+    This signal is emitted when the user releases a pressed click or tap.
+    The \a point specifies the event triggered position.
+*/
+
 QAreaSeries::QAreaSeries(QObject *parent)
     : QAbstractSeries(*(new QAreaSeriesPrivate()), parent)
 {}
diff -pruN 6.8.2-4/src/graphs2d/areachart/qareaseries.h 6.9.1-1/src/graphs2d/areachart/qareaseries.h
--- 6.8.2-4/src/graphs2d/areachart/qareaseries.h	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs2d/areachart/qareaseries.h	2025-05-29 02:19:47.000000000 +0000
@@ -1,8 +1,8 @@
 // Copyright (C) 2024 The Qt Company Ltd.
 // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
 
-#ifndef QAREASERIES_H
-#define QAREASERIES_H
+#ifndef QTGRAPHS_QAREASERIES_H
+#define QTGRAPHS_QAREASERIES_H
 
 #include <QtGraphs/qabstractseries.h>
 #include <QtGraphs/qgraphsglobal.h>
@@ -70,6 +70,11 @@ Q_SIGNALS:
     void upperSeriesChanged();
     void lowerSeriesChanged();
 
+    Q_REVISION(6, 9) void clicked(QPoint point);
+    Q_REVISION(6, 9) void doubleClicked(QPoint point);
+    Q_REVISION(6, 9) void pressed(QPoint point);
+    Q_REVISION(6, 9) void released(QPoint point);
+
 protected:
     QAreaSeries(QAreaSeriesPrivate &dd, QObject *parent = nullptr);
 
@@ -81,4 +86,4 @@ private:
 
 QT_END_NAMESPACE
 
-#endif // QAREASERIES_H
+#endif // QTGRAPHS_QAREASERIES_H
diff -pruN 6.8.2-4/src/graphs2d/axis/barcategoryaxis/qbarcategoryaxis.cpp 6.9.1-1/src/graphs2d/axis/barcategoryaxis/qbarcategoryaxis.cpp
--- 6.8.2-4/src/graphs2d/axis/barcategoryaxis/qbarcategoryaxis.cpp	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs2d/axis/barcategoryaxis/qbarcategoryaxis.cpp	2025-05-29 02:19:47.000000000 +0000
@@ -116,7 +116,7 @@ QT_BEGIN_NAMESPACE
     Constructs an axis object that is the child of \a parent.
 */
 QBarCategoryAxis::QBarCategoryAxis(QObject *parent)
-    : QAbstractAxis(*(new QBarCategoryAxisPrivate), parent)
+    : QBarCategoryAxis(*(new QBarCategoryAxisPrivate), parent)
 {
 }
 
diff -pruN 6.8.2-4/src/graphs2d/axis/barcategoryaxis/qbarcategoryaxis.h 6.9.1-1/src/graphs2d/axis/barcategoryaxis/qbarcategoryaxis.h
--- 6.8.2-4/src/graphs2d/axis/barcategoryaxis/qbarcategoryaxis.h	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs2d/axis/barcategoryaxis/qbarcategoryaxis.h	2025-05-29 02:19:47.000000000 +0000
@@ -1,8 +1,8 @@
 // Copyright (C) 2023 The Qt Company Ltd.
 // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
 
-#ifndef QBARCATEGORYAXIS_H
-#define QBARCATEGORYAXIS_H
+#ifndef QTGRAPHS_QBARCATEGORYAXIS_H
+#define QTGRAPHS_QBARCATEGORYAXIS_H
 
 #include <QtGraphs/qabstractaxis.h>
 #include <QtGraphs/qgraphsglobal.h>
@@ -64,4 +64,4 @@ private:
 
 QT_END_NAMESPACE
 
-#endif // QBARCATEGORYAXIS_H
+#endif // QTGRAPHS_QBARCATEGORYAXIS_H
diff -pruN 6.8.2-4/src/graphs2d/axis/datetimeaxis/qdatetimeaxis.h 6.9.1-1/src/graphs2d/axis/datetimeaxis/qdatetimeaxis.h
--- 6.8.2-4/src/graphs2d/axis/datetimeaxis/qdatetimeaxis.h	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs2d/axis/datetimeaxis/qdatetimeaxis.h	2025-05-29 02:19:47.000000000 +0000
@@ -1,8 +1,8 @@
 // Copyright (C) 2024 The Qt Company Ltd.
 // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
 
-#ifndef QDATETIMEAXIS_H
-#define QDATETIMEAXIS_H
+#ifndef QTGRAPHS_QDATETIMEAXIS_H
+#define QTGRAPHS_QDATETIMEAXIS_H
 
 #include <QtGraphs/qabstractaxis.h>
 
@@ -62,4 +62,4 @@ private:
 
 QT_END_NAMESPACE
 
-#endif // QDATETIMEAXIS_H
+#endif // QTGRAPHS_QDATETIMEAXIS_H
diff -pruN 6.8.2-4/src/graphs2d/axis/qabstractaxis.cpp 6.9.1-1/src/graphs2d/axis/qabstractaxis.cpp
--- 6.8.2-4/src/graphs2d/axis/qabstractaxis.cpp	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs2d/axis/qabstractaxis.cpp	2025-05-29 02:19:47.000000000 +0000
@@ -82,7 +82,7 @@ QT_BEGIN_NAMESPACE
     \brief The angle of the axis labels in degrees.
 */
 /*!
-    \qmlproperty qreal AbstractAxis::labelsAngle
+    \qmlproperty real AbstractAxis::labelsAngle
     The angle of the axis labels in degrees.
 */
 
@@ -163,6 +163,21 @@ QT_BEGIN_NAMESPACE
 */
 
 /*!
+    \property QAbstractAxis::alignment
+    \since 6.9
+    \brief The alignment of the axis.
+
+    Can be Qt::AlignLeft, Qt::AlignRight, Qt::AlignBottom, or Qt::AlignTop.
+*/
+/*!
+    \qmlproperty alignment AbstractAxis::alignment
+    \since 6.9
+    The alignment of the axis. Can be \l{Qt::AlignLeft}{Qt.AlignLeft},
+    \l{Qt::AlignRight}{Qt.AlignRight}, \l{Qt::AlignBottom}{Qt.AlignBottom}, or
+    \l{Qt::AlignTop}{Qt.AlignTop}.
+*/
+
+/*!
     \fn void QAbstractAxis::update()
     This signal is emitted when the axis needs to be updated.
 */
@@ -486,6 +501,34 @@ void QAbstractAxis::setRange(const QVari
     d->setRange(min, max);
 }
 
+Qt::Alignment QAbstractAxis::alignment() const
+{
+    const Q_D(QAbstractAxis);
+    return d->m_alignment;
+}
+
+void QAbstractAxis::setAlignment(Qt::Alignment alignment)
+{
+    Q_D(QAbstractAxis);
+    if (d->m_alignment == alignment)
+        return;
+    switch (alignment) {
+    case Qt::AlignTop:
+    case Qt::AlignBottom:
+    case Qt::AlignLeft:
+    case Qt::AlignRight:
+        d->m_alignment = alignment;
+        if (d->m_graph)
+            d->m_graph->updateComponentSizes();
+        emit update();
+        emit alignmentChanged(alignment);
+        break;
+    default:
+        qWarning("Invalid alignment.");
+        break;
+    }
+}
+
 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
 QAbstractAxisPrivate::QAbstractAxisPrivate() {}
diff -pruN 6.8.2-4/src/graphs2d/axis/qabstractaxis.h 6.9.1-1/src/graphs2d/axis/qabstractaxis.h
--- 6.8.2-4/src/graphs2d/axis/qabstractaxis.h	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs2d/axis/qabstractaxis.h	2025-05-29 02:19:47.000000000 +0000
@@ -1,8 +1,8 @@
 // Copyright (C) 2023 The Qt Company Ltd.
 // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
 
-#ifndef QABSTRACTAXIS_H
-#define QABSTRACTAXIS_H
+#ifndef QTGRAPHS_QABSTRACTAXIS_H
+#define QTGRAPHS_QABSTRACTAXIS_H
 
 #include <QtCore/qobject.h>
 #include <QtCore/qvariant.h>
@@ -42,6 +42,9 @@ class Q_GRAPHS_EXPORT QAbstractAxis : pu
     Q_PROPERTY(bool titleVisible READ isTitleVisible WRITE setTitleVisible NOTIFY
                    titleVisibleChanged FINAL)
     Q_PROPERTY(QFont titleFont READ titleFont WRITE setTitleFont NOTIFY titleFontChanged FINAL)
+    //alignment
+    Q_PROPERTY(Qt::Alignment alignment READ alignment WRITE setAlignment NOTIFY
+                       alignmentChanged REVISION(6, 9))
     QML_FOREIGN(QAbstractAxis)
     QML_UNCREATABLE("")
     QML_NAMED_ELEMENT(AbstractAxis)
@@ -97,6 +100,9 @@ public:
     void setTitleText(const QString &title);
     QString titleText() const;
 
+    Qt::Alignment alignment() const;
+    void setAlignment(Qt::Alignment alignment);
+
     //range handling
     void setMin(const QVariant &min);
     void setMax(const QVariant &max);
@@ -114,6 +120,7 @@ Q_SIGNALS:
     void titleColorChanged(QColor color);
     void titleVisibleChanged(bool visible);
     void titleFontChanged(const QFont &font);
+    Q_REVISION(6, 9) void alignmentChanged(Qt::Alignment alignment);
     void update();
     void rangeChanged(qreal min, qreal max);
 
@@ -124,4 +131,4 @@ private:
 
 QT_END_NAMESPACE
 
-#endif // QABSTRACTAXIS_H
+#endif // QTGRAPHS_QABSTRACTAXIS_H
diff -pruN 6.8.2-4/src/graphs2d/axis/qabstractaxis_p.h 6.9.1-1/src/graphs2d/axis/qabstractaxis_p.h
--- 6.8.2-4/src/graphs2d/axis/qabstractaxis_p.h	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs2d/axis/qabstractaxis_p.h	2025-05-29 02:19:47.000000000 +0000
@@ -67,6 +67,8 @@ private:
     QFont m_titleFont;
     QString m_title;
 
+    Qt::Alignment m_alignment = Qt::AlignBottom;
+
     Q_DECLARE_PUBLIC(QAbstractAxis)
 };
 
diff -pruN 6.8.2-4/src/graphs2d/axis/valueaxis/qvalueaxis.cpp 6.9.1-1/src/graphs2d/axis/valueaxis/qvalueaxis.cpp
--- 6.8.2-4/src/graphs2d/axis/valueaxis/qvalueaxis.cpp	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs2d/axis/valueaxis/qvalueaxis.cpp	2025-05-29 02:19:47.000000000 +0000
@@ -148,6 +148,40 @@ QT_BEGIN_NAMESPACE
 */
 
 /*!
+  \property QValueAxis::zoom
+  \since 6.9
+  \brief The zoom value of the axis.
+
+  The zoom value enlarges or shrinks the axis and thus the graph without affecting intervals
+  of grid and labels. The default value is 1.
+*/
+/*!
+  \qmlproperty real ValueAxis::zoom
+  \since 6.9
+  The zoom value of the axis.
+
+  The zoom value enlarges or shrinks the axis and thus the graph without affecting intervals
+  of grid and labels. The default value is 1.
+*/
+
+/*!
+  \property QValueAxis::pan
+  \since 6.9
+  \brief The pan value of the axis.
+
+  The pan value moves the center of the axis without affecting intervals
+  of grid and labels. The default value is 0.
+*/
+/*!
+  \qmlproperty real ValueAxis::pan
+  \since 6.9
+  The pan value of the axis.
+
+  The pan value moves the center of the axis without affecting intervals
+  of grid and labels. The default value is 0.
+*/
+
+/*!
   \qmlsignal ValueAxis::minChanged(real min)
   This signal is emitted when the minimum value of the axis changes to \a min.
 */
@@ -324,6 +358,38 @@ int QValueAxis::labelDecimals() const
     return d->m_decimals;
 }
 
+void QValueAxis::setZoom(qreal zoom)
+{
+    Q_D(QValueAxis);
+    if (d->m_zoom != zoom) {
+        d->m_zoom = zoom;
+        emit update();
+        emit zoomChanged(zoom);
+    }
+}
+
+qreal QValueAxis::zoom() const
+{
+    Q_D(const QValueAxis);
+    return d->m_zoom;
+}
+
+void QValueAxis::setPan(qreal pan)
+{
+    Q_D(QValueAxis);
+    if (d->m_pan != pan) {
+        d->m_pan = pan;
+        emit update();
+        emit panChanged(pan);
+    }
+}
+
+qreal QValueAxis::pan() const
+{
+    Q_D(const QValueAxis);
+    return d->m_pan;
+}
+
 /*!
   Returns the type of the axis.
 */
diff -pruN 6.8.2-4/src/graphs2d/axis/valueaxis/qvalueaxis.h 6.9.1-1/src/graphs2d/axis/valueaxis/qvalueaxis.h
--- 6.8.2-4/src/graphs2d/axis/valueaxis/qvalueaxis.h	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs2d/axis/valueaxis/qvalueaxis.h	2025-05-29 02:19:47.000000000 +0000
@@ -1,8 +1,8 @@
 // Copyright (C) 2023 The Qt Company Ltd.
 // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
 
-#ifndef QVALUEAXIS_H
-#define QVALUEAXIS_H
+#ifndef QTGRAPHS_QVALUEAXIS_H
+#define QTGRAPHS_QVALUEAXIS_H
 
 #include <QtGraphs/qabstractaxis.h>
 #include <QtGraphs/qgraphsglobal.h>
@@ -26,6 +26,8 @@ class Q_GRAPHS_EXPORT QValueAxis : publi
     Q_PROPERTY(qreal tickAnchor READ tickAnchor WRITE setTickAnchor NOTIFY tickAnchorChanged FINAL)
     Q_PROPERTY(
         qreal tickInterval READ tickInterval WRITE setTickInterval NOTIFY tickIntervalChanged FINAL)
+    Q_PROPERTY(qreal zoom READ zoom WRITE setZoom NOTIFY zoomChanged REVISION(6, 9))
+    Q_PROPERTY(qreal pan READ pan WRITE setPan NOTIFY panChanged REVISION(6, 9))
     QML_NAMED_ELEMENT(ValueAxis)
 
 public:
@@ -59,6 +61,12 @@ public:
     void setLabelDecimals(int decimals);
     int labelDecimals() const;
 
+    void setZoom(qreal zoom);
+    qreal zoom() const;
+
+    void setPan(qreal pan);
+    qreal pan() const;
+
 Q_SIGNALS:
     void minChanged(qreal min);
     void maxChanged(qreal max);
@@ -68,6 +76,8 @@ Q_SIGNALS:
     void labelDecimalsChanged(int decimals);
     void tickAnchorChanged(qreal tickAnchor);
     void tickIntervalChanged(qreal tickInterval);
+    Q_REVISION(6, 9) void zoomChanged(qreal zoom);
+    Q_REVISION(6, 9) void panChanged(qreal pan);
 
 private:
     Q_DECLARE_PRIVATE(QValueAxis)
@@ -76,4 +86,4 @@ private:
 
 QT_END_NAMESPACE
 
-#endif // QVALUEAXIS_H
+#endif // QTGRAPHS_QVALUEAXIS_H
diff -pruN 6.8.2-4/src/graphs2d/axis/valueaxis/qvalueaxis_p.h 6.9.1-1/src/graphs2d/axis/valueaxis/qvalueaxis_p.h
--- 6.8.2-4/src/graphs2d/axis/valueaxis/qvalueaxis_p.h	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs2d/axis/valueaxis/qvalueaxis_p.h	2025-05-29 02:19:47.000000000 +0000
@@ -42,6 +42,8 @@ private:
     int m_decimals;
     qreal m_tickAnchor;
     qreal m_tickInterval;
+    qreal m_zoom = 1.0;
+    qreal m_pan = 0.0;
     Q_DECLARE_PUBLIC(QValueAxis)
 };
 
diff -pruN 6.8.2-4/src/graphs2d/barchart/qbarmodelmapper.h 6.9.1-1/src/graphs2d/barchart/qbarmodelmapper.h
--- 6.8.2-4/src/graphs2d/barchart/qbarmodelmapper.h	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs2d/barchart/qbarmodelmapper.h	2025-05-29 02:19:47.000000000 +0000
@@ -1,7 +1,7 @@
 // Copyright (C) 2024 The Qt Company Ltd.
 // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
-#ifndef QBARMODELMAPPER_H
-#define QBARMODELMAPPER_H
+#ifndef QTGRAPHS_QBARMODELMAPPER_H
+#define QTGRAPHS_QBARMODELMAPPER_H
 
 #include <QtCore/qobject.h>
 #include <QtGraphs/qgraphsglobal.h>
@@ -80,4 +80,4 @@ private:
 
 QT_END_NAMESPACE
 
-#endif // QBARMODELMAPPER_H
+#endif // QTGRAPHS_QBARMODELMAPPER_H
diff -pruN 6.8.2-4/src/graphs2d/barchart/qbarseries.cpp 6.9.1-1/src/graphs2d/barchart/qbarseries.cpp
--- 6.8.2-4/src/graphs2d/barchart/qbarseries.cpp	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs2d/barchart/qbarseries.cpp	2025-05-29 02:19:47.000000000 +0000
@@ -262,6 +262,10 @@ QT_BEGIN_NAMESPACE
         \li barSelected
         \li This value is true when the bar is selected, meaning that the bar index
         is in \l{QBarSet::selectedBars}.
+    \row
+        \li int
+        \li barIndex
+        \li Index of the bar, from 0 to the amount of bars - 1. [since 6.9]
     \endtable
 
     To use any of these, add property with the defined name into your custom component.
@@ -308,6 +312,10 @@ QT_BEGIN_NAMESPACE
         \li barSelected
         \li This value is true when the bar is selected, meaning that the bar index
         is in \l{BarSet::selectedBars}.
+    \row
+        \li int
+        \li barIndex
+        \li Index of the bar, from 0 to the amount of bars - 1. [since 6.9]
     \endtable
 
     To use any of these, add property with the defined name into your custom component.
@@ -390,6 +398,18 @@ QT_BEGIN_NAMESPACE
 */
 
 /*!
+    \qmlmethod bool BarSeries::append(BarSet barset)
+
+    Adds a set of bars specified by \a barset to the bar series and takes
+    ownership of it. If the set is null or it already belongs to the series,
+    it will not be appended.
+
+    Returns \c true if appending succeeded.
+
+    \sa insert()
+*/
+
+/*!
     \qmlmethod bool BarSeries::remove(BarSet barset)
     Removes the bar set specified by \a barset from the series. Returns \c true if successful,
     \c false otherwise.
@@ -443,6 +463,31 @@ QT_BEGIN_NAMESPACE
 */
 
 /*!
+    \qmlsignal BarSeries::clicked(int index, BarSet barset)
+    This signal is emitted when the user clicks or taps the bar specified by \a index
+    in the bar set specified by \a barset.
+*/
+
+/*!
+    \qmlsignal BarSeries::doubleClicked(int index, BarSet barset)
+    This signal is emitted when the user double-clicks or double-taps the bar specified
+    by \a index in the bar set specified by \a barset.
+    This signal always occurs after \l clicked.
+*/
+
+/*!
+    \qmlsignal BarSeries::pressed(int index, BarSet barset)
+    This signal is emitted when the user clicks or taps the bar specified by \a index
+    in the bar set specified by \a barset and holds down the mouse button or gesture.
+*/
+
+/*!
+    \qmlsignal BarSeries::released(int index, BarSet barset);
+    This signal is emitted when the user releases a previously pressed mouse button
+    or gesture on the bar specified by \a index in the bar set specified by \a barset.
+*/
+
+/*!
     \internal
 */
 
diff -pruN 6.8.2-4/src/graphs2d/barchart/qbarseries.h 6.9.1-1/src/graphs2d/barchart/qbarseries.h
--- 6.8.2-4/src/graphs2d/barchart/qbarseries.h	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs2d/barchart/qbarseries.h	2025-05-29 02:19:47.000000000 +0000
@@ -1,8 +1,8 @@
 // Copyright (C) 2023 The Qt Company Ltd.
 // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
 
-#ifndef QBARSERIES_H
-#define QBARSERIES_H
+#ifndef QTGRAPHS_QBARSERIES_H
+#define QTGRAPHS_QBARSERIES_H
 
 #include <QtGraphs/qabstractseries.h>
 #include <QtGraphs/qgraphsglobal.h>
@@ -138,6 +138,11 @@ Q_SIGNALS:
     void setValueRemoved(qsizetype index, qsizetype count, QBarSet *barset);
     void barSetsChanged();
 
+    Q_REVISION(6, 9) void clicked(qsizetype index, QBarSet *barset);
+    Q_REVISION(6, 9) void doubleClicked(qsizetype index, QBarSet *barset);
+    Q_REVISION(6, 9) void pressed(qsizetype index, QBarSet *barset);
+    Q_REVISION(6, 9) void released(qsizetype index, QBarSet *barset);
+
 private Q_SLOTS:
     void handleSetValueChange(qsizetype index);
     void handleSetValueAdd(qsizetype index, qsizetype count);
@@ -154,4 +159,4 @@ private:
 
 QT_END_NAMESPACE
 
-#endif // QBARSERIES_H
+#endif // QTGRAPHS_QBARSERIES_H
diff -pruN 6.8.2-4/src/graphs2d/barchart/qbarset.cpp 6.9.1-1/src/graphs2d/barchart/qbarset.cpp
--- 6.8.2-4/src/graphs2d/barchart/qbarset.cpp	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs2d/barchart/qbarset.cpp	2025-05-29 02:19:47.000000000 +0000
@@ -125,7 +125,7 @@ QT_BEGIN_NAMESPACE
     it gets the value zero.
  */
 /*!
-    \qmlproperty QVariantList BarSet::values
+    \qmlproperty list<variant> BarSet::values
     The values of the bar set. You can set a list of either \l [QML]{real} or \l [QML]{point}
     types as values.
 
diff -pruN 6.8.2-4/src/graphs2d/barchart/qbarset.h 6.9.1-1/src/graphs2d/barchart/qbarset.h
--- 6.8.2-4/src/graphs2d/barchart/qbarset.h	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs2d/barchart/qbarset.h	2025-05-29 02:19:47.000000000 +0000
@@ -1,8 +1,8 @@
 // Copyright (C) 2023 The Qt Company Ltd.
 // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
 
-#ifndef QBARSET_H
-#define QBARSET_H
+#ifndef QTGRAPHS_QBARSET_H
+#define QTGRAPHS_QBARSET_H
 
 #include <QtCore/qobject.h>
 #include <QtGraphs/qgraphsglobal.h>
@@ -112,4 +112,4 @@ private:
 
 QT_END_NAMESPACE
 
-#endif // QBARSET_H
+#endif // QTGRAPHS_QBARSET_H
diff -pruN 6.8.2-4/src/graphs2d/linechart/qlineseries.h 6.9.1-1/src/graphs2d/linechart/qlineseries.h
--- 6.8.2-4/src/graphs2d/linechart/qlineseries.h	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs2d/linechart/qlineseries.h	2025-05-29 02:19:47.000000000 +0000
@@ -1,8 +1,8 @@
 // Copyright (C) 2023 The Qt Company Ltd.
 // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
 
-#ifndef QLINESERIES_H
-#define QLINESERIES_H
+#ifndef QTGRAPHS_QLINESERIES_H
+#define QTGRAPHS_QLINESERIES_H
 
 #include <QtGraphs/qxyseries.h>
 #include <QtGraphs/qgraphsglobal.h>
@@ -46,4 +46,4 @@ private:
 
 QT_END_NAMESPACE
 
-#endif // QLINESERIES_H
+#endif // QTGRAPHS_QLINESERIES_H
diff -pruN 6.8.2-4/src/graphs2d/piechart/qpiemodelmapper.h 6.9.1-1/src/graphs2d/piechart/qpiemodelmapper.h
--- 6.8.2-4/src/graphs2d/piechart/qpiemodelmapper.h	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs2d/piechart/qpiemodelmapper.h	2025-05-29 02:19:47.000000000 +0000
@@ -1,7 +1,7 @@
 // Copyright (C) 2024 The Qt Company Ltd.
 // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
-#ifndef QPIEMODELMAPPER_H
-#define QPIEMODELMAPPER_H
+#ifndef QTGRAPHS_QPIEMODELMAPPER_H
+#define QTGRAPHS_QPIEMODELMAPPER_H
 
 #include <QtCore/qobject.h>
 #include <QtGraphs/qgraphsglobal.h>
@@ -76,4 +76,4 @@ protected:
 
 QT_END_NAMESPACE
 
-#endif // QPIEMODELMAPPER_H
+#endif // QTGRAPHS_QPIEMODELMAPPER_H
diff -pruN 6.8.2-4/src/graphs2d/piechart/qpieseries.cpp 6.9.1-1/src/graphs2d/piechart/qpieseries.cpp
--- 6.8.2-4/src/graphs2d/piechart/qpieseries.cpp	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs2d/piechart/qpieseries.cpp	2025-05-29 02:19:47.000000000 +0000
@@ -395,6 +395,29 @@ QT_BEGIN_NAMESPACE
 */
 
 /*!
+    \qmlsignal PieSeries::clicked(PieSlice slice)
+    This signal is emitted when the \a slice is clicked or tapped.
+*/
+
+/*!
+    \qmlsignal PieSeries::doubleClicked(PieSlice slice)
+    This signal is emitted when the \a slice is double-clicked or double-tapped.
+    This signal always occurs after \l clicked.
+*/
+
+/*!
+    \qmlsignal PieSeries::pressed(PieSlice slice)
+    This signal is emitted when the user clicks or taps the \a slice
+    and holds down the mouse button or gesture.
+*/
+
+/*!
+    \qmlsignal PieSeries::released(PieSlice slice)
+    This signal is emitted when the user releases a previously pressed mouse button
+    or gesture on the \a slice.
+*/
+
+/*!
     Constructs a series object that is a child of \a parent.
 */
 QPieSeries::QPieSeries(QObject *parent)
diff -pruN 6.8.2-4/src/graphs2d/piechart/qpieseries.h 6.9.1-1/src/graphs2d/piechart/qpieseries.h
--- 6.8.2-4/src/graphs2d/piechart/qpieseries.h	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs2d/piechart/qpieseries.h	2025-05-29 02:19:47.000000000 +0000
@@ -1,8 +1,8 @@
 // Copyright (C) 2024 The Qt Company Ltd.
 // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
 
-#ifndef QPIESERIES_H
-#define QPIESERIES_H
+#ifndef QTGRAPHS_QPIESERIES_H
+#define QTGRAPHS_QPIESERIES_H
 
 #include <QtGraphs/qabstractseries.h>
 #include <QtGraphs/qgraphsglobal.h>
@@ -96,6 +96,11 @@ Q_SIGNALS:
     void verticalPositionChanged();
     void holeSizeChanged();
 
+    Q_REVISION(6, 9) void clicked(QPieSlice *slice);
+    Q_REVISION(6, 9) void doubleClicked(QPieSlice *slice);
+    Q_REVISION(6, 9) void pressed(QPieSlice *slice);
+    Q_REVISION(6, 9) void released(QPieSlice *slice);
+
 private:
     friend class PieRenderer;
     Q_DECLARE_PRIVATE(QPieSeries)
@@ -104,4 +109,4 @@ private:
 
 QT_END_NAMESPACE
 
-#endif // QPIESERIES_H
+#endif // QTGRAPHS_QPIESERIES_H
diff -pruN 6.8.2-4/src/graphs2d/piechart/qpieslice.cpp 6.9.1-1/src/graphs2d/piechart/qpieslice.cpp
--- 6.8.2-4/src/graphs2d/piechart/qpieslice.cpp	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs2d/piechart/qpieslice.cpp	2025-05-29 02:19:47.000000000 +0000
@@ -283,7 +283,7 @@ QT_BEGIN_NAMESPACE
     \sa borderColor
 */
 /*!
-    \qmlproperty qreal PieSlice::borderWidth
+    \qmlproperty real PieSlice::borderWidth
     The width of the slice border.
     This is a convenience property for modifying the slice border width.
     \sa borderColor
diff -pruN 6.8.2-4/src/graphs2d/piechart/qpieslice.h 6.9.1-1/src/graphs2d/piechart/qpieslice.h
--- 6.8.2-4/src/graphs2d/piechart/qpieslice.h	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs2d/piechart/qpieslice.h	2025-05-29 02:19:47.000000000 +0000
@@ -1,8 +1,8 @@
 // Copyright (C) 2024 The Qt Company Ltd.
 // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
 
-#ifndef QPIESLICE_H
-#define QPIESLICE_H
+#ifndef QTGRAPHS_QPIESLICE_H
+#define QTGRAPHS_QPIESLICE_H
 
 #include <QtCore/qobject.h>
 #include <QtGraphs/qgraphsglobal.h>
@@ -118,4 +118,4 @@ private:
 
 QT_END_NAMESPACE
 
-#endif // QPIESLICE_H
+#endif // QTGRAPHS_QPIESLICE_H
diff -pruN 6.8.2-4/src/graphs2d/qabstractseries.cpp 6.9.1-1/src/graphs2d/qabstractseries.cpp
--- 6.8.2-4/src/graphs2d/qabstractseries.cpp	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs2d/qabstractseries.cpp	2025-05-29 02:19:47.000000000 +0000
@@ -239,6 +239,7 @@ QT_BEGIN_NAMESPACE
     This signal is emitted when the series hovering starts. The name of the series is in \a seriesName,
     the mouse/touch position in \a position, and the series value in \a value.
     \note This signal is only emitted when \l hoverable is set to true.
+    \note For Pie graph, the value represents (angle of position, start angle of hovering slice)
 */
 
 /*!
@@ -253,6 +254,7 @@ QT_BEGIN_NAMESPACE
     This signal is emitted when the series hovering changes. The name of the series is in \a seriesName,
     the mouse/touch position in \a position, and the series value in \a value.
     \note This signal is only emitted when \l hoverable is set to true.
+    \note For Pie graph, the value represents (angle of position, start angle of hovering slice)
 */
 
 /*!
@@ -396,18 +398,26 @@ void QAbstractSeries::setGraph(QGraphsVi
     if (graph) {
         switch (type()) {
         case SeriesType::Bar:
+#ifdef USE_BARGRAPH
             graph->createBarsRenderer();
+#endif
             break;
         case SeriesType::Scatter:
         case SeriesType::Line:
         case SeriesType::Spline:
+#ifdef USE_POINTS
             graph->createPointRenderer();
+#endif
             break;
         case SeriesType::Pie:
+#ifdef USE_PIEGRAPH
             graph->createPieRenderer();
+#endif
             break;
         case SeriesType::Area:
+#ifdef USE_AREAGRAPH
             graph->createAreaRenderer();
+#endif
             break;
         default:
             break;
diff -pruN 6.8.2-4/src/graphs2d/qabstractseries.h 6.9.1-1/src/graphs2d/qabstractseries.h
--- 6.8.2-4/src/graphs2d/qabstractseries.h	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs2d/qabstractseries.h	2025-05-29 02:19:47.000000000 +0000
@@ -1,8 +1,8 @@
 // Copyright (C) 2023 The Qt Company Ltd.
 // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
 
-#ifndef QABSTRACTSERIES_H
-#define QABSTRACTSERIES_H
+#ifndef QTGRAPHS_QABSTRACTSERIES_H
+#define QTGRAPHS_QABSTRACTSERIES_H
 
 #include <QtCore/qobject.h>
 #include <QtGraphs/qabstractaxis.h>
@@ -123,4 +123,4 @@ QT_END_NAMESPACE
 
 Q_DECLARE_METATYPE(QLegendData)
 
-#endif // QABSTRACTSERIES_H
+#endif // QTGRAPHS_QABSTRACTSERIES_H
diff -pruN 6.8.2-4/src/graphs2d/qgraphsview.cpp 6.9.1-1/src/graphs2d/qgraphsview.cpp
--- 6.8.2-4/src/graphs2d/qgraphsview.cpp	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs2d/qgraphsview.cpp	2025-05-29 02:19:47.000000000 +0000
@@ -1,21 +1,36 @@
 // Copyright (C) 2023 The Qt Company Ltd.
 // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
 
+#ifdef USE_AREAGRAPH
 #include <QtGraphs/qareaseries.h>
+#include <private/arearenderer_p.h>
+#endif
+#ifdef USE_BARGRAPH
 #include <QtGraphs/qbarseries.h>
-#include <QtGraphs/qlineseries.h>
+#include <private/barsrenderer_p.h>
+#endif
+#ifdef USE_PIEGRAPH
 #include <QtGraphs/qpieseries.h>
+#include <private/pierenderer_p.h>
+#endif
+#ifdef USE_LINEGRAPH
+#include <QtGraphs/qlineseries.h>
+#endif
+#ifdef USE_SCATTERGRAPH
 #include <QtGraphs/qscatterseries.h>
+#endif
+#ifdef USE_SPLINEGRAPH
 #include <QtGraphs/qsplineseries.h>
-#include <private/qgraphsview_p.h>
-#include <private/arearenderer_p.h>
-#include <private/axisrenderer_p.h>
-#include <private/barsrenderer_p.h>
-#include <private/pierenderer_p.h>
+#endif
+#ifdef USE_POINTS
 #include <private/pointrenderer_p.h>
-#include <private/qabstractaxis_p.h>
-#include <QtQuick/private/qquickrectangle_p.h>
+#endif
 #include <QTimer>
+#include <QtQuick/private/qquickrectangle_p.h>
+#include <QtQuick/private/qquickpinchhandler_p.h>
+#include <private/axisrenderer_p.h>
+#include <private/qabstractaxis_p.h>
+#include <private/qgraphsview_p.h>
 
 QT_BEGIN_NAMESPACE
 
@@ -47,6 +62,17 @@ QGraphsView::QGraphsView(QQuickItem *par
     setAcceptedMouseButtons(Qt::LeftButton);
     setAcceptHoverEvents(true);
     m_defaultTheme = new QGraphsTheme(this);
+    m_pinchHandler = new QQuickPinchHandler(this);
+    m_pinchHandler->setTarget(nullptr);
+
+    QObject::connect(m_pinchHandler,
+                     &QQuickPinchHandler::scaleChanged,
+                     this,
+                     &QGraphsView::onPinchScaleChanged);
+    QObject::connect(m_pinchHandler,
+                     &QQuickPinchHandler::grabChanged,
+                     this,
+                     &QGraphsView::onPinchGrabChanged);
 }
 
 QGraphsView::~QGraphsView()
@@ -60,6 +86,18 @@ QGraphsView::~QGraphsView()
         m_axisY->d_func()->setGraph(nullptr);
 }
 
+void QGraphsView::onPinchScaleChanged(qreal delta)
+{
+    if (m_axisRenderer)
+        m_axisRenderer->handlePinchScale(delta);
+}
+
+void QGraphsView::onPinchGrabChanged(QPointingDevice::GrabTransition transition, QEventPoint point)
+{
+    if (m_axisRenderer)
+        m_axisRenderer->handlePinchGrab(transition, point);
+}
+
 /*!
     \qmlmethod GraphsView::addSeries(AbstractSeries series)
     Appends a \a series into GraphsView.
@@ -111,8 +149,10 @@ void QGraphsView::insertSeries(qsizetype
             QObject::connect(series, &QAbstractSeries::hover,
                              this, &QGraphsView::handleHover);
 
+#ifdef USE_PIEGRAPH
             if (auto pie = qobject_cast<QPieSeries *>(series))
                 connect(pie, &QPieSeries::removed, m_pieRenderer, &PieRenderer::markedDeleted);
+#endif
         }
         polishAndUpdate();
     }
@@ -132,8 +172,10 @@ void QGraphsView::removeSeries(QObject *
         m_seriesList.removeAll(series);
         auto &cleanupSeriesList = m_cleanupSeriesList[getSeriesRendererIndex(series)];
 
+#ifdef USE_PIEGRAPH
         if (auto pie = qobject_cast<QPieSeries *>(series))
             disconnect(pie, &QPieSeries::removed, m_pieRenderer, &PieRenderer::markedDeleted);
+#endif
 
         cleanupSeriesList.append(series);
         polishAndUpdate();
@@ -173,6 +215,10 @@ void QGraphsView::addAxis(QAbstractAxis
         createAxisRenderer();
         polishAndUpdate();
         QObject::connect(axis, &QAbstractAxis::update, this, &QGraphsView::polishAndUpdate);
+        QObject::connect(axis,
+                         &QAbstractAxis::visibleChanged,
+                         this,
+                         &QGraphsView::updateComponentSizes);
     }
 }
 
@@ -195,6 +241,7 @@ void QGraphsView::setGraphSeriesCount(qs
         m_graphSeriesCount = count;
 }
 
+#ifdef USE_BARGRAPH
 void QGraphsView::createBarsRenderer()
 {
     if (!m_barsRenderer) {
@@ -202,6 +249,7 @@ void QGraphsView::createBarsRenderer()
         updateComponentSizes();
     }
 }
+#endif
 
 void QGraphsView::createAxisRenderer()
 {
@@ -212,6 +260,7 @@ void QGraphsView::createAxisRenderer()
     }
 }
 
+#ifdef USE_POINTS
 void QGraphsView::createPointRenderer()
 {
     if (!m_pointRenderer) {
@@ -219,7 +268,9 @@ void QGraphsView::createPointRenderer()
         updateComponentSizes();
     }
 }
+#endif
 
+#ifdef USE_PIEGRAPH
 void QGraphsView::createPieRenderer()
 {
     if (!m_pieRenderer) {
@@ -227,7 +278,9 @@ void QGraphsView::createPieRenderer()
         updateComponentSizes();
     }
 }
+#endif
 
+#ifdef USE_AREAGRAPH
 void QGraphsView::createAreaRenderer()
 {
     if (!m_areaRenderer) {
@@ -235,6 +288,7 @@ void QGraphsView::createAreaRenderer()
         updateComponentSizes();
     }
 }
+#endif
 
 /*!
     \property QGraphsView::axisXSmoothing
@@ -479,36 +533,58 @@ void QGraphsView::updateComponentSizes()
     if (m_axisRenderer)
         m_axisRenderer->setSize(size());
 
+#ifdef USE_BARGRAPH
     if (m_barsRenderer) {
         m_barsRenderer->setX(m_plotArea.x());
         m_barsRenderer->setY(m_plotArea.y());
         m_barsRenderer->setSize(m_plotArea.size());
     }
+#endif
+#ifdef USE_POINTS
     if (m_pointRenderer) {
         m_pointRenderer->setX(m_plotArea.x());
         m_pointRenderer->setY(m_plotArea.y());
         m_pointRenderer->setSize(m_plotArea.size());
     }
+#endif
+#ifdef USE_PIEGRAPH
     if (m_pieRenderer) {
         m_pieRenderer->setX(m_plotArea.x());
         m_pieRenderer->setY(m_plotArea.y());
-
-        // Remove axis widths and heights as there aren't any in Pie
-        auto s = m_plotArea.size();
-        s.setHeight(s.height() + m_axisHeight);
-        s.setWidth(s.width() - m_axisWidth);
-
-        m_pieRenderer->setSize(s);
+        m_pieRenderer->setSize(m_plotArea.size());
     }
+#endif
+#ifdef USE_AREAGRAPH
     if (m_areaRenderer) {
         m_areaRenderer->setX(m_plotArea.x());
         m_areaRenderer->setY(m_plotArea.y());
         m_areaRenderer->setSize(m_plotArea.size());
     }
+#endif
 }
 
 void QGraphsView::componentComplete()
 {
+    if (!m_zoomAreaDelegate && !m_zoomAreaItem) {
+        const QString qmlData = QLatin1StringView(R"QML(
+            import QtQuick;
+            Rectangle {
+                color: "#8888aaff"
+                border.width: 1
+                border.color: "#4466aa"
+            }
+        )QML");
+
+        QQmlComponent *tempZoomAreaDelegate = new QQmlComponent(qmlEngine(this), this);
+        tempZoomAreaDelegate->setData(qmlData.toUtf8(), QUrl());
+
+        m_zoomAreaItem = qobject_cast<QQuickItem *>(
+            tempZoomAreaDelegate->create(tempZoomAreaDelegate->creationContext()));
+        m_zoomAreaItem->setParent(this);
+        m_zoomAreaItem->setParentItem(this);
+        m_zoomAreaItem->setVisible(false);
+    }
+
     if (!m_theme) {
         m_theme = m_defaultTheme;
         QObject::connect(m_theme, &QGraphsTheme::update, this, &QQuickItem::update);
@@ -528,65 +604,59 @@ void QGraphsView::geometryChange(const Q
     ensurePolished();
 }
 
-void QGraphsView::mouseMoveEvent(QMouseEvent *event)
-{
-    bool handled = false;
-
-    // Adjust event position to renderers position
-    QPointF localPos = event->position() - m_plotArea.topLeft();
-    QMouseEvent mappedEvent(event->type(), localPos, event->scenePosition(),
-                            event->globalPosition(), event->button(),
-                            event->buttons(), event->modifiers());
-    mappedEvent.setAccepted(false);
-
-    if (m_pointRenderer)
-        handled |= m_pointRenderer->handleMouseMove(&mappedEvent);
-
-    if (!handled)
-        event->ignore();
-    else
-        polishAndUpdate();
-}
-
-void QGraphsView::mousePressEvent(QMouseEvent *event)
+void QGraphsView::hoverMoveEvent(QHoverEvent *event)
 {
     bool handled = false;
 
     // Adjust event position to renderers position
     QPointF localPos = event->position() - m_plotArea.topLeft();
-    QMouseEvent mappedEvent(event->type(), localPos, event->scenePosition(),
-                            event->globalPosition(), event->button(),
-                            event->buttons(), event->modifiers());
+    QHoverEvent mappedEvent(event->type(), localPos,event->globalPosition(),
+                            event->oldPosF(), event->modifiers());
     mappedEvent.setAccepted(false);
 
+#ifdef USE_BARGRAPH
     if (m_barsRenderer)
-        handled |= m_barsRenderer->handleMousePress(&mappedEvent);
+        handled |= m_barsRenderer->handleHoverMove(&mappedEvent);
+#endif
 
+#ifdef USE_POINTS
     if (m_pointRenderer)
-        handled |= m_pointRenderer->handleMousePress(&mappedEvent);
+        handled |= m_pointRenderer->handleHoverMove(&mappedEvent);
+#endif
+
+#ifdef USE_PIEGRAPH
+    if (m_pieRenderer)
+        handled |= m_pieRenderer->handleHoverMove(&mappedEvent);
+#endif
 
+#ifdef USE_AREAGRAPH
     if (m_areaRenderer)
-        handled |= m_areaRenderer->handleMousePress(&mappedEvent);
+        handled |= m_areaRenderer->handleHoverMove(&mappedEvent);
+#endif
 
     if (!handled)
         event->ignore();
-    else
-        polishAndUpdate();
 }
 
-void QGraphsView::mouseReleaseEvent(QMouseEvent *event)
+void QGraphsView::wheelEvent(QWheelEvent *event)
 {
     bool handled = false;
 
     // Adjust event position to renderers position
     QPointF localPos = event->position() - m_plotArea.topLeft();
-    QMouseEvent mappedEvent(event->type(), localPos, event->scenePosition(),
-                            event->globalPosition(), event->button(),
-                            event->buttons(), event->modifiers());
+    QWheelEvent mappedEvent(localPos,
+                            event->globalPosition(),
+                            event->pixelDelta(),
+                            event->angleDelta(),
+                            event->buttons(),
+                            event->modifiers(),
+                            event->phase(),
+                            event->inverted(),
+                            event->source());
     mappedEvent.setAccepted(false);
 
-    if (m_pointRenderer)
-        handled |= m_pointRenderer->handleMouseRelease(&mappedEvent);
+    if (m_axisRenderer)
+        handled |= m_axisRenderer->handleWheel(&mappedEvent);
 
     if (!handled)
         event->ignore();
@@ -594,80 +664,80 @@ void QGraphsView::mouseReleaseEvent(QMou
         polishAndUpdate();
 }
 
-void QGraphsView::hoverMoveEvent(QHoverEvent *event)
-{
-    bool handled = false;
-
-    // Adjust event position to renderers position
-    QPointF localPos = event->position() - m_plotArea.topLeft();
-    QHoverEvent mappedEvent(event->type(), localPos,event->globalPosition(),
-                            event->oldPosF(), event->modifiers());
-    mappedEvent.setAccepted(false);
-
-    if (m_barsRenderer)
-        handled |= m_barsRenderer->handleHoverMove(&mappedEvent);
-
-    if (m_pointRenderer)
-        handled |= m_pointRenderer->handleHoverMove(&mappedEvent);
-
-    if (m_areaRenderer)
-        handled |= m_areaRenderer->handleHoverMove(&mappedEvent);
-
-    if (!handled)
-        event->ignore();
-}
-
 QSGNode *QGraphsView::updatePaintNode(QSGNode *oldNode, QQuickItem::UpdatePaintNodeData *updatePaintNodeData)
 {
     Q_UNUSED(updatePaintNodeData);
 
     for (auto series : std::as_const(m_seriesList)) {
+#ifdef USE_BARGRAPH
         if (m_barsRenderer) {
             if (auto barSeries = qobject_cast<QBarSeries *>(series))
                 m_barsRenderer->updateSeries(barSeries);
         }
+#endif
 
+#ifdef USE_POINTS
         if (m_pointRenderer) {
+#ifdef USE_LINEGRAPH
             if (auto lineSeries = qobject_cast<QLineSeries *>(series))
                 m_pointRenderer->updateSeries(lineSeries);
-
+#endif
+#ifdef USE_SCATTERGRAPH
             if (auto scatterSeries = qobject_cast<QScatterSeries *>(series))
                 m_pointRenderer->updateSeries(scatterSeries);
-
+#endif
+#ifdef USE_SPLINEGRAPH
             if (auto splineSeries = qobject_cast<QSplineSeries *>(series))
                 m_pointRenderer->updateSeries(splineSeries);
+#endif
         }
+#endif
 
+#ifdef USE_PIEGRAPH
         if (m_pieRenderer) {
             if (auto pieSeries = qobject_cast<QPieSeries *>(series))
                 m_pieRenderer->updateSeries(pieSeries);
         }
+#endif
 
+#ifdef USE_AREAGRAPH
         if (m_areaRenderer) {
             if (auto areaSeries = qobject_cast<QAreaSeries *>(series))
                 m_areaRenderer->updateSeries(areaSeries);
         }
+#endif
     }
 
+#ifdef USE_BARGRAPH
     if (m_barsRenderer) {
         auto &cleanupSeriesList = m_cleanupSeriesList[0];
         m_barsRenderer->afterUpdate(cleanupSeriesList);
         cleanupSeriesList.clear();
     }
+#endif
+
+#ifdef USE_POINTS
     if (m_pointRenderer) {
         auto &cleanupSeriesList = m_cleanupSeriesList[1];
         m_pointRenderer->afterUpdate(cleanupSeriesList);
         cleanupSeriesList.clear();
     }
+#endif
+
+#ifdef USE_AREAGRAPH
     if (m_areaRenderer) {
         auto &cleanupSeriesList = m_cleanupSeriesList[2];
         m_areaRenderer->afterUpdate(cleanupSeriesList);
     }
+#endif
+
+#ifdef USE_PIEGRAPH
     if (m_pieRenderer) {
         auto &cleanupSeriesList = m_cleanupSeriesList[3];
         m_pieRenderer->afterUpdate(cleanupSeriesList);
         cleanupSeriesList.clear();
     }
+#endif
 
     // Now possibly dirty theme has been taken into use
     m_theme->resetThemeDirty();
@@ -701,50 +771,71 @@ void QGraphsView::updatePolish()
 
     // Polish for all series
     for (auto series : std::as_const(m_seriesList)) {
+#ifdef USE_BARGRAPH
         if (m_barsRenderer) {
             if (auto barSeries = qobject_cast<QBarSeries*>(series))
                 m_barsRenderer->handlePolish(barSeries);
         }
+#endif
 
+#ifdef USE_POINTS
         if (m_pointRenderer) {
+#ifdef USE_LINEGRAPH
             if (auto lineSeries = qobject_cast<QLineSeries *>(series))
                 m_pointRenderer->handlePolish(lineSeries);
+#endif
 
+#ifdef USE_SCATTERGRAPH
             if (auto scatterSeries = qobject_cast<QScatterSeries *>(series))
                 m_pointRenderer->handlePolish(scatterSeries);
+#endif
 
-            if (auto splineSeries = qobject_cast<QSplineSeries *>(series)) {
+#ifdef USE_SPLINEGRAPH
+            if (auto splineSeries = qobject_cast<QSplineSeries *>(series))
                 m_pointRenderer->handlePolish(splineSeries);
-            }
+#endif
         }
+#endif
 
+#ifdef USE_PIEGRAPH
         if (m_pieRenderer) {
             if (auto pieSeries = qobject_cast<QPieSeries *>(series))
                 m_pieRenderer->handlePolish(pieSeries);
         }
+#endif
 
+#ifdef USE_AREAGRAPH
         if (m_areaRenderer) {
             if (auto areaSeries = qobject_cast<QAreaSeries *>(series))
                 m_areaRenderer->handlePolish(areaSeries);
         }
+#endif
     }
 
+#ifdef USE_BARGRAPH
     if (m_barsRenderer) {
         auto &cleanupSeriesList = m_cleanupSeriesList[0];
         m_barsRenderer->afterPolish(cleanupSeriesList);
     }
+#endif
+#ifdef USE_POINTS
     if (m_pointRenderer) {
         auto &cleanupSeriesList = m_cleanupSeriesList[1];
         m_pointRenderer->afterPolish(cleanupSeriesList);
     }
+#endif
+#ifdef USE_AREAGRAPH
     if (m_areaRenderer) {
         auto &cleanupSeriesList = m_cleanupSeriesList[2];
         m_areaRenderer->afterPolish(cleanupSeriesList);
     }
+#endif
+#ifdef USE_PIEGRAPH
     if (m_pieRenderer) {
         auto &cleanupSeriesList = m_cleanupSeriesList[3];
         m_pieRenderer->afterPolish(cleanupSeriesList);
     }
+#endif
 }
 
 void QGraphsView::polishAndUpdate()
@@ -909,6 +1000,21 @@ void QGraphsView::setMarginRight(qreal n
     emit marginRightChanged();
 }
 
+/*!
+    \property QGraphsView::plotArea
+    \since 6.9
+    \brief The rectangle within which the graph is drawn.
+
+    This is the QGraphsView area minus axis areas and margins.
+    \sa marginTop, marginBottom, marginLeft, marginRight
+*/
+/*!
+    \qmlproperty rect GraphsView::plotArea
+    \since 6.9
+    The rectangle within which the graph is drawn.
+    This is the GraphsView area minus axis areas and margins.
+    \sa marginTop, marginBottom, marginLeft, marginRight
+*/
 QRectF QGraphsView::plotArea() const
 {
     return m_plotArea;
@@ -916,33 +1022,78 @@ QRectF QGraphsView::plotArea() const
 
 void QGraphsView::updateAxisAreas()
 {
+    if (m_axisX && !m_axisX->isVisible()) {
+        m_axisXLabelsMargin = 0;
+        m_axisTickersHeight = 0;
+        m_axisLabelsHeight = 0;
+    } else {
+        m_axisTickersHeight = m_defaultAxisTickersHeight;
+        m_axisLabelsHeight = m_defaultAxisLabelsHeight;
+        m_axisXLabelsMargin = m_defaultAxisXLabelsMargin;
+    }
+
+    if (m_axisY && !m_axisY->isVisible()) {
+        m_axisTickersWidth = 0;
+        m_axisLabelsWidth = 0;
+        m_axisYLabelsMargin = 0;
+    } else {
+        m_axisLabelsWidth = m_defaultAxisLabelsWidth;
+        m_axisTickersWidth = m_defaultAxisTickersWidth;
+        m_axisYLabelsMargin = m_defaultAxisYLabelsMargin;
+    }
+
     QRectF r = { m_marginLeft,
                  m_marginTop,
                  width() - m_marginLeft - m_marginRight,
                  height() - m_marginTop - m_marginBottom };
     m_axisHeight = m_axisLabelsHeight + m_axisXLabelsMargin + m_axisTickersHeight;
     m_axisWidth = m_axisLabelsWidth + m_axisYLabelsMargin + m_axisTickersWidth;
-    float leftPadding = m_axisWidth;
-    float topPadding = 0;
-    m_xAxisArea = { r.x() + leftPadding, r.y() + r.height() - m_axisHeight,
-                    r.width() - m_axisWidth, m_axisHeight };
-    m_xAxisLabelsArea = { m_xAxisArea.x(),
-                          m_xAxisArea.y() + m_axisTickersHeight + m_axisXLabelsMargin,
-                          m_xAxisArea.width(),
-                          m_axisTickersHeight };
-    m_xAxisTickersArea = { m_xAxisArea.x(),
-                           m_xAxisArea.y(),
-                           m_xAxisArea.width(),
-                           m_axisTickersHeight };
-    m_yAxisArea = { r.x(), r.y() + topPadding, m_axisWidth, r.height() - m_axisHeight };
-    m_yAxisLabelsArea = { m_yAxisArea.x(),
-                          m_yAxisArea.y(),
-                          m_axisLabelsWidth,
-                          m_yAxisArea.height() };
-    m_yAxisTickersArea = { m_yAxisArea.x() + m_axisLabelsWidth + m_axisYLabelsMargin,
-                           m_yAxisArea.y(),
-                           m_axisTickersWidth,
-                           m_yAxisArea.height() };
+    float leftPadding = (m_axisY && m_axisY->alignment() == Qt::AlignLeft) ? m_axisWidth : 0;
+    float topPadding = (m_axisX && m_axisX->alignment() == Qt::AlignTop) ? m_axisHeight : 0;
+    if (m_axisX && m_axisX->alignment() == Qt::AlignTop) {
+        m_xAxisArea = { r.x() + leftPadding, r.y(), r.width() - m_axisWidth, m_axisHeight};
+        m_xAxisLabelsArea = { m_xAxisArea.x(),
+                              m_xAxisArea.y(),
+                              m_xAxisArea.width(),
+                              m_axisLabelsHeight };
+        m_xAxisTickersArea = { m_xAxisArea.x(),
+                               m_xAxisArea.y() + m_axisLabelsHeight + m_axisXLabelsMargin,
+                               m_xAxisArea.width(),
+                               m_axisTickersHeight };
+    } else {
+        m_xAxisArea = { r.x() + leftPadding, r.y() + r.height() - m_axisHeight,
+                        r.width() - m_axisWidth, m_axisHeight };
+        m_xAxisLabelsArea = { m_xAxisArea.x(),
+                              m_xAxisArea.y() + m_axisTickersHeight + m_axisXLabelsMargin,
+                              m_xAxisArea.width(),
+                              m_axisTickersHeight };
+        m_xAxisTickersArea = { m_xAxisArea.x(),
+                               m_xAxisArea.y(),
+                               m_xAxisArea.width(),
+                               m_axisTickersHeight };
+    }
+    if (m_axisY && m_axisY->alignment() == Qt::AlignLeft) {
+        m_yAxisArea = { r.x(), r.y() + topPadding, m_axisWidth, r.height() - m_axisHeight };
+        m_yAxisLabelsArea = { m_yAxisArea.x(),
+                              m_yAxisArea.y(),
+                              m_axisLabelsWidth,
+                              m_yAxisArea.height() };
+        m_yAxisTickersArea = { m_yAxisArea.x() + m_axisLabelsWidth + m_axisYLabelsMargin,
+                               m_yAxisArea.y(),
+                               m_axisTickersWidth,
+                               m_yAxisArea.height() };
+    } else {
+        m_yAxisArea = { r.x() + r.width() - m_axisWidth, r.y() + topPadding,
+                        m_axisWidth, r.height() - m_axisHeight };
+        m_yAxisLabelsArea = { m_yAxisArea.x() + m_axisTickersWidth + m_axisYLabelsMargin,
+                              m_yAxisArea.y(),
+                              m_axisLabelsWidth,
+                              m_yAxisArea.height() };
+        m_yAxisTickersArea = { m_yAxisArea.x(),
+                               m_yAxisArea.y(),
+                               m_axisTickersWidth,
+                               m_yAxisArea.height() };
+    }
 }
 
 void QGraphsView::updatePlotArea()
@@ -952,14 +1103,21 @@ void QGraphsView::updatePlotArea()
     qreal y = m_marginTop;
     qreal w = width() - x - m_marginRight;
     qreal h = height() - y - m_marginBottom;
-    x += m_axisWidth;
-    h -= m_axisHeight;
-    w -= m_axisWidth;
+    if (m_axisX && m_axisX->alignment() == Qt::AlignTop)
+        y += m_axisHeight;
+    if (m_axisY && m_axisY->alignment() != Qt::AlignRight)
+        x += m_axisWidth;
+    if (m_axisX)
+        h -= m_axisHeight;
+    if (m_axisY)
+        w -= m_axisWidth;
     w = qMax(w, 0.0);
     h = qMax(h, 0.0);
     QRectF plotArea = QRectF(x, y, w, h);
-    if (plotArea != m_plotArea)
+    if (plotArea != m_plotArea) {
         m_plotArea = plotArea;
+        emit plotAreaChanged();
+    }
 }
 
 /*!
@@ -985,8 +1143,11 @@ void QGraphsView::setAxisX(QAbstractAxis
         return;
     removeAxis(m_axisX);
     m_axisX = axis;
-    if (axis)
+    if (axis) {
+        if (axis->alignment() != Qt::AlignBottom && axis->alignment() != Qt::AlignTop)
+            axis->setAlignment(Qt::AlignBottom);
         addAxis(axis);
+    }
     emit axisXChanged();
     emit update();
 }
@@ -1014,8 +1175,11 @@ void QGraphsView::setAxisY(QAbstractAxis
         return;
     removeAxis(m_axisY);
     m_axisY = axis;
-    if (axis)
+    if (axis) {
+        if (axis->alignment() != Qt::AlignLeft && axis->alignment() != Qt::AlignRight)
+            axis->setAlignment(Qt::AlignLeft);
         addAxis(axis);
+    }
     emit axisYChanged();
     emit update();
 }
@@ -1052,6 +1216,179 @@ void QGraphsView::setOrientation(Qt::Ori
     emit update();
 }
 
+/*!
+    \enum QGraphsView::ZoomStyle
+    This enum value describes the zoom style of the graph:
+
+    \value None
+        Zooming is disabled.
+    \value Center
+        Pinch zoom and mouse wheel zoom towards the center of the graph view.
+*/
+
+/*!
+    \property QGraphsView::zoomStyle
+    \brief Zoom style of the GraphsView.
+
+    Determines the zoom style of the QGraphsView. Zooming works by
+    manipulating the QValueAxis zoom property. The default value
+    is \c {QGraphsView::ZoomStyle::None}.
+*/
+/*!
+    \qmlproperty enumeration GraphsView::zoomStyle
+    Determines the zoom style of the GraphsView. Zooming works by
+    manipulating the ValueAxis zoom property. The default value
+    is \c {GraphsView.ZoomStyle.None}.
+
+    \value GraphsView.ZoomStyle.None
+        Zooming is disabled.
+    \value GraphsView.ZoomStyle.Center
+        Pinch zoom and mouse wheel zoom towards the center of the graph view.
+
+*/
+QGraphsView::ZoomStyle QGraphsView::zoomStyle() const
+{
+    return m_zoomStyle;
+}
+
+void QGraphsView::setZoomStyle(ZoomStyle newZoomStyle)
+{
+    if (m_zoomStyle == newZoomStyle)
+        return;
+    m_zoomStyle = newZoomStyle;
+    emit zoomStyleChanged();
+}
+
+/*!
+    \enum QGraphsView::PanStyle
+    This enum value describes the pan style of the graph:
+
+    \value None
+        Panning is disabled.
+    \value Drag
+        Mouse and touch drag pan the view around.
+*/
+
+/*!
+    \property QGraphsView::panStyle
+    \brief Pan style of the GraphsView.
+
+    Determines the pan style of the QGraphsView. Panning works by
+    manipulating the pan property of a QValueAxis.
+    The default value is \c {QGraphsView::PanStyle::None}.
+*/
+/*!
+    \qmlproperty enumeration GraphsView::panStyle
+    Determines the pan style of the GraphsView. Panning works by
+    manipulating the pan property of a ValueAxis.
+    The default value is \c {GraphsView.PanStyle.None}.
+
+    \value GraphsView.PanStyle.None
+        Panning is disabled.
+    \value GraphsView.PanStyle.Drag
+        Mouse and touch drag pan the view around.
+*/
+QGraphsView::PanStyle QGraphsView::panStyle() const
+{
+    return m_panStyle;
+}
+
+void QGraphsView::setPanStyle(PanStyle newPanStyle)
+{
+    if (m_panStyle == newPanStyle)
+        return;
+    m_panStyle = newPanStyle;
+    emit panStyleChanged();
+}
+
+/*!
+    \property QGraphsView::zoomAreaEnabled
+    \brief Enables zoom area
+
+    Zoom area changes mouse and touch dragging to draw a box determined
+    by \c zoomAreaDelegate. Upon release the graph QValueAxis zoom and pan
+    properties are changed so that the view covers only the area intersected
+    by the drawn box.
+    \sa zoomAreaDelegate
+*/
+/*!
+    \qmlproperty bool GraphsView::zoomAreaEnabled
+    Zoom area changes mouse and touch dragging to draw a box determined
+    by \c zoomAreaDelegate. Upon release the graph ValueAxis zoom and pan
+    properties are changed so that the view covers only the area intersected
+    by the drawn box.
+    \sa zoomAreaDelegate
+*/
+bool QGraphsView::zoomAreaEnabled() const
+{
+    return m_zoomAreaEnabled;
+}
+
+void QGraphsView::setZoomAreaEnabled(bool newZoomAreaEnabled)
+{
+    if (m_zoomAreaEnabled == newZoomAreaEnabled)
+        return;
+    m_zoomAreaEnabled = newZoomAreaEnabled;
+    emit zoomAreaEnabledChanged();
+}
+
+/*!
+    \property QGraphsView::zoomAreaDelegate
+    \brief Zoom area visual delegate
+
+    Determines the QML element that is drawn when the user performs a drag
+    motion to zoom in to an area.
+*/
+/*!
+    \qmlproperty Component GraphsView::zoomAreaDelegate
+    Determines the QML element that is drawn when the user performs a drag
+    motion to zoom in to an area.
+*/
+QQmlComponent *QGraphsView::zoomAreaDelegate() const
+{
+    return m_zoomAreaDelegate;
+}
+
+void QGraphsView::setZoomAreaDelegate(QQmlComponent *newZoomAreaDelegate)
+{
+    if (m_zoomAreaDelegate == newZoomAreaDelegate)
+        return;
+    m_zoomAreaDelegate = newZoomAreaDelegate;
+
+    if (m_zoomAreaDelegate) {
+        m_zoomAreaItem = qobject_cast<QQuickItem *>(
+            m_zoomAreaDelegate->create(m_zoomAreaDelegate->creationContext()));
+        m_zoomAreaItem->setParent(this);
+        m_zoomAreaItem->setParentItem(this);
+        m_zoomAreaItem->setVisible(false);
+    }
+
+    emit zoomAreaDelegateChanged();
+}
+
+/*!
+    \property QGraphsView::zoomSensitivity
+    \brief Zoom value change sensitivity
+
+    Determines how fast zoom value changes while zooming.
+*/
+/*!
+    \qmlproperty real GraphsView::zoomSensitivity
+    Determines how fast zoom value changes while zooming.
+*/
+qreal QGraphsView::zoomSensitivity() const
+{
+    return m_zoomSensitivity;
+}
+
+void QGraphsView::setZoomSensitivity(qreal newZoomSensitivity)
+{
+    if (qFuzzyCompare(m_zoomSensitivity, newZoomSensitivity))
+        return;
+    m_zoomSensitivity = newZoomSensitivity;
+    emit zoomSensitivityChanged();
+}
+
 int QGraphsView::getSeriesRendererIndex(QAbstractSeries *series)
 {
     int index = 0;
diff -pruN 6.8.2-4/src/graphs2d/qgraphsview_p.h 6.9.1-1/src/graphs2d/qgraphsview_p.h
--- 6.8.2-4/src/graphs2d/qgraphsview_p.h	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs2d/qgraphsview_p.h	2025-05-29 02:19:47.000000000 +0000
@@ -29,6 +29,7 @@ class BarsRenderer;
 class PointRenderer;
 class PieRenderer;
 class AreaRenderer;
+class QQuickPinchHandler;
 
 class Q_GRAPHS_EXPORT QGraphsView : public QQuickItem
 {
@@ -39,6 +40,7 @@ class Q_GRAPHS_EXPORT QGraphsView : publ
     Q_PROPERTY(qreal marginBottom READ marginBottom WRITE setMarginBottom NOTIFY marginBottomChanged FINAL)
     Q_PROPERTY(qreal marginLeft READ marginLeft WRITE setMarginLeft NOTIFY marginLeftChanged FINAL)
     Q_PROPERTY(qreal marginRight READ marginRight WRITE setMarginRight NOTIFY marginRightChanged FINAL)
+    Q_PROPERTY(QRectF plotArea READ plotArea NOTIFY plotAreaChanged REVISION(6, 9))
 
     Q_PROPERTY(qreal axisXSmoothing READ axisXSmoothing WRITE setAxisXSmoothing NOTIFY axisXSmoothingChanged FINAL)
     Q_PROPERTY(qreal axisYSmoothing READ axisYSmoothing WRITE setAxisYSmoothing NOTIFY axisYSmoothingChanged FINAL)
@@ -57,6 +59,16 @@ class Q_GRAPHS_EXPORT QGraphsView : publ
     Q_PROPERTY(
         Qt::Orientation orientation READ orientation WRITE setOrientation NOTIFY orientationChanged FINAL)
 
+    Q_PROPERTY(ZoomStyle zoomStyle READ zoomStyle WRITE setZoomStyle NOTIFY zoomStyleChanged REVISION(6, 9))
+    Q_PROPERTY(PanStyle panStyle READ panStyle WRITE setPanStyle NOTIFY panStyleChanged REVISION(6, 9))
+    Q_PROPERTY(qreal zoomSensitivity READ zoomSensitivity WRITE setZoomSensitivity NOTIFY
+                   zoomSensitivityChanged REVISION(6, 9))
+
+    Q_PROPERTY(bool zoomAreaEnabled READ zoomAreaEnabled WRITE setZoomAreaEnabled NOTIFY
+                   zoomAreaEnabledChanged REVISION(6, 9))
+    Q_PROPERTY(QQmlComponent *zoomAreaDelegate READ zoomAreaDelegate WRITE setZoomAreaDelegate
+                   NOTIFY zoomAreaDelegateChanged REVISION(6, 9))
+
     Q_CLASSINFO("DefaultProperty", "seriesList")
     QML_NAMED_ELEMENT(GraphsView)
 
@@ -105,11 +117,19 @@ public:
     qsizetype graphSeriesCount() const;
     void setGraphSeriesCount(qsizetype count);
 
+#ifdef USE_BARGRAPH
     void createBarsRenderer();
+#endif
     void createAxisRenderer();
+#ifdef USE_POINTS
     void createPointRenderer();
+#endif
+#ifdef USE_PIEGRAPH
     void createPieRenderer();
+#endif
+#ifdef USE_AREAGRAPH
     void createAreaRenderer();
+#endif
 
     qreal axisXSmoothing() const;
     void setAxisXSmoothing(qreal smoothing);
@@ -140,6 +160,27 @@ public:
     Qt::Orientation orientation() const;
     void setOrientation(Qt::Orientation newOrientation);
 
+    enum class ZoomStyle { None, Center };
+    Q_ENUM(ZoomStyle)
+
+    enum class PanStyle { None, Drag };
+    Q_ENUM(PanStyle)
+
+    ZoomStyle zoomStyle() const;
+    void setZoomStyle(ZoomStyle newZoomStyle);
+
+    PanStyle panStyle() const;
+    void setPanStyle(PanStyle newPanStyle);
+
+    bool zoomAreaEnabled() const;
+    void setZoomAreaEnabled(bool newZoomAreaEnabled);
+
+    QQmlComponent *zoomAreaDelegate() const;
+    void setZoomAreaDelegate(QQmlComponent *newZoomAreaDelegate);
+
+    qreal zoomSensitivity() const;
+    void setZoomSensitivity(qreal newZoomSensitivity);
+
 protected:
     void handleHoverEnter(const QString &seriesName, QPointF position, QPointF value);
     void handleHoverExit(const QString &seriesName, QPointF position);
@@ -147,10 +188,8 @@ protected:
     void updateComponentSizes();
     void componentComplete() override;
     void geometryChange(const QRectF &newGeometry, const QRectF &oldGeometry) override;
-    void mouseMoveEvent(QMouseEvent *event) override;
-    void mousePressEvent(QMouseEvent *event) override;
-    void mouseReleaseEvent(QMouseEvent *event) override;
     void hoverMoveEvent(QHoverEvent *event) override;
+    void wheelEvent(QWheelEvent *event) override;
     QSGNode *updatePaintNode(QSGNode *oldNode, QQuickItem::UpdatePaintNodeData *updatePaintNodeData) override;
     void updatePolish() override;
 
@@ -160,6 +199,7 @@ Q_SIGNALS:
     void marginBottomChanged();
     void marginLeftChanged();
     void marginRightChanged();
+    Q_REVISION(6, 9) void plotAreaChanged();
     void hoverEnter(const QString &seriesName, QPointF position, QPointF value);
     void hoverExit(const QString &seriesName, QPointF position);
     void hover(const QString &seriesName, QPointF position, QPointF value);
@@ -180,6 +220,14 @@ Q_SIGNALS:
 
     void orientationChanged();
 
+    Q_REVISION(6, 9) void zoomStyleChanged();
+    Q_REVISION(6, 9) void panStyleChanged();
+
+    Q_REVISION(6, 9) void zoomAreaEnabledChanged();
+    Q_REVISION(6, 9) void zoomAreaDelegateChanged();
+
+    Q_REVISION(6, 9) void zoomSensitivityChanged();
+
 private:
     friend class AxisRenderer;
     friend class BarsRenderer;
@@ -189,6 +237,15 @@ private:
 
     void polishAndUpdate();
     int getSeriesRendererIndex(QAbstractSeries *series);
+    void onPinchScaleChanged(qreal delta);
+    void onPinchGrabChanged(QPointingDevice::GrabTransition transition, QEventPoint point);
+
+    static constexpr qreal m_defaultAxisTickersWidth = 15;
+    static constexpr qreal m_defaultAxisTickersHeight = 15;
+    static constexpr qreal m_defaultAxisLabelsWidth = 40;
+    static constexpr qreal m_defaultAxisLabelsHeight = 25;
+    static constexpr qreal m_defaultAxisXLabelsMargin = 0;
+    static constexpr qreal m_defaultAxisYLabelsMargin = 5;
 
     AxisRenderer *m_axisRenderer = nullptr;
     BarsRenderer *m_barsRenderer = nullptr;
@@ -223,12 +280,12 @@ private:
     QRectF m_xAxisLabelsArea;
     QRectF m_yAxisLabelsArea;
     // Note: Add properties for these
-    qreal m_axisTickersWidth = 15;
-    qreal m_axisTickersHeight = 15;
-    qreal m_axisLabelsWidth = 40;
-    qreal m_axisLabelsHeight = 25;
-    qreal m_axisXLabelsMargin = 0;
-    qreal m_axisYLabelsMargin = 5;
+    qreal m_axisTickersWidth = m_defaultAxisTickersWidth;
+    qreal m_axisTickersHeight = m_defaultAxisTickersHeight;
+    qreal m_axisLabelsWidth = m_defaultAxisLabelsWidth;
+    qreal m_axisLabelsHeight = m_defaultAxisLabelsHeight;
+    qreal m_axisXLabelsMargin = m_defaultAxisXLabelsMargin;
+    qreal m_axisYLabelsMargin = m_defaultAxisYLabelsMargin;
     // Calculated based the the above
     qreal m_axisWidth = 0;
     qreal m_axisHeight = 0;
@@ -245,6 +302,15 @@ private:
     qreal m_shadowXOffset = 0.0;
     qreal m_shadowYOffset = 0.0;
     qreal m_shadowSmoothing = 4.0;
+
+    ZoomStyle m_zoomStyle = ZoomStyle::None;
+    PanStyle m_panStyle = PanStyle::None;
+    qreal m_zoomSensitivity = 0.05f;
+
+    bool m_zoomAreaEnabled = false;
+    QQmlComponent *m_zoomAreaDelegate = nullptr;
+    QQuickItem *m_zoomAreaItem = nullptr;
+    QQuickPinchHandler *m_pinchHandler = nullptr;
 };
 
 QT_END_NAMESPACE
diff -pruN 6.8.2-4/src/graphs2d/qsgrenderer/arearenderer.cpp 6.9.1-1/src/graphs2d/qsgrenderer/arearenderer.cpp
--- 6.8.2-4/src/graphs2d/qsgrenderer/arearenderer.cpp	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs2d/qsgrenderer/arearenderer.cpp	2025-05-29 02:19:47.000000000 +0000
@@ -10,6 +10,7 @@
 #include <private/qareaseries_p.h>
 #include <private/qgraphsview_p.h>
 #include <private/qxyseries_p.h>
+#include <QtQuick/private/qquicktaphandler_p.h>
 
 QT_BEGIN_NAMESPACE
 
@@ -21,6 +22,11 @@ AreaRenderer::AreaRenderer(QGraphsView *
     setClip(true);
     m_shape.setParentItem(this);
     m_shape.setPreferredRendererType(QQuickShape::CurveRenderer);
+
+    m_tapHandler = new QQuickTapHandler(this);
+    connect(m_tapHandler, &QQuickTapHandler::singleTapped, this, &AreaRenderer::onSingleTapped);
+    connect(m_tapHandler, &QQuickTapHandler::doubleTapped, this, &AreaRenderer::onDoubleTapped);
+    connect(m_tapHandler, &QQuickTapHandler::pressedChanged, this, &AreaRenderer::onPressedChanged);
 }
 
 AreaRenderer::~AreaRenderer()
@@ -135,14 +141,17 @@ void AreaRenderer::handlePolish(QAreaSer
 
     auto &&upperPoints = upper->points();
     QList<QPointF> fittedPoints;
+#ifdef USE_SPLINEGRAPH
     if (upper->type() == QAbstractSeries::SeriesType::Spline)
         fittedPoints = qobject_cast<QSplineSeries *>(upper)->getControlPoints();
+#endif
 
     int extraPointCount = lower ? 0 : 3;
 
     if (series->isVisible()) {
         for (int i = 0, j = 0; i < upperPoints.size() + extraPointCount; ++i, ++j) {
-            qreal x, y;
+            qreal x;
+            qreal y;
             if (i == upperPoints.size())
                 calculateRenderCoordinates(upperPoints[upperPoints.size() - 1].x(), 0, &x, &y);
             else if (i == upperPoints.size() + 1)
@@ -176,8 +185,10 @@ void AreaRenderer::handlePolish(QAreaSer
     if (lower && series->isVisible()) {
         auto &&lowerPoints = lower->points();
         QList<QPointF> fittedPoints;
+#ifdef USE_SPLINEGRAPH
         if (lower->type() == QAbstractSeries::SeriesType::Spline)
             fittedPoints = qobject_cast<QSplineSeries *>(lower)->getControlPoints();
+#endif
 
         for (int i = 0, j = 0; i < lowerPoints.size(); ++i, ++j) {
             qreal x, y;
@@ -328,27 +339,6 @@ bool AreaRenderer::pointInArea(QPoint pt
     return false;
 }
 
-bool AreaRenderer::handleMousePress(QMouseEvent *event)
-{
-    bool handled = false;
-    for (auto &&group : m_groups) {
-        if (!group->series->isSelectable() || !group->series->isVisible())
-            continue;
-
-        if (!group->series->upperSeries() || group->series->upperSeries()->count() < 2)
-            continue;
-
-        if (group->series->lowerSeries() && group->series->lowerSeries()->count() < 2)
-            continue;
-
-        if (pointInArea(event->pos(), group->series)) {
-            group->series->setSelected(!group->series->isSelected());
-            handled = true;
-        }
-    }
-    return handled;
-}
-
 bool AreaRenderer::handleHoverMove(QHoverEvent *event)
 {
     bool handled = false;
@@ -390,4 +380,77 @@ bool AreaRenderer::handleHoverMove(QHove
     return handled;
 }
 
+void AreaRenderer::onSingleTapped(QEventPoint eventPoint, Qt::MouseButton button)
+{
+    Q_UNUSED(button)
+
+    for (auto &&group : m_groups) {
+        if (!group->series->isSelectable() || !group->series->isVisible())
+            continue;
+
+        if (!group->series->upperSeries() || group->series->upperSeries()->count() < 2)
+            continue;
+
+        if (group->series->lowerSeries() && group->series->lowerSeries()->count() < 2)
+            continue;
+
+        if (pointInArea(eventPoint.position().toPoint(), group->series)) {
+            group->series->setSelected(!group->series->isSelected());
+            m_graph->polishAndUpdate();
+            qreal x;
+            qreal y;
+            calculateAxisCoordinates(eventPoint.position().x(), eventPoint.position().y(), &x, &y);
+            emit group->series->clicked(QPoint(x, y));
+        }
+    }
+}
+
+void AreaRenderer::onDoubleTapped(QEventPoint eventPoint, Qt::MouseButton button)
+{
+    Q_UNUSED(button)
+
+    for (auto &&group : m_groups) {
+        if (!group->series->isSelectable() || !group->series->isVisible())
+            continue;
+
+        if (!group->series->upperSeries() || group->series->upperSeries()->count() < 2)
+            continue;
+
+        if (group->series->lowerSeries() && group->series->lowerSeries()->count() < 2)
+            continue;
+
+        if (pointInArea(eventPoint.position().toPoint(), group->series)) {
+            qreal x;
+            qreal y;
+            calculateAxisCoordinates(eventPoint.position().x(), eventPoint.position().y(), &x, &y);
+            emit group->series->doubleClicked(QPoint(x, y));
+        }
+    }
+}
+
+void AreaRenderer::onPressedChanged()
+{
+    QPointF position = m_tapHandler->point().position();
+    for (auto &&group : m_groups) {
+        if (!group->series->isSelectable() || !group->series->isVisible())
+            continue;
+
+        if (!group->series->upperSeries() || group->series->upperSeries()->count() < 2)
+            continue;
+
+        if (group->series->lowerSeries() && group->series->lowerSeries()->count() < 2)
+            continue;
+
+        if (pointInArea(position.toPoint(), group->series)) {
+            qreal x;
+            qreal y;
+            calculateAxisCoordinates(position.x(), position.y(), &x, &y);
+            if (m_tapHandler->isPressed())
+                emit group->series->pressed(QPoint(x, y));
+            else
+                emit group->series->released(QPoint(x, y));
+        }
+    }
+}
+
 QT_END_NAMESPACE
diff -pruN 6.8.2-4/src/graphs2d/qsgrenderer/arearenderer_p.h 6.9.1-1/src/graphs2d/qsgrenderer/arearenderer_p.h
--- 6.8.2-4/src/graphs2d/qsgrenderer/arearenderer_p.h	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs2d/qsgrenderer/arearenderer_p.h	2025-05-29 02:19:47.000000000 +0000
@@ -24,6 +24,7 @@ class QGraphsView;
 class QAreaSeries;
 class AxisRenderer;
 class QAbstractSeries;
+class QQuickTapHandler;
 
 class AreaRenderer : public QQuickItem
 {
@@ -36,7 +37,6 @@ public:
     void afterPolish(QList<QAbstractSeries *> &cleanupSeries);
     void afterUpdate(QList<QAbstractSeries *> &cleanupSeries);
     void updateSeries(QAreaSeries *series);
-    bool handleMousePress(QMouseEvent *event);
     bool handleHoverMove(QHoverEvent *event);
 
 Q_SIGNALS:
@@ -52,6 +52,10 @@ private:
         bool hover = false;
     };
 
+    void onSingleTapped(QEventPoint eventPoint, Qt::MouseButton button);
+    void onDoubleTapped(QEventPoint eventPoint, Qt::MouseButton button);
+    void onPressedChanged();
+
     QGraphsView *m_graph = nullptr;
     QQuickShape m_shape;
     QMap<QAreaSeries *, PointGroup *> m_groups;
@@ -64,6 +68,8 @@ private:
     qreal m_areaWidth = 0;
     qreal m_areaHeight = 0;
 
+    QQuickTapHandler *m_tapHandler = nullptr;
+
     void calculateRenderCoordinates(qreal origX, qreal origY, qreal *renderX, qreal *renderY) const;
     void calculateAxisCoordinates(qreal origX, qreal origY, qreal *axisX, qreal *axisY) const;
     bool pointInArea(QPoint pt, QAreaSeries *series) const;
diff -pruN 6.8.2-4/src/graphs2d/qsgrenderer/axisrenderer.cpp 6.9.1-1/src/graphs2d/qsgrenderer/axisrenderer.cpp
--- 6.8.2-4/src/graphs2d/qsgrenderer/axisrenderer.cpp	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs2d/qsgrenderer/axisrenderer.cpp	2025-05-29 02:19:47.000000000 +0000
@@ -1,7 +1,9 @@
 // Copyright (C) 2023 The Qt Company Ltd.
 // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
 
+#ifdef USE_BARGRAPH
 #include <QtGraphs/QBarCategoryAxis>
+#endif
 #include <QtGraphs/QGraphsTheme>
 #include <private/axisrenderer_p.h>
 #include <private/qabstractaxis_p.h>
@@ -9,6 +11,7 @@
 #include <private/qdatetimeaxis_p.h>
 #include <private/qgraphsview_p.h>
 #include <private/qvalueaxis_p.h>
+#include <QtQuick/private/qquickdraghandler_p.h>
 
 QT_BEGIN_NAMESPACE
 
@@ -17,6 +20,14 @@ AxisRenderer::AxisRenderer(QQuickItem *p
 {
     m_graph = qobject_cast<QGraphsView *>(parent);
     setFlag(QQuickItem::ItemHasContents);
+
+    m_dragHandler = new QQuickDragHandler(this);
+    m_dragHandler->setDragThreshold(0);
+    m_dragHandler->setTarget(nullptr);
+    connect(m_dragHandler, &QQuickDragHandler::translationChanged,
+            this, &AxisRenderer::onTranslationChanged);
+    connect(m_dragHandler, &QQuickDragHandler::grabChanged,
+            this, &AxisRenderer::onGrabChanged);
 }
 
 AxisRenderer::~AxisRenderer() {}
@@ -54,6 +65,187 @@ void AxisRenderer::initialize() {
     m_initialized = true;
 }
 
+QVector2D AxisRenderer::windowToAxisCoords(QVector2D coords)
+{
+    float x = coords.x();
+    float y = coords.y();
+    x /= width() - m_graph->m_marginLeft - m_graph->m_marginRight - m_graph->m_axisWidth;
+    y /= height() - m_graph->m_marginTop - m_graph->m_marginBottom - m_graph->m_axisHeight;
+    x *= m_axisHorizontalValueRange;
+    y *= m_axisVerticalValueRange;
+    return QVector2D(x, y);
+}
+
+bool AxisRenderer::zoom(qreal delta)
+{
+    if (m_graph->zoomStyle() != QGraphsView::ZoomStyle::Center)
+        return false;
+
+    auto haxis = qobject_cast<QValueAxis *>(m_axisHorizontal);
+    auto vaxis = qobject_cast<QValueAxis *>(m_axisVertical);
+
+    if (!haxis && !vaxis)
+        return false;
+
+    QVector2D zoom(1.0, 1.0);
+    if (haxis)
+        zoom.setX(haxis->zoom());
+
+    if (vaxis)
+        zoom.setY(vaxis->zoom());
+
+    QVector2D change;
+    if (delta > 0)
+        change = zoom * m_graph->m_zoomSensitivity;
+    else if (delta < 0)
+        change = -zoom * m_graph->m_zoomSensitivity;
+
+    zoom += change;
+
+    if (zoom.x() < 0.01f)
+        zoom.setX(0.01f);
+    if (zoom.y() < 0.01f)
+        zoom.setY(0.01f);
+
+    if (haxis)
+        haxis->setZoom(zoom.x());
+
+    if (vaxis)
+        vaxis->setZoom(zoom.y());
+
+    return true;
+}
+
+bool AxisRenderer::handleWheel(QWheelEvent *event)
+{
+    return zoom(-event->angleDelta().y());
+}
+
+void AxisRenderer::handlePinchScale(qreal delta)
+{
+    zoom(delta - 1.0);
+}
+
+void AxisRenderer::handlePinchGrab(QPointingDevice::GrabTransition transition, QEventPoint point)
+{
+    Q_UNUSED(transition)
+    Q_UNUSED(point)
+}
+
+void AxisRenderer::onTranslationChanged(QVector2D delta)
+{
+    if (!m_dragState.dragging)
+        return;
+
+    m_dragState.delta += delta;
+
+    if (m_graph->zoomAreaEnabled() && m_graph->m_zoomAreaItem) {
+        m_graph->m_zoomAreaItem->setVisible(true);
+
+        qreal x = m_dragState.touchPositionAtPress.x();
+        if (m_dragState.delta.x() < 0)
+            x += m_dragState.delta.x();
+
+        qreal y = m_dragState.touchPositionAtPress.y();
+        if (m_dragState.delta.y() < 0)
+            y += m_dragState.delta.y();
+
+        qreal width = qAbs(m_dragState.delta.x());
+        qreal height = qAbs(m_dragState.delta.y());
+
+        m_graph->m_zoomAreaItem->setX(x);
+        m_graph->m_zoomAreaItem->setY(y);
+        m_graph->m_zoomAreaItem->setWidth(width);
+        m_graph->m_zoomAreaItem->setHeight(height);
+    }
+
+    if (m_graph->panStyle() != QGraphsView::PanStyle::Drag)
+        return;
+
+    auto haxis = qobject_cast<QValueAxis *>(m_axisHorizontal);
+    auto vaxis = qobject_cast<QValueAxis *>(m_axisVertical);
+
+    if (!haxis && !vaxis)
+        return;
+
+    QVector2D change(m_dragState.delta);
+    change = windowToAxisCoords(change);
+    change.setX(-change.x());
+
+    if (haxis)
+        haxis->setPan(m_dragState.panAtPress.x() + change.x());
+
+    if (vaxis)
+        vaxis->setPan(m_dragState.panAtPress.y() + change.y());
+}
+
+void AxisRenderer::onGrabChanged(QPointingDevice::GrabTransition transition, QEventPoint point)
+{
+    const QPointF position = point.position();
+
+    if (transition == QPointingDevice::GrabPassive
+        && point.pressPosition() == point.position()) {
+        auto haxis = qobject_cast<QValueAxis *>(m_axisHorizontal);
+        auto vaxis = qobject_cast<QValueAxis *>(m_axisVertical);
+
+        if (!haxis && !vaxis)
+            return;
+
+        m_dragState.dragging = true;
+        m_dragState.touchPositionAtPress = QVector2D(position);
+        m_dragState.delta = QVector2D(0, 0);
+
+        if (haxis)
+            m_dragState.panAtPress.setX(haxis->pan());
+
+        if (vaxis)
+            m_dragState.panAtPress.setY(vaxis->pan());
+    } else if (m_dragState.dragging && transition == QPointingDevice::UngrabPassive) {
+        m_dragState.dragging = false;
+
+        if (!m_graph->zoomAreaEnabled())
+            return;
+
+        if (m_graph->m_zoomAreaItem)
+            m_graph->m_zoomAreaItem->setVisible(false);
+
+        auto haxis = qobject_cast<QValueAxis *>(m_axisHorizontal);
+        auto vaxis = qobject_cast<QValueAxis *>(m_axisVertical);
+
+        if (!haxis && !vaxis)
+            return;
+
+        QVector2D zoomBoxEnd(position);
+        auto center = (m_dragState.touchPositionAtPress + zoomBoxEnd) / 2;
+        auto size = (m_dragState.touchPositionAtPress - zoomBoxEnd);
+        size.setX(qAbs(size.x()));
+        size.setY(qAbs(size.y()));
+
+        if (int(size.x()) == 0 || int(size.y()) == 0)
+            return;
+
+        size = windowToAxisCoords(size);
+
+        if (haxis)
+            haxis->setZoom(m_axisHorizontalValueRangeZoomless / size.x());
+
+        if (vaxis)
+            vaxis->setZoom(m_axisVerticalValueRangeZoomless / size.y());
+
+        center -= QVector2D(m_graph->m_marginLeft + m_graph->m_axisWidth, m_graph->m_marginTop);
+
+        center = windowToAxisCoords(center);
+
+        center -= QVector2D(m_axisHorizontalValueRange / 2.0f, m_axisVerticalValueRange / 2.0f);
+
+        if (haxis)
+            haxis->setPan(haxis->pan() + center.x());
+
+        if (vaxis)
+            vaxis->setPan(vaxis->pan() - center.y());
+    }
+}
+
 void AxisRenderer::handlePolish()
 {
     if (!m_axisGrid) {
@@ -170,21 +362,31 @@ void AxisRenderer::updateAxis()
     if (m_axisVertical) {
         m_gridVerticalLinesVisible = gridVisible && m_axisVertical->isGridVisible();
         m_gridVerticalSubLinesVisible = gridVisible && m_axisVertical->isSubGridVisible();
+        m_verticalAxisOnRight = m_axisVertical->alignment() == Qt::AlignRight;
     }
     if (m_axisHorizontal) {
         m_gridHorizontalLinesVisible = gridVisible && m_axisHorizontal->isGridVisible();
         m_gridHorizontalSubLinesVisible = gridVisible && m_axisHorizontal->isSubGridVisible();
+        m_horizontalAxisOnTop = m_axisHorizontal->alignment() == Qt::AlignTop;
     }
 
     if (auto vaxis = qobject_cast<QValueAxis *>(m_axisVertical)) {
-        m_axisVerticalMaxValue = vaxis->max();
-        m_axisVerticalMinValue = vaxis->min();
         double step = vaxis->tickInterval();
 
+        qreal diff = vaxis->max() - vaxis->min();
+        qreal center = diff / 2.0f + vaxis->min() + vaxis->pan();
+
+        diff /= vaxis->zoom();
+
+        m_axisVerticalMaxValue = center + diff / 2.0f;
+        m_axisVerticalMinValue = center - diff / 2.0f;
+
         m_axisVerticalValueRange = m_axisVerticalMaxValue - m_axisVerticalMinValue;
+        m_axisVerticalValueRangeZoomless = vaxis->max() - vaxis->min();
+
         // If step is not manually defined (or it is invalid), calculate autostep
         if (step <= 0)
-            step = getValueStepsFromRange(m_axisVerticalValueRange);
+            step = getValueStepsFromRange(vaxis->max() - vaxis->min());
 
         // Get smallest tick label value
         double minLabel = vaxis->tickAnchor();
@@ -206,14 +408,22 @@ void AxisRenderer::updateAxis()
     }
 
     if (auto haxis = qobject_cast<QValueAxis *>(m_axisHorizontal)) {
-        m_axisHorizontalMaxValue = haxis->max();
-        m_axisHorizontalMinValue = haxis->min();
         double step = haxis->tickInterval();
 
+        qreal diff = haxis->max() - haxis->min();
+        qreal center = diff / 2.0f + haxis->min() + haxis->pan();
+
+        diff /= haxis->zoom();
+
+        m_axisHorizontalMaxValue = center + diff / 2.0f;
+        m_axisHorizontalMinValue = center - diff / 2.0f;
+
         m_axisHorizontalValueRange = m_axisHorizontalMaxValue - m_axisHorizontalMinValue;
+        m_axisHorizontalValueRangeZoomless = haxis->max() - haxis->min();
+
         // If step is not manually defined (or it is invalid), calculate autostep
         if (step <= 0)
-            step = getValueStepsFromRange(m_axisHorizontalValueRange);
+            step = getValueStepsFromRange(haxis->max() - haxis->min());
 
         // Get smallest tick label value
         double minLabel = haxis->tickAnchor();
@@ -236,6 +446,7 @@ void AxisRenderer::updateAxis()
         updateValueXAxisLabels(haxis, m_graph->m_xAxisLabelsArea);
     }
 
+#ifdef USE_BARGRAPH
     if (auto haxis = qobject_cast<QBarCategoryAxis *>(m_axisHorizontal)) {
         m_axisHorizontalMaxValue = haxis->categories().size();
         m_axisHorizontalMinValue = 0;
@@ -248,6 +459,7 @@ void AxisRenderer::updateAxis()
         m_axisVerticalValueRange = m_axisVerticalMaxValue - m_axisVerticalMinValue;
         updateBarYAxisLabels(vaxis, m_graph->m_yAxisLabelsArea);
     }
+#endif
 
     if (auto vaxis = qobject_cast<QDateTimeAxis *>(m_axisVertical)) {
         // Todo: make constant for all axis, or clamp in class? (QTBUG-124736)
@@ -567,7 +779,10 @@ void AxisRenderer::updateAxisTitles(cons
         m_xAxisTitle->setText(m_axisHorizontal->titleText());
         m_xAxisTitle->setX((2 * xAxisRect.x() - m_xAxisTitle->contentWidth() + xAxisRect.width())
                            * 0.5);
-        m_xAxisTitle->setY(xAxisRect.y() + xAxisRect.height());
+        if (m_horizontalAxisOnTop)
+            m_xAxisTitle->setY(xAxisRect.y() - m_xAxisTitle->contentHeight() * 0.5);
+        else
+            m_xAxisTitle->setY(xAxisRect.y() + xAxisRect.height());
         if (m_axisHorizontal->titleColor().isValid())
             m_xAxisTitle->setColor(m_axisHorizontal->titleColor());
         else
@@ -580,7 +795,10 @@ void AxisRenderer::updateAxisTitles(cons
 
     if (m_axisVertical && m_axisVertical->isTitleVisible()) {
         m_yAxisTitle->setText(m_axisVertical->titleText());
-        m_yAxisTitle->setX(0 + m_yAxisTitle->height() - m_yAxisTitle->contentWidth() * 0.5);
+        if (m_verticalAxisOnRight)
+            m_yAxisTitle->setX(yAxisRect.x() + m_yAxisTitle->height());
+        else
+            m_yAxisTitle->setX(yAxisRect.x() + m_yAxisTitle->height() - m_yAxisTitle->contentWidth() * 0.5);
         m_yAxisTitle->setY((2 * yAxisRect.y() - m_yAxisTitle->contentHeight() + yAxisRect.height())
                            * 0.5);
         m_yAxisTitle->setRotation(-90);
@@ -645,6 +863,7 @@ void AxisRenderer::setLabelTextPropertie
     }
 }
 
+#ifdef USE_BARGRAPH
 void AxisRenderer::updateBarXAxisLabels(QBarCategoryAxis *axis, const QRectF rect)
 {
     qsizetype categoriesCount = axis->categories().size();
@@ -714,6 +933,7 @@ void AxisRenderer::updateBarYAxisLabels(
         textIndex++;
     }
 }
+#endif
 
 void AxisRenderer::updateValueYAxisLabels(QValueAxis *axis, const QRectF rect)
 {
@@ -751,8 +971,14 @@ void AxisRenderer::updateValueYAxisLabel
             if (decimals < 0)
                 decimals = getValueDecimalsFromRange(m_axisVerticalValueRange);
             const QString f = axis->labelFormat();
-            char format = f.isEmpty() ? 'f' : f.front().toLatin1();
-            QString label = QString::number(number, format, decimals);
+            QString label;
+            if (f.length() <= 1) {
+              char format = f.isEmpty() ? 'f' : f.front().toLatin1();
+              label = QString::number(number, format, decimals);
+            } else {
+              QByteArray array = f.toLatin1();
+              label = QString::asprintf(array.constData(), number);
+            }
             if (m_verticalAxisOnRight) {
                 setLabelTextProperties(textItem, label, false,
                                        QQuickText::HAlignment::AlignLeft,
@@ -810,8 +1036,14 @@ void AxisRenderer::updateValueXAxisLabel
             if (decimals < 0)
                 decimals = getValueDecimalsFromRange(m_axisHorizontalValueRange);
             const QString f = axis->labelFormat();
-            char format = f.isEmpty() ? 'f' : f.front().toLatin1();
-            QString label = QString::number(number, format, decimals);
+            QString label;
+            if (f.length() <= 1) {
+              char format = f.isEmpty() ? 'f' : f.front().toLatin1();
+              label = QString::number(number, format, decimals);
+            } else {
+              QByteArray array = f.toLatin1();
+              label = QString::asprintf(array.constData(), number);
+            }
             if (m_horizontalAxisOnTop) {
                 setLabelTextProperties(textItem, label, true,
                                        QQuickText::HAlignment::AlignHCenter,
diff -pruN 6.8.2-4/src/graphs2d/qsgrenderer/axisrenderer_p.h 6.9.1-1/src/graphs2d/qsgrenderer/axisrenderer_p.h
--- 6.8.2-4/src/graphs2d/qsgrenderer/axisrenderer_p.h	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs2d/qsgrenderer/axisrenderer_p.h	2025-05-29 02:19:47.000000000 +0000
@@ -31,6 +31,7 @@ class QBarCategoryAxis;
 class QValueAxis;
 class QGraphsTheme;
 class QDateTimeAxis;
+class QQuickDragHandler;
 
 class AxisRenderer : public QQuickItem
 {
@@ -46,14 +47,20 @@ public:
     void updateAxisGrid();
     void updateAxisGridShadow();
     void updateAxisTitles(const QRectF xAxisRect, const QRectF yAxisRect);
+#ifdef USE_BARGRAPH
     void updateBarXAxisLabels(QBarCategoryAxis *axis, const QRectF rect);
     void updateBarYAxisLabels(QBarCategoryAxis *axis, const QRectF rect);
+#endif
     void updateValueYAxisLabels(QValueAxis *axis, const QRectF rect);
     void updateValueXAxisLabels(QValueAxis *axis, const QRectF rect);
     void updateDateTimeYAxisLabels(QDateTimeAxis *axis, const QRectF rect);
     void updateDateTimeXAxisLabels(QDateTimeAxis *axis, const QRectF rect);
     void initialize();
 
+    bool handleWheel(QWheelEvent *event);
+    void handlePinchScale(qreal delta);
+    void handlePinchGrab(QPointingDevice::GrabTransition transition, QEventPoint point);
+
 Q_SIGNALS:
 
 private:
@@ -63,12 +70,17 @@ private:
     friend class PointRenderer;
     friend class AreaRenderer;
 
+    void onTranslationChanged(QVector2D delta);
+    void onGrabChanged(QPointingDevice::GrabTransition transition, QEventPoint point);
+
     double getValueStepsFromRange(double range);
     int getValueDecimalsFromRange(double range);
     void setLabelTextProperties(QQuickItem *item, const QString &text, bool xAxis,
                                 QQuickText::HAlignment hAlign = QQuickText::HAlignment::AlignHCenter,
                                 QQuickText::VAlignment vAlign = QQuickText::VAlignment::AlignVCenter);
     void updateAxisLabelItems(QList<QQuickItem *> &textItems, qsizetype neededSize, QQmlComponent *component);
+    QVector2D windowToAxisCoords(QVector2D coords);
+    bool zoom(qreal delta);
 
     QGraphsView *m_graph = nullptr;
     QGraphsTheme *theme();
@@ -111,7 +123,7 @@ private:
     double m_axisYDisplacement = 0;
     // The value of smallest label
     double m_axisVerticalMinLabel = 0;
-
+    double m_axisVerticalValueRangeZoomless = 0;
 
     // Horizontal axis
     // Max value
@@ -128,6 +140,7 @@ private:
     double m_axisXDisplacement = 0;
     // The value of smallest label
     double m_axisHorizontalMinLabel = 0;
+    double m_axisHorizontalValueRangeZoomless = 0;
 
     double m_axisVerticalSubGridScale = 0.5;
     double m_axisHorizontalSubGridScale = 0.5;
@@ -135,6 +148,18 @@ private:
     bool m_gridVerticalLinesVisible = true;
     bool m_gridHorizontalSubLinesVisible = false;
     bool m_gridVerticalSubLinesVisible = false;
+
+    QQuickDragHandler *m_dragHandler = nullptr;
+
+    struct DragState
+    {
+        bool dragging = false;
+        QVector2D touchPositionAtPress;
+        QVector2D panAtPress;
+        QVector2D delta;
+    };
+
+    DragState m_dragState;
 };
 
 QT_END_NAMESPACE
diff -pruN 6.8.2-4/src/graphs2d/qsgrenderer/barsrenderer.cpp 6.9.1-1/src/graphs2d/qsgrenderer/barsrenderer.cpp
--- 6.8.2-4/src/graphs2d/qsgrenderer/barsrenderer.cpp	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs2d/qsgrenderer/barsrenderer.cpp	2025-05-29 02:19:47.000000000 +0000
@@ -2,6 +2,7 @@
 // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
 
 #include <QtQuick/private/qquickrectangle_p.h>
+#include <QtQuick/private/qquicktaphandler_p.h>
 #include <QtGraphs/qbarseries.h>
 #include <QtGraphs/qbarset.h>
 #include <private/barsrenderer_p.h>
@@ -17,6 +18,7 @@ static const char* TAG_BAR_BORDER_WIDTH
 static const char* TAG_BAR_SELECTED = "barSelected";
 static const char* TAG_BAR_VALUE = "barValue";
 static const char* TAG_BAR_LABEL = "barLabel";
+static const char* TAG_BAR_INDEX = "barIndex";
 
 BarsRenderer::BarsRenderer(QGraphsView *graph)
     : QQuickItem(graph)
@@ -24,6 +26,11 @@ BarsRenderer::BarsRenderer(QGraphsView *
 {
     setFlag(QQuickItem::ItemHasContents);
     setClip(true);
+
+    m_tapHandler = new QQuickTapHandler(this);
+    connect(m_tapHandler, &QQuickTapHandler::singleTapped, this, &BarsRenderer::onSingleTapped);
+    connect(m_tapHandler, &QQuickTapHandler::doubleTapped, this, &BarsRenderer::onDoubleTapped);
+    connect(m_tapHandler, &QQuickTapHandler::pressedChanged, this, &BarsRenderer::onPressedChanged);
 }
 
 BarsRenderer::~BarsRenderer() {}
@@ -179,6 +186,8 @@ void BarsRenderer::updateComponents(QBar
                     barItem->setProperty(TAG_BAR_VALUE, d.value);
                 if (barItem->property(TAG_BAR_LABEL).isValid())
                     barItem->setProperty(TAG_BAR_LABEL, d.label);
+                if (barItem->property(TAG_BAR_INDEX).isValid())
+                    barItem->setProperty(TAG_BAR_INDEX, barIndex);
             } else {
                 // Set default rectangle bars
                 auto barItem = qobject_cast<QQuickRectangle *>(barItems[barIndex]);
@@ -562,28 +571,6 @@ void BarsRenderer::afterPolish(QList<QAb
     }
 }
 
-bool BarsRenderer::handleMousePress(QMouseEvent *event)
-{
-    bool handled = false;
-    for (auto &rectNodesInputRects : m_rectNodesInputRects) {
-        for (auto &barSelection : rectNodesInputRects) {
-            if (!barSelection.series->isSelectable())
-                continue;
-            qsizetype indexInSet = 0;
-            for (auto &rect : barSelection.rects) {
-                if (rect.contains(event->pos())) {
-                    // TODO: Currently just toggling selection
-                    QList<qsizetype> indexList = {indexInSet};
-                    barSelection.barSet->toggleSelection(indexList);
-                    handled = true;
-                }
-                indexInSet++;
-            }
-        }
-    }
-    return handled;
-}
-
 bool BarsRenderer::handleHoverMove(QHoverEvent *event)
 {
     bool handled = false;
@@ -621,4 +608,68 @@ bool BarsRenderer::handleHoverMove(QHove
     return handled;
 }
 
+void BarsRenderer::onSingleTapped(QEventPoint eventPoint, Qt::MouseButton button)
+{
+    Q_UNUSED(button)
+
+    for (auto &rectNodesInputRects : m_rectNodesInputRects) {
+        for (auto &barSelection : rectNodesInputRects) {
+            if (!barSelection.series->isSelectable())
+                continue;
+            qsizetype indexInSet = 0;
+            for (auto &rect : barSelection.rects) {
+                if (rect.contains(eventPoint.position())) {
+                    emit barSelection.series->clicked(indexInSet, barSelection.barSet);
+                    return;
+                }
+                indexInSet++;
+            }
+        }
+    }
+}
+
+void BarsRenderer::onDoubleTapped(QEventPoint eventPoint, Qt::MouseButton button)
+{
+    Q_UNUSED(button)
+
+    for (auto &rectNodesInputRects : m_rectNodesInputRects) {
+        for (auto &barSelection : rectNodesInputRects) {
+            if (!barSelection.series->isSelectable())
+                continue;
+            qsizetype indexInSet = 0;
+            for (auto &rect : barSelection.rects) {
+                if (rect.contains(eventPoint.position())) {
+                    emit barSelection.series->doubleClicked(indexInSet, barSelection.barSet);
+                    return;
+                }
+                indexInSet++;
+            }
+        }
+    }
+}
+
+void BarsRenderer::onPressedChanged()
+{
+    for (auto &rectNodesInputRects : m_rectNodesInputRects) {
+        for (auto &barSelection : rectNodesInputRects) {
+            if (!barSelection.series->isSelectable())
+                continue;
+            qsizetype indexInSet = 0;
+            for (auto &rect : barSelection.rects) {
+                if (rect.contains(m_tapHandler->point().position())) {
+                    // TODO: Currently just toggling selection
+                    if (m_tapHandler->isPressed()) {
+                        QList<qsizetype> indexList = {indexInSet};
+                        barSelection.barSet->toggleSelection(indexList);
+                        emit barSelection.series->pressed(indexInSet, barSelection.barSet);
+                    } else {
+                        emit barSelection.series->released(indexInSet, barSelection.barSet);
+                    }
+                }
+                indexInSet++;
+            }
+        }
+    }
+}
+
 QT_END_NAMESPACE
diff -pruN 6.8.2-4/src/graphs2d/qsgrenderer/barsrenderer_p.h 6.9.1-1/src/graphs2d/qsgrenderer/barsrenderer_p.h
--- 6.8.2-4/src/graphs2d/qsgrenderer/barsrenderer_p.h	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs2d/qsgrenderer/barsrenderer_p.h	2025-05-29 02:19:47.000000000 +0000
@@ -27,6 +27,7 @@ class QGraphsView;
 class QBarSeries;
 class QBarSet;
 class QAbstractSeries;
+class QQuickTapHandler;
 
 class BarsRenderer : public QQuickItem
 {
@@ -39,7 +40,6 @@ public:
     void updateSeries(QBarSeries *series);
     void afterUpdate(QList<QAbstractSeries *> &cleanupSeries);
     void afterPolish(QList<QAbstractSeries *> &cleanupSeries);
-    bool handleMousePress(QMouseEvent *event);
     bool handleHoverMove(QHoverEvent *event);
 
 Q_SIGNALS:
@@ -72,12 +72,18 @@ private:
     void updateComponents(QBarSeries *series);
     void updateValueLabels(QBarSeries *series);
 
+    void onSingleTapped(QEventPoint eventPoint, Qt::MouseButton button);
+    void onDoubleTapped(QEventPoint eventPoint, Qt::MouseButton button);
+    void onPressedChanged();
+
     QGraphsView *m_graph = nullptr;
     QHash<QBarSeries *, QList<BarSelectionRect>> m_rectNodesInputRects;
     QHash<QBarSeries *, QList<QQuickItem *>> m_barItems;
     QHash<QBarSeries *, QList<QQuickText *>> m_labelTextItems;
     QHash<QBarSeries *, QList<BarSeriesData>> m_seriesData;
 
+    QQuickTapHandler *m_tapHandler = nullptr;
+
     QBarSeries *m_currentHoverSeries = nullptr;
     qsizetype m_colorIndex = -1;
     // Margin between bars.
diff -pruN 6.8.2-4/src/graphs2d/qsgrenderer/pierenderer.cpp 6.9.1-1/src/graphs2d/qsgrenderer/pierenderer.cpp
--- 6.8.2-4/src/graphs2d/qsgrenderer/pierenderer.cpp	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs2d/qsgrenderer/pierenderer.cpp	2025-05-29 02:19:47.000000000 +0000
@@ -4,6 +4,7 @@
 #include <QtGraphs/qpieseries.h>
 #include <QtGraphs/qpieslice.h>
 #include <QtQuick/private/qquicktext_p.h>
+#include <QtQuick/private/qquicktaphandler_p.h>
 #include <private/pierenderer_p.h>
 #include <private/qabstractseries_p.h>
 #include <private/qgraphsview_p.h>
@@ -23,6 +24,11 @@ PieRenderer::PieRenderer(QGraphsView *gr
     m_shape = new QQuickShape(this);
     m_shape->setParentItem(this);
     m_shape->setPreferredRendererType(QQuickShape::CurveRenderer);
+
+    m_tapHandler = new QQuickTapHandler(this);
+    connect(m_tapHandler, &QQuickTapHandler::singleTapped, this, &PieRenderer::onSingleTapped);
+    connect(m_tapHandler, &QQuickTapHandler::doubleTapped, this, &PieRenderer::onDoubleTapped);
+    connect(m_tapHandler, &QQuickTapHandler::pressedChanged, this, &PieRenderer::onPressedChanged);
 }
 
 PieRenderer::~PieRenderer() {}
@@ -268,3 +274,127 @@ void PieRenderer::markedDeleted(QList<QP
         m_activeSlices.remove(slice);
     }
 }
+
+bool PieRenderer::isPointInSlice(QPointF point, QPieSlice *slice, qreal *angle)
+{
+    QPieSeries* series = slice->series();
+    QPointF center = QPointF(size().width() * series->horizontalPosition(),
+                             size().height() * series->verticalPosition());
+    qreal radius = size().width() > size().height() ? size().height() : size().width();
+    radius *= (.5 * series->pieSize());
+
+    qreal explodeDistance = .0;
+    if (slice->isExploded())
+        explodeDistance = slice->explodeDistanceFactor() * radius;
+    qreal radian = qDegreesToRadians(slice->startAngle() + (slice->angleSpan() * .5));
+    qreal xShift = center.x() + (explodeDistance * qSin(radian));
+    qreal yShift = center.y() - (explodeDistance * qCos(radian));
+
+    QPointF adjustedPosition = QPointF(point.x() - xShift,
+                                       point.y() - yShift);
+    qreal distance = qSqrt(qPow(adjustedPosition.x(), 2) +
+                           qPow(adjustedPosition.y(), 2));
+    qreal foundAngle = qRadiansToDegrees(qAtan2(adjustedPosition.y(), adjustedPosition.x())) + 90;
+    if (foundAngle < 0)
+        foundAngle += 360;
+
+    if (angle)
+        *angle = foundAngle;
+
+    if (distance <= radius
+        && foundAngle >= slice->startAngle()
+        && foundAngle <= (slice->startAngle() + slice->angleSpan())) {
+        return true;
+    }
+    return false;
+}
+
+bool PieRenderer::handleHoverMove(QHoverEvent *event)
+{
+    bool handled = false;
+    const QPointF &position = event->position();
+
+    bool hovering = false;
+    QList<QPieSlice *> list = m_activeSlices.keys();
+    for (const auto &slice : list) {
+        if (!slice->series()->isHoverable())
+            continue;
+
+        qreal angle;
+        if (isPointInSlice(position, slice, &angle)) {
+            const QString &name = slice->series()->name();
+            const QPointF value(slice->startAngle(), angle);
+
+            if (!m_currentHoverSlice) {
+                m_currentHoverSlice = slice;
+                emit slice->series()->hoverEnter(name, position, value);
+            }
+            if (m_currentHoverSlice != slice) {
+                emit m_currentHoverSlice->series()->hoverExit(name, position);
+                emit slice->series()->hoverEnter(name, position, value);
+                m_currentHoverSlice = slice;
+            }
+
+            emit slice->series()->hover(name, position, value);
+            hovering = true;
+            handled = true;
+        }
+    }
+
+    if (!hovering && m_currentHoverSlice) {
+        emit m_currentHoverSlice->series()->
+            hoverExit(m_currentHoverSlice->series()->name(), position);
+        m_currentHoverSlice = nullptr;
+        handled = true;
+    }
+    return handled;
+}
+
+void PieRenderer::onSingleTapped(QEventPoint eventPoint, Qt::MouseButton button)
+{
+    Q_UNUSED(button)
+
+    QList<QPieSlice *> list = m_activeSlices.keys();
+    for (const auto &pieSlice : list) {
+        if (!pieSlice->series()->isSelectable())
+            continue;
+
+        if (isPointInSlice(eventPoint.position(), pieSlice)) {
+            emit pieSlice->series()->clicked(pieSlice);
+            return;
+        }
+    }
+}
+
+void PieRenderer::onDoubleTapped(QEventPoint eventPoint, Qt::MouseButton button)
+{
+    Q_UNUSED(button)
+
+    QList<QPieSlice *> list = m_activeSlices.keys();
+    for (const auto &pieSlice : list) {
+        if (!pieSlice->series()->isSelectable())
+            continue;
+
+        if (isPointInSlice(eventPoint.position(), pieSlice)) {
+            emit pieSlice->series()->doubleClicked(pieSlice);
+            return;
+        }
+    }
+}
+
+void PieRenderer::onPressedChanged()
+{
+    QList<QPieSlice *> list = m_activeSlices.keys();
+    for (const auto &pieSlice : list) {
+        if (!pieSlice->series()->isSelectable())
+            continue;
+
+        if (isPointInSlice(m_tapHandler->point().position(), pieSlice)) {
+            if (m_tapHandler->isPressed())
+                emit pieSlice->series()->pressed(pieSlice);
+            else
+                emit pieSlice->series()->released(pieSlice);
+            return;
+        }
+    }
+}
diff -pruN 6.8.2-4/src/graphs2d/qsgrenderer/pierenderer_p.h 6.9.1-1/src/graphs2d/qsgrenderer/pierenderer_p.h
--- 6.8.2-4/src/graphs2d/qsgrenderer/pierenderer_p.h	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs2d/qsgrenderer/pierenderer_p.h	2025-05-29 02:19:47.000000000 +0000
@@ -24,6 +24,7 @@ class QPieSeries;
 class QPieSlice;
 class QQuickShape;
 class QAbstractSeries;
+class QQuickTapHandler;
 
 class PieRenderer : public QQuickItem
 {
@@ -40,16 +41,27 @@ public:
 
     void setSize(QSizeF size);
 
+    bool handleHoverMove(QHoverEvent *event);
+
 private:
     struct SliceData
     {
         bool initialized;
     };
 
-    QGraphsView *m_graph;
-    QQuickShape *m_shape;
+    void onSingleTapped(QEventPoint eventPoint, Qt::MouseButton button);
+    void onDoubleTapped(QEventPoint eventPoint, Qt::MouseButton button);
+    void onPressedChanged();
+
+    bool isPointInSlice(QPointF point, QPieSlice *slice, qreal *angle = nullptr);
+
+    QGraphsView *m_graph = nullptr;
+    QQuickShape *m_shape = nullptr;
     QHash<QPieSlice *, SliceData> m_activeSlices;
 
+    QQuickTapHandler *m_tapHandler = nullptr;
+    QPieSlice *m_currentHoverSlice = nullptr;
+
     QPainterPath m_painterPath;
     qsizetype m_colorIndex = -1;
 };
diff -pruN 6.8.2-4/src/graphs2d/qsgrenderer/pointrenderer.cpp 6.9.1-1/src/graphs2d/qsgrenderer/pointrenderer.cpp
--- 6.8.2-4/src/graphs2d/qsgrenderer/pointrenderer.cpp	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs2d/qsgrenderer/pointrenderer.cpp	2025-05-29 02:19:47.000000000 +0000
@@ -1,11 +1,19 @@
 // Copyright (C) 2023 The Qt Company Ltd.
 // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
 
+#ifdef USE_LINEGRAPH
 #include <QtGraphs/qlineseries.h>
+#endif
+#ifdef USE_SCATTERGRAPH
 #include <QtGraphs/qscatterseries.h>
+#endif
+#ifdef USE_SPLINEGRAPH
 #include <QtGraphs/qsplineseries.h>
-#include <private/pointrenderer_p.h>
+#endif
+#include <QtQuick/private/qquickdraghandler_p.h>
+#include <QtQuick/private/qquicktaphandler_p.h>
 #include <private/axisrenderer_p.h>
+#include <private/pointrenderer_p.h>
 #include <private/qabstractseries_p.h>
 #include <private/qgraphsview_p.h>
 #include <private/qxyseries_p.h>
@@ -19,6 +27,7 @@ static const char *TAG_POINT_SELECTED_CO
 static const char *TAG_POINT_SELECTED = "pointSelected";
 static const char *TAG_POINT_VALUE_X = "pointValueX";
 static const char *TAG_POINT_VALUE_Y = "pointValueY";
+static const char *TAG_POINT_INDEX = "pointIndex";
 
 PointRenderer::PointRenderer(QGraphsView *graph)
     : QQuickItem(graph)
@@ -47,6 +56,14 @@ PointRenderer::PointRenderer(QGraphsView
     )QML").arg(QString::number((int) defaultSize()));
     m_tempMarker = new QQmlComponent(qmlEngine(m_graph), this);
     m_tempMarker->setData(qmlData.toUtf8(), QUrl());
+
+    m_tapHandler = new QQuickTapHandler(this);
+    connect(m_tapHandler, &QQuickTapHandler::singleTapped,
+            this, &PointRenderer::onSingleTapped);
+    connect(m_tapHandler, &QQuickTapHandler::doubleTapped,
+            this, &PointRenderer::onDoubleTapped);
+    connect(m_tapHandler, &QQuickTapHandler::pressedChanged,
+            this, &PointRenderer::onPressedChanged);
 }
 
 PointRenderer::~PointRenderer()
@@ -58,10 +75,17 @@ qreal PointRenderer::defaultSize(QXYSeri
 {
     qreal size = 16.0;
     if (series != nullptr) {
+#ifdef USE_LINEGRAPH
         if (auto line = qobject_cast<QLineSeries *>(series))
             size = qMax(size, line->width());
-        else if (auto spline = qobject_cast<QSplineSeries *>(series))
+#endif
+#if defined(USE_LINEGRAPH) && defined(USE_SPLINEGRAPH)
+        else
+#endif
+#ifdef USE_SPLINEGRAPH
+            if (auto spline = qobject_cast<QSplineSeries *>(series))
             size = qMax(size, spline->width());
+#endif
     }
     return size;
 }
@@ -143,6 +167,8 @@ void PointRenderer::updatePointDelegate(
         marker->setProperty(TAG_POINT_VALUE_X, point.x());
     if (marker->property(TAG_POINT_VALUE_Y).isValid())
         marker->setProperty(TAG_POINT_VALUE_Y, point.y());
+    if (marker->property(TAG_POINT_INDEX).isValid())
+        marker->setProperty(TAG_POINT_INDEX, pointIndex);
 
     marker->setX(x - marker->width() / 2.0);
     marker->setY(y - marker->height() / 2.0);
@@ -172,6 +198,89 @@ void PointRenderer::updateLegendData(QXY
     series->d_func()->setLegendData(legendDataList);
 }
 
+void PointRenderer::onSingleTapped(QEventPoint eventPoint, Qt::MouseButton button)
+{
+    Q_UNUSED(button)
+
+    for (auto &&group : m_groups) {
+        if (!group->series->isVisible())
+            continue;
+
+        if (!group->series->isSelectable() && !group->series->isDraggable())
+            continue;
+
+        int index = 0;
+        for (auto &&rect : group->rects) {
+            if (rect.contains(eventPoint.position())) {
+                emit group->series->clicked(group->series->at(index).toPoint());
+                return;
+            }
+            index++;
+        }
+    }
+}
+
+void PointRenderer::onDoubleTapped(QEventPoint eventPoint, Qt::MouseButton button)
+{
+    Q_UNUSED(button)
+
+    for (auto &&group : m_groups) {
+        if (!group->series->isVisible())
+            continue;
+
+        if (!group->series->isSelectable() && !group->series->isDraggable())
+            continue;
+
+        int index = 0;
+        for (auto &&rect : group->rects) {
+            if (rect.contains(eventPoint.position())) {
+                emit group->series->doubleClicked(group->series->at(index).toPoint());
+                return;
+            }
+            index++;
+        }
+    }
+}
+
+void PointRenderer::onPressedChanged()
+{
+    if (m_tapHandler->isPressed()) {
+        for (auto &&group : m_groups) {
+            if (!group->series->isVisible())
+                continue;
+
+            if (!group->series->isSelectable() && !group->series->isDraggable())
+                continue;
+
+            int index = 0;
+            for (auto &&rect : group->rects) {
+                if (rect.contains(m_tapHandler->point().position())) {
+                    m_pressedGroup = group;
+                    m_pressedPointIndex = index;
+                    emit group->series->pressed(m_pressedGroup->series->at(index).toPoint());
+                }
+                index++;
+            }
+        }
+    } else {
+        if (m_pressedGroup
+            && m_pressedGroup->series->isSelectable()
+            && m_pressedGroup->series->isVisible()) {
+            if (m_pressedGroup->rects[m_pressedPointIndex].contains(
+                    m_tapHandler->point().position())) {
+                if (m_pressedGroup->series->isPointSelected(m_pressedPointIndex))
+                    m_pressedGroup->series->deselectPoint(m_pressedPointIndex);
+                else
+                    m_pressedGroup->series->selectPoint(m_pressedPointIndex);
+                m_previousDelta = QPoint(0, 0);
+                emit m_pressedGroup->series->released(
+                    m_pressedGroup->series->at(m_pressedPointIndex).toPoint());
+            }
+        }
+    }
+}
+
+#ifdef USE_SCATTERGRAPH
 void PointRenderer::updateScatterSeries(QScatterSeries *series, QLegendData &legendData)
 {
     auto group = m_groups.value(series);
@@ -183,6 +292,7 @@ void PointRenderer::updateScatterSeries(
         for (int i = 0; i < points.size(); ++i) {
             qreal x, y;
             calculateRenderCoordinates(m_graph->m_axisRenderer, points[i].x(), points[i].y(), &x, &y);
+            y *= series->valuesMultiplier();
             if (group->currentMarker) {
                 updatePointDelegate(series, group, i, x, y);
             } else {
@@ -197,7 +307,9 @@ void PointRenderer::updateScatterSeries(
 
     legendData = { style.color, style.borderColor, series->name() };
 }
+#endif
 
+#ifdef USE_LINEGRAPH
 void PointRenderer::updateLineSeries(QLineSeries *series, QLegendData &legendData)
 {
     auto group = m_groups.value(series);
@@ -224,6 +336,7 @@ void PointRenderer::updateLineSeries(QLi
         for (int i = 0; i < points.size(); ++i) {
             qreal x, y;
             calculateRenderCoordinates(m_graph->m_axisRenderer, points[i].x(), points[i].y(), &x, &y);
+            y *= series->valuesMultiplier();
             if (i == 0)
                 painterPath.moveTo(x, y);
             else
@@ -243,7 +356,9 @@ void PointRenderer::updateLineSeries(QLi
     group->shapePath->setPath(painterPath);
     legendData = { style.color, style.borderColor, series->name() };
 }
+#endif
 
+#ifdef USE_SPLINEGRAPH
 void PointRenderer::updateSplineSeries(QSplineSeries *series, QLegendData &legendData)
 {
     auto group = m_groups.value(series);
@@ -273,6 +388,8 @@ void PointRenderer::updateSplineSeries(Q
             qreal x, y;
             calculateRenderCoordinates(m_graph->m_axisRenderer, points[i].x(), points[i].y(), &x, &y);
 
+            qreal valuesMultiplier = series->valuesMultiplier();
+            y *= valuesMultiplier;
             if (i == 0) {
                 painterPath.moveTo(x, y);
             } else {
@@ -287,6 +404,9 @@ void PointRenderer::updateSplineSeries(Q
                                            fittedPoints[j].y(),
                                            &x2,
                                            &y2);
+
+                y1 *= valuesMultiplier;
+                y2 *= valuesMultiplier;
                 painterPath.cubicTo(x1, y1, x2, y2, x, y);
                 ++j;
             }
@@ -306,6 +426,7 @@ void PointRenderer::updateSplineSeries(Q
     group->shapePath->setPath(painterPath);
     legendData = { style.color, style.borderColor, series->name() };
 }
+#endif
 
 void PointRenderer::handlePolish(QXYSeries *series)
 {
@@ -399,7 +520,50 @@ void PointRenderer::handlePolish(QXYSeri
                     group->currentMarker->create(group->currentMarker->creationContext()));
                 item->setParent(this);
                 item->setParentItem(this);
+                QQuickDragHandler *handler = new QQuickDragHandler(item);
+                handler->setEnabled(series->isDraggable());
+                connect(series, &QXYSeries::draggableChanged, this, [handler, series]() {
+                    handler->setEnabled(series->isDraggable());
+                });
                 group->markers << item;
+                group->dragHandlers << handler;
+
+                connect(handler, &QQuickDragHandler::translationChanged, this, [&]() {
+                    if (m_pressedGroup) {
+                        float w = width();
+                        float h = height();
+                        double maxVertical
+                            = m_graph->m_axisRenderer->m_axisVerticalValueRange > 0
+                                  ? 1.0 / m_graph->m_axisRenderer->m_axisVerticalValueRange
+                                  : 100.0;
+                        double maxHorizontal
+                            = m_graph->m_axisRenderer->m_axisHorizontalValueRange > 0
+                                  ? 1.0 / m_graph->m_axisRenderer->m_axisHorizontalValueRange
+                                  : 100.0;
+
+                        QPoint currentDelta =
+                            m_pressedGroup->dragHandlers.at(m_pressedPointIndex)
+                                ->activeTranslation().toPoint();
+                        QPoint delta = currentDelta - m_previousDelta;
+                        m_previousDelta = currentDelta;
+
+                        qreal deltaX = delta.x() / w / maxHorizontal;
+                        qreal deltaY = -delta.y() / h / maxVertical;
+
+                        QPointF point = m_pressedGroup->series->at(m_pressedPointIndex)
+                                        + QPointF(deltaX, deltaY);
+                        m_pressedGroup->series->replace(m_pressedPointIndex, point);
+                    }
+                });
+                connect(handler, &QQuickDragHandler::grabChanged, this,
+                        [&](QPointingDevice::GrabTransition transition, QEventPoint point) {
+                            Q_UNUSED(point)
+
+                            if (transition == QPointingDevice::UngrabExclusive ||
+                                transition == QPointingDevice::UngrabPassive) {
+                                m_previousDelta = QPoint(0, 0);
+                            }
+                        });
             }
         } else if (markerCount > pointCount) {
             for (qsizetype i = pointCount; i < markerCount; ++i)
@@ -418,12 +582,24 @@ void PointRenderer::handlePolish(QXYSeri
     }
 
     QLegendData legendData;
+#ifdef USE_SCATTERGRAPH
     if (auto scatter = qobject_cast<QScatterSeries *>(series))
         updateScatterSeries(scatter, legendData);
-    else if (auto line = qobject_cast<QLineSeries *>(series))
+#endif
+#if defined(USE_SCATTERGRAPH) && defined(USE_LINEGRAPH)
+    else
+#endif
+#ifdef USE_LINEGRAPH
+        if (auto line = qobject_cast<QLineSeries *>(series))
         updateLineSeries(line, legendData);
-    else if (auto spline = qobject_cast<QSplineSeries *>(series))
+#endif
+#if defined(USE_LINEGRAPH) && defined(USE_SPLINEGRAPH)
+    else
+#endif
+#ifdef USE_SPLINEGRAPH
+        if (auto spline = qobject_cast<QSplineSeries *>(series))
         updateSplineSeries(spline, legendData);
+#endif
 
     updateLegendData(series, legendData);
 }
@@ -460,81 +636,6 @@ void PointRenderer::afterUpdate(QList<QA
     Q_UNUSED(cleanupSeries);
 }
 
-bool PointRenderer::handleMouseMove(QMouseEvent *event)
-{
-    if (!m_pressedGroup || !m_pressedGroup->series->isVisible())
-        return false;
-
-    if (m_pointPressed && m_pressedGroup->series->isDraggable()) {
-        float w = width();
-        float h = height();
-        double maxVertical = m_graph->m_axisRenderer->m_axisVerticalValueRange > 0
-                                 ? 1.0 / m_graph->m_axisRenderer->m_axisVerticalValueRange
-                                 : 100.0;
-        double maxHorizontal = m_graph->m_axisRenderer->m_axisHorizontalValueRange > 0
-                                   ? 1.0 / m_graph->m_axisRenderer->m_axisHorizontalValueRange
-                                   : 100.0;
-
-        QPoint delta = m_pressStart - event->pos();
-
-        qreal deltaX = -delta.x() / w / maxHorizontal;
-        qreal deltaY = delta.y() / h / maxVertical;
-
-        QPointF point = m_pressedGroup->series->at(m_pressedPointIndex) + QPointF(deltaX, deltaY);
-        m_pressedGroup->series->replace(m_pressedPointIndex, point);
-
-        m_pressStart = event->pos();
-        m_pointDragging = true;
-
-        return true;
-    }
-    return false;
-}
-
-bool PointRenderer::handleMousePress(QMouseEvent *event)
-{
-    bool handled = false;
-    for (auto &&group : m_groups) {
-        if (!group->series->isVisible())
-            continue;
-
-        if (!group->series->isSelectable() && !group->series->isDraggable())
-            continue;
-
-        int index = 0;
-        for (auto &&rect : group->rects) {
-            if (rect.contains(event->pos())) {
-                m_pointPressed = true;
-                m_pressStart = event->pos();
-                m_pressedGroup = group;
-                m_pressedPointIndex = index;
-                handled = true;
-            }
-            index++;
-        }
-    }
-    return handled;
-}
-
-bool PointRenderer::handleMouseRelease(QMouseEvent *event)
-{
-    bool handled = false;
-    if (!m_pointDragging && m_pointPressed && m_pressedGroup
-        && m_pressedGroup->series->isSelectable() && m_pressedGroup->series->isVisible()) {
-        if (m_pressedGroup->rects[m_pressedPointIndex].contains(event->pos())) {
-            if (m_pressedGroup->series->isPointSelected(m_pressedPointIndex)) {
-                m_pressedGroup->series->deselectPoint(m_pressedPointIndex);
-            } else {
-                m_pressedGroup->series->selectPoint(m_pressedPointIndex);
-            }
-            handled = true;
-        }
-    }
-    m_pointPressed = false;
-    m_pointDragging = false;
-    return handled;
-}
-
 bool PointRenderer::handleHoverMove(QHoverEvent *event)
 {
     bool handled = false;
diff -pruN 6.8.2-4/src/graphs2d/qsgrenderer/pointrenderer_p.h 6.9.1-1/src/graphs2d/qsgrenderer/pointrenderer_p.h
--- 6.8.2-4/src/graphs2d/qsgrenderer/pointrenderer_p.h	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs2d/qsgrenderer/pointrenderer_p.h	2025-05-29 02:19:47.000000000 +0000
@@ -28,6 +28,8 @@ class QLineSeries;
 class QScatterSeries;
 class QSplineSeries;
 class AxisRenderer;
+class QQuickTapHandler;
+class QQuickDragHandler;
 struct QLegendData;
 
 class PointRenderer : public QQuickItem
@@ -41,9 +43,6 @@ public:
     void afterPolish(QList<QAbstractSeries *> &cleanupSeries);
     void updateSeries(QXYSeries *series);
     void afterUpdate(QList<QAbstractSeries *> &cleanupSeries);
-    bool handleMouseMove(QMouseEvent *event);
-    bool handleMousePress(QMouseEvent *event);
-    bool handleMouseRelease(QMouseEvent *event);
     bool handleHoverMove(QHoverEvent *event);
 
 private:
@@ -53,6 +52,7 @@ private:
         QQuickShapePath *shapePath = nullptr;
         QPainterPath painterPath;
         QList<QQuickItem *> markers;
+        QList<QQuickDragHandler *> dragHandlers;
         QQmlComponent *currentMarker = nullptr;
         QQmlComponent *previousMarker = nullptr;
         QList<QRectF> rects;
@@ -68,9 +68,7 @@ private:
     qsizetype m_currentColorIndex = 0;
 
     // Point drag variables
-    bool m_pointPressed = false;
-    bool m_pointDragging = false;
-    QPoint m_pressStart;
+    QPoint m_previousDelta;
     PointGroup *m_pressedGroup = nullptr;
     qsizetype m_pressedPointIndex = 0;
 
@@ -82,6 +80,8 @@ private:
     qreal m_areaWidth = 0;
     qreal m_areaHeight = 0;
 
+    QQuickTapHandler *m_tapHandler = nullptr;
+
     qreal defaultSize(QXYSeries *series = nullptr);
 
     struct SeriesStyle {
@@ -102,9 +102,19 @@ private:
     void hidePointDelegates(QXYSeries *series);
     void updateLegendData(QXYSeries *series, QLegendData &legendData);
 
+    void onSingleTapped(QEventPoint eventPoint, Qt::MouseButton button);
+    void onDoubleTapped(QEventPoint eventPoint, Qt::MouseButton button);
+    void onPressedChanged();
+
+#ifdef USE_SCATTERGRAPH
     void updateScatterSeries(QScatterSeries *scatter, QLegendData &legendData);
+#endif
+#ifdef USE_LINEGRAPH
     void updateLineSeries(QLineSeries *line, QLegendData &legendData);
+#endif
+#ifdef USE_SPLINEGRAPH
     void updateSplineSeries(QSplineSeries *spline, QLegendData &legendData);
+#endif
 };
 
 QT_END_NAMESPACE
diff -pruN 6.8.2-4/src/graphs2d/scatterchart/qscatterseries.h 6.9.1-1/src/graphs2d/scatterchart/qscatterseries.h
--- 6.8.2-4/src/graphs2d/scatterchart/qscatterseries.h	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs2d/scatterchart/qscatterseries.h	2025-05-29 02:19:47.000000000 +0000
@@ -1,8 +1,8 @@
 // Copyright (C) 2023 The Qt Company Ltd.
 // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
 
-#ifndef QSCATTERSERIES_H
-#define QSCATTERSERIES_H
+#ifndef QTGRAPHS_QSCATTERSERIES_H
+#define QTGRAPHS_QSCATTERSERIES_H
 
 #include <QtGraphs/qxyseries.h>
 #include <QtGraphs/qgraphsglobal.h>
@@ -34,4 +34,4 @@ private:
 
 QT_END_NAMESPACE
 
-#endif // QSCATTERSERIES_H
+#endif // QTGRAPHS_QSCATTERSERIES_H
diff -pruN 6.8.2-4/src/graphs2d/splinechart/qsplineseries.h 6.9.1-1/src/graphs2d/splinechart/qsplineseries.h
--- 6.8.2-4/src/graphs2d/splinechart/qsplineseries.h	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs2d/splinechart/qsplineseries.h	2025-05-29 02:19:47.000000000 +0000
@@ -1,12 +1,11 @@
 // Copyright (C) 2024 The Qt Company Ltd.
 // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
 
-#ifndef QSPLINESERIES_H
-#define QSPLINESERIES_H
+#ifndef QTGRAPHS_QSPLINESERIES_H
+#define QTGRAPHS_QSPLINESERIES_H
 
 #include <QtCore/qobject.h>
 #include <QtGraphs/qxyseries.h>
-#include <QtWidgets/qwidget.h>
 
 QT_BEGIN_NAMESPACE
 
@@ -52,4 +51,4 @@ private:
 
 QT_END_NAMESPACE
 
-#endif // QSPLINESERIES_H
+#endif // QTGRAPHS_QSPLINESERIES_H
diff -pruN 6.8.2-4/src/graphs2d/xychart/qxymodelmapper.h 6.9.1-1/src/graphs2d/xychart/qxymodelmapper.h
--- 6.8.2-4/src/graphs2d/xychart/qxymodelmapper.h	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs2d/xychart/qxymodelmapper.h	2025-05-29 02:19:47.000000000 +0000
@@ -1,8 +1,8 @@
 // Copyright (C) 2024 The Qt Company Ltd.
 
 // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
-#ifndef QXYMODELMAPPER_H
-#define QXYMODELMAPPER_H
+#ifndef QTGRAPHS_QXYMODELMAPPER_H
+#define QTGRAPHS_QXYMODELMAPPER_H
 #include <QtCore/qobject.h>
 #include <QtGraphs/qgraphsglobal.h>
 #include <QtQmlIntegration/qqmlintegration.h>
@@ -70,4 +70,4 @@ protected:
 
 QT_END_NAMESPACE
 
-#endif // QXYMODELMAPPER_H
+#endif // QTGRAPHS_QXYMODELMAPPER_H
diff -pruN 6.8.2-4/src/graphs2d/xychart/qxyseries.cpp 6.9.1-1/src/graphs2d/xychart/qxyseries.cpp
--- 6.8.2-4/src/graphs2d/xychart/qxyseries.cpp	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs2d/xychart/qxyseries.cpp	2025-05-29 02:19:47.000000000 +0000
@@ -50,6 +50,19 @@ QT_BEGIN_NAMESPACE
 */
 
 /*!
+    \fn void QXYSeries::pointsAdded(qsizetype start, qsizetype end)
+    This signal is emitted when a list of points is appended.
+    The indexes of the new added points are between \a start and \a end.
+    \since 6.9
+*/
+/*!
+    \qmlsignal XYSeries::pointsAdded(int start, int end)
+    This signal is emitted when a list of points is appended.
+    The indexes of the new added points are between \a start and \a end.
+    \since 6.9
+*/
+
+/*!
     \qmlsignal XYSeries::colorChanged(color color)
     This signal is emitted when the line color changes to \a color.
 */
@@ -75,11 +88,36 @@ QT_BEGIN_NAMESPACE
     becomes fixed.
 */
 
+/*!
+    \qmlsignal XYSeries::clicked(point point)
+    This signal is emitted when the user clicks or taps the \a point in the graph.
+*/
+
+/*!
+    \qmlsignal XYSeries::doubleClicked(point point)
+    This signal is emitted when the user double-clicks or double-taps the data \a point in
+    the graph. The \a point is the point where the first press was triggered.
+    This signal always occurs after \l clicked.
+*/
+
+/*!
+    \qmlsignal XYSeries::pressed(point point)
+    This signal is emitted when the user presses the data \a point in the graph
+    and holds down the mouse button or gesture.
+*/
+
+/*!
+    \qmlsignal XYSeries::released(point point)
+    This signal is emitted when the user releases the previously pressed mouse
+    button or gesture on the data \a point.
+*/
+
 QXYSeries::QXYSeries(QXYSeriesPrivate &dd, QObject *parent)
     : QAbstractSeries(dd, parent)
 {
     QObject::connect(this, &QXYSeries::selectedPointsChanged, this, &QAbstractSeries::update);
     QObject::connect(this, &QXYSeries::pointAdded, this, &QAbstractSeries::update);
+    QObject::connect(this, &QXYSeries::pointsAdded, this, &QAbstractSeries::update);
     QObject::connect(this, &QXYSeries::pointReplaced, this, &QAbstractSeries::update);
     QObject::connect(this, &QXYSeries::pointsReplaced, this, &QAbstractSeries::update);
     QObject::connect(this, &QXYSeries::pointRemoved, this, &QAbstractSeries::update);
@@ -126,14 +164,18 @@ void QXYSeries::append(QPointF point)
 /*!
     \qmlmethod XYSeries::append(list<point> points)
     Appends points with the coordinates \a points to the series.
+    \note This is much faster than appending data points one by one.
+    Emits \l pointsAdded when the points have been added.
 */
 /*!
     Appends points with the coordinates \a points to the series.
+    \note This is much faster than appending data points one by one.
+    Emits \l pointsAdded when the points have been added.
 */
 void QXYSeries::append(const QList<QPointF> &points)
 {
-    for (const QPointF &point : points)
-        append(point);
+    Q_D(QXYSeries);
+    d->append(points);
 }
 
 /*!
@@ -322,6 +364,11 @@ void QXYSeries::removeMultiple(qsizetype
         return;
 
     if (count > 0) {
+        if (d->m_graphTransition && d->m_graphTransition->initialized()
+            && d->m_graphTransition->contains(QGraphAnimation::GraphAnimationType::GraphPoint)) {
+            d->m_graphTransition->stop();
+        }
+
         d->m_points.remove(index, count);
 
         bool callSignal = false;
@@ -787,6 +834,10 @@ QColor QXYSeries::selectedColor() const
         \li qreal
         \li pointValueY
         \li The value of the \l{QXYPoint::y} at this position.
+    \row
+        \li int
+        \li pointIndex
+        \li The index of the point, from 0 to the amount of points - 1. [since 6.9]
     \endtable
 
     To use any of these, add property with the defined name into your custom component.
@@ -833,6 +884,10 @@ QColor QXYSeries::selectedColor() const
         \li real
         \li pointValueY
         \li The value of the \l{XYPoint::y} at this position.
+    \row
+        \li int
+        \li pointIndex
+        \li The index of the point, from 0 to the amount of points - 1. [since 6.9]
     \endtable
 
     To use any of these, add property with the defined name into your custom component.
@@ -937,7 +992,12 @@ void QXYSeriesPrivate::append(const QLis
             }
         }
     } else {
+        qsizetype start = m_points.size();
         m_points.append(points);
+
+        Q_Q(QXYSeries);
+        Q_EMIT q->pointsAdded(start, m_points.size() - 1);
+        Q_EMIT q->countChanged();
     }
 }
 
diff -pruN 6.8.2-4/src/graphs2d/xychart/qxyseries.h 6.9.1-1/src/graphs2d/xychart/qxyseries.h
--- 6.8.2-4/src/graphs2d/xychart/qxyseries.h	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs2d/xychart/qxyseries.h	2025-05-29 02:19:47.000000000 +0000
@@ -1,8 +1,8 @@
 // Copyright (C) 2023 The Qt Company Ltd.
 // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
 
-#ifndef QXYSERIES_H
-#define QXYSERIES_H
+#ifndef QTGRAPHS_QXYSERIES_H
+#define QTGRAPHS_QXYSERIES_H
 
 #include <QtGraphs/qabstractseries.h>
 #include <QtGraphs/qgraphsglobal.h>
@@ -88,6 +88,7 @@ Q_SIGNALS:
     void pointReplaced(qsizetype index);
     void pointRemoved(qsizetype index);
     void pointAdded(qsizetype index);
+    Q_REVISION(6, 9) void pointsAdded(qsizetype start, qsizetype end);
     void colorChanged(QColor color);
     void selectedColorChanged(QColor color);
     void pointsReplaced();
@@ -98,6 +99,11 @@ Q_SIGNALS:
     void seriesUpdated();
     void countChanged();
 
+    Q_REVISION(6, 9) void clicked(QPoint point);
+    Q_REVISION(6, 9) void doubleClicked(QPoint point);
+    Q_REVISION(6, 9) void pressed(QPoint point);
+    Q_REVISION(6, 9) void released(QPoint point);
+
 private:
     friend class PointRenderer;
     friend class QGraphPointAnimation;
@@ -108,4 +114,4 @@ private:
 
 QT_END_NAMESPACE
 
-#endif // QXYSERIES_H
+#endif // QTGRAPHS_QXYSERIES_H
diff -pruN 6.8.2-4/src/graphs3d/CMakeLists.txt 6.9.1-1/src/graphs3d/CMakeLists.txt
--- 6.8.2-4/src/graphs3d/CMakeLists.txt	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs3d/CMakeLists.txt	2025-05-29 02:19:47.000000000 +0000
@@ -33,7 +33,6 @@ else()
             utils/utils.cpp utils/utils_p.h
             utils/qgraphs3dnamespace.cpp utils/qgraphs3dnamespace.h
 
-            qml/foreigntypes_p.h
             qml/qquickgraphsitem.cpp qml/qquickgraphsitem_p.h
             qml/qquickgraphstexturedata.cpp qml/qquickgraphstexturedata_p.h
             qml/gradientholder_p.h
@@ -57,7 +56,6 @@ else()
 
             engine/barinstancing.cpp engine/barinstancing_p.h
 
-            qml/foreigntypesbars_p.h
             qml/qquickgraphsbars.cpp qml/qquickgraphsbars_p.h
             qml/qquickgraphsbarsseries.cpp qml/qquickgraphsbarsseries_p.h
         INCLUDE_DIRECTORIES
@@ -70,15 +68,16 @@ else()
         SOURCES
             data/qitemmodelscatterdataproxy.cpp data/qitemmodelscatterdataproxy.h data/qitemmodelscatterdataproxy_p.h
             data/qscatter3dseries.cpp data/qscatter3dseries.h data/qscatter3dseries_p.h
+            data/qspline3dseries.cpp data/qspline3dseries.h data/qspline3dseries_p.h
             data/qscatterdataitem.cpp data/qscatterdataitem.h
             data/qscatterdataproxy.cpp data/qscatterdataproxy.h data/qscatterdataproxy_p.h
             data/scatteritemmodelhandler.cpp data/scatteritemmodelhandler_p.h
 
             engine/scatterinstancing.cpp engine/scatterinstancing_p.h
 
-            qml/foreigntypesscatter_p.h
             qml/qquickgraphsscatter.cpp qml/qquickgraphsscatter_p.h
             qml/qquickgraphsscatterseries.cpp qml/qquickgraphsscatterseries_p.h
+            qml/qquickgraphssplineseries.cpp qml/qquickgraphssplineseries_p.h
         INCLUDE_DIRECTORIES
             data
             engine
@@ -94,7 +93,6 @@ else()
             data/qsurfacedataproxy.cpp data/qsurfacedataproxy.h data/qsurfacedataproxy_p.h
             data/surfaceitemmodelhandler.cpp data/surfaceitemmodelhandler_p.h
 
-            qml/foreigntypessurface_p.h
             qml/qquickgraphssurface.cpp qml/qquickgraphssurface_p.h
             qml/qquickgraphssurfaceseries.cpp qml/qquickgraphssurfaceseries_p.h
         INCLUDE_DIRECTORIES
diff -pruN 6.8.2-4/src/graphs3d/axis/qabstract3daxis.cpp 6.9.1-1/src/graphs3d/axis/qabstract3daxis.cpp
--- 6.8.2-4/src/graphs3d/axis/qabstract3daxis.cpp	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs3d/axis/qabstract3daxis.cpp	2025-05-29 02:19:47.000000000 +0000
@@ -133,6 +133,25 @@ QT_BEGIN_NAMESPACE
  */
 
 /*!
+ * \qmlproperty bool Abstract3DAxis::scaleLabelsByCount
+ * \since 6.9
+ *
+ * Whether the labels will automatically adjust their size based on the total amount of labels.
+ *
+ * \sa labelSize
+ */
+
+/*!
+ * \qmlproperty real Abstract3DAxis::labelSize
+ * \since 6.9
+ *
+ * The size of the label.
+ * The default for this value is \c 1.0.
+ *
+ * \sa scaleLabelsByCount
+ */
+
+/*!
     \qmlsignal Abstract3DAxis::titleChanged(string newTitle)
 
     This signal is emitted when \l title changes to \a newTitle.
@@ -199,6 +218,18 @@ QT_BEGIN_NAMESPACE
     This signal is emitted when the titleOffset property value changes to
     \a offset.
 */
+/*!
+    \qmlsignal Abstract3DAxis::scaleLabelsByCountChanged(bool adjust)
+
+    This signal is emitted when the scaleLabelsByCount property value changes to
+    \a adjust.
+*/
+/*!
+    \qmlsignal Abstract3DAxis::labelSizeChanged(real size)
+
+    This signal is emitted when the labelSize property value changes to
+    \a size.
+*/
 
 /*!
  * \enum QAbstract3DAxis::AxisOrientation
@@ -491,6 +522,54 @@ bool QAbstract3DAxis::isAutoAdjustRange(
 }
 
 /*!
+ * \property QAbstract3DAxis::scaleLabelsByCount
+ * \since 6.9
+ * \brief Whether the labels will automatically adjust their size
+ * based on the total amount of labels
+ *
+ * \sa labelSize()
+ */
+void QAbstract3DAxis::setScaleLabelsByCount(bool adjust)
+{
+    Q_D(QAbstract3DAxis);
+    if (d->m_scaleLabelsByCount != adjust) {
+        d->m_scaleLabelsByCount = adjust;
+        emit scaleLabelsByCountChanged(adjust);
+    }
+}
+
+bool QAbstract3DAxis::isScaleLabelsByCount() const
+{
+    Q_D(const QAbstract3DAxis);
+    return d->m_scaleLabelsByCount;
+}
+
+/*!
+ * \property QAbstract3DAxis::labelSize
+ * \since 6.9
+ * \brief Size of the label
+ *
+ * The size of the label.
+ * The default for this value is \c 1.0.
+ *
+ * \sa scaleLabelsByCount
+ */
+void QAbstract3DAxis::setLabelSize(qreal size)
+{
+    Q_D(QAbstract3DAxis);
+    if (d->m_labelSize != size) {
+        d->m_labelSize = size;
+        emit labelSizeChanged(size);
+    }
+}
+
+qreal QAbstract3DAxis::labelSize() const
+{
+    Q_D(const QAbstract3DAxis);
+    return d->m_labelSize;
+}
+
+/*!
  * \property QAbstract3DAxis::titleOffset
  *
  * The position of the axis title on the axis.
@@ -531,6 +610,8 @@ QAbstract3DAxisPrivate::QAbstract3DAxisP
     , m_min(0.0f)
     , m_max(10.0f)
     , m_autoAdjust(true)
+    , m_scaleLabelsByCount(false)
+    , m_labelSize(1.0)
     , m_labelAutoAngle(0.0f)
     , m_titleOffset(0.0f)
     , m_titleVisible(false)
diff -pruN 6.8.2-4/src/graphs3d/axis/qabstract3daxis.h 6.9.1-1/src/graphs3d/axis/qabstract3daxis.h
--- 6.8.2-4/src/graphs3d/axis/qabstract3daxis.h	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs3d/axis/qabstract3daxis.h	2025-05-29 02:19:47.000000000 +0000
@@ -1,14 +1,15 @@
 // Copyright (C) 2023 The Qt Company Ltd.
 // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
 
-#ifndef QABSTRACT3DAXIS_H
-#define QABSTRACT3DAXIS_H
+#ifndef QTGRAPHS_QABSTRACT3DAXIS_H
+#define QTGRAPHS_QABSTRACT3DAXIS_H
 
 #include <QtCore/qobject.h>
 #include <QtCore/qscopedpointer.h>
 #include <QtCore/qstringlist.h>
 #include <QtCore/qtclasshelpermacros.h>
 #include <QtGraphs/qgraphsglobal.h>
+#include <QtQmlIntegration/qqmlintegration.h>
 
 QT_BEGIN_NAMESPACE
 
@@ -32,11 +33,17 @@ class Q_GRAPHS_EXPORT QAbstract3DAxis :
                    autoAdjustRangeChanged FINAL)
     Q_PROPERTY(float labelAutoAngle READ labelAutoAngle WRITE setLabelAutoAngle NOTIFY
                    labelAutoAngleChanged FINAL)
+    Q_PROPERTY(bool scaleLabelsByCount READ isScaleLabelsByCount WRITE setScaleLabelsByCount NOTIFY
+                   scaleLabelsByCountChanged REVISION(6, 9))
+    Q_PROPERTY(qreal labelSize READ labelSize WRITE setLabelSize NOTIFY labelSizeChanged NOTIFY
+                   labelSizeChanged REVISION(6, 9))
     Q_PROPERTY(bool titleVisible READ isTitleVisible WRITE setTitleVisible NOTIFY
                    titleVisibleChanged FINAL)
     Q_PROPERTY(bool titleFixed READ isTitleFixed WRITE setTitleFixed NOTIFY titleFixedChanged FINAL)
     Q_PROPERTY(
         float titleOffset READ titleOffset WRITE setTitleOffset NOTIFY titleOffsetChanged FINAL)
+    QML_NAMED_ELEMENT(Abstract3DAxis)
+    QML_UNCREATABLE("")
 
 public:
     enum class AxisOrientation { None, X, Y, Z };
@@ -73,6 +80,12 @@ public:
     void setAutoAdjustRange(bool autoAdjust);
     bool isAutoAdjustRange() const;
 
+    void setScaleLabelsByCount(bool adjust);
+    bool isScaleLabelsByCount() const;
+
+    void setLabelSize(qreal size);
+    qreal labelSize() const;
+
     void setRange(float min, float max);
 
     void setLabelAutoAngle(float degree);
@@ -98,6 +111,8 @@ Q_SIGNALS:
     void maxChanged(float value);
     void rangeChanged(float min, float max);
     void autoAdjustRangeChanged(bool autoAdjust);
+    Q_REVISION(6, 9) void scaleLabelsByCountChanged(bool adjust);
+    Q_REVISION(6, 9) void labelSizeChanged(qreal size);
     void labelAutoAngleChanged(float angle);
     void titleVisibleChanged(bool visible);
     void labelVisibleChanged(bool visible);
diff -pruN 6.8.2-4/src/graphs3d/axis/qabstract3daxis_p.h 6.9.1-1/src/graphs3d/axis/qabstract3daxis_p.h
--- 6.8.2-4/src/graphs3d/axis/qabstract3daxis_p.h	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs3d/axis/qabstract3daxis_p.h	2025-05-29 02:19:47.000000000 +0000
@@ -50,6 +50,8 @@ protected:
     float m_min;
     float m_max;
     bool m_autoAdjust;
+    bool m_scaleLabelsByCount;
+    qreal m_labelSize;
     float m_labelAutoAngle;
     float m_titleOffset;
     bool m_titleVisible;
diff -pruN 6.8.2-4/src/graphs3d/axis/qcategory3daxis.h 6.9.1-1/src/graphs3d/axis/qcategory3daxis.h
--- 6.8.2-4/src/graphs3d/axis/qcategory3daxis.h	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs3d/axis/qcategory3daxis.h	2025-05-29 02:19:47.000000000 +0000
@@ -1,8 +1,8 @@
 // Copyright (C) 2023 The Qt Company Ltd.
 // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
 
-#ifndef QCATEGORY3DAXIS_H
-#define QCATEGORY3DAXIS_H
+#ifndef QTGRAPHS_QCATEGORY3DAXIS_H
+#define QTGRAPHS_QCATEGORY3DAXIS_H
 
 #include <QtGraphs/qabstract3daxis.h>
 
@@ -15,6 +15,7 @@ class Q_GRAPHS_EXPORT QCategory3DAxis :
     Q_OBJECT
     Q_DECLARE_PRIVATE(QCategory3DAxis)
     Q_PROPERTY(QStringList labels READ labels WRITE setLabels NOTIFY labelsChanged FINAL)
+    QML_NAMED_ELEMENT(Category3DAxis)
 
 public:
     explicit QCategory3DAxis(QObject *parent = nullptr);
diff -pruN 6.8.2-4/src/graphs3d/axis/qlogvalue3daxisformatter.h 6.9.1-1/src/graphs3d/axis/qlogvalue3daxisformatter.h
--- 6.8.2-4/src/graphs3d/axis/qlogvalue3daxisformatter.h	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs3d/axis/qlogvalue3daxisformatter.h	2025-05-29 02:19:47.000000000 +0000
@@ -1,8 +1,8 @@
 // Copyright (C) 2023 The Qt Company Ltd.
 // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
 
-#ifndef QLOGVALUE3DAXISFORMATTER_H
-#define QLOGVALUE3DAXISFORMATTER_H
+#ifndef QTGRAPHS_QLOGVALUE3DAXISFORMATTER_H
+#define QTGRAPHS_QLOGVALUE3DAXISFORMATTER_H
 
 #include <QtGraphs/qvalue3daxisformatter.h>
 
@@ -18,6 +18,7 @@ class Q_GRAPHS_EXPORT QLogValue3DAxisFor
     Q_PROPERTY(bool autoSubGrid READ autoSubGrid WRITE setAutoSubGrid NOTIFY autoSubGridChanged FINAL)
     Q_PROPERTY(bool edgeLabelsVisible READ edgeLabelsVisible WRITE setEdgeLabelsVisible NOTIFY
                    edgeLabelsVisibleChanged FINAL)
+    QML_NAMED_ELEMENT(LogValue3DAxisFormatter)
 
 protected:
     explicit QLogValue3DAxisFormatter(QLogValue3DAxisFormatterPrivate &d, QObject *parent = nullptr);
diff -pruN 6.8.2-4/src/graphs3d/axis/qvalue3daxis.h 6.9.1-1/src/graphs3d/axis/qvalue3daxis.h
--- 6.8.2-4/src/graphs3d/axis/qvalue3daxis.h	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs3d/axis/qvalue3daxis.h	2025-05-29 02:19:47.000000000 +0000
@@ -1,8 +1,8 @@
 // Copyright (C) 2023 The Qt Company Ltd.
 // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
 
-#ifndef QVALUE3DAXIS_H
-#define QVALUE3DAXIS_H
+#ifndef QTGRAPHS_QVALUE3DAXIS_H
+#define QTGRAPHS_QVALUE3DAXIS_H
 
 #include <QtGraphs/qabstract3daxis.h>
 #include <QtGraphs/qvalue3daxisformatter.h>
@@ -24,6 +24,7 @@ class Q_GRAPHS_EXPORT QValue3DAxis : pub
     Q_PROPERTY(QValue3DAxisFormatter *formatter READ formatter WRITE setFormatter NOTIFY
                    formatterChanged FINAL)
     Q_PROPERTY(bool reversed READ reversed WRITE setReversed NOTIFY reversedChanged FINAL)
+    QML_NAMED_ELEMENT(Value3DAxis)
 
 public:
     explicit QValue3DAxis(QObject *parent = nullptr);
diff -pruN 6.8.2-4/src/graphs3d/axis/qvalue3daxisformatter.h 6.9.1-1/src/graphs3d/axis/qvalue3daxisformatter.h
--- 6.8.2-4/src/graphs3d/axis/qvalue3daxisformatter.h	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs3d/axis/qvalue3daxisformatter.h	2025-05-29 02:19:47.000000000 +0000
@@ -1,8 +1,8 @@
 // Copyright (C) 2023 The Qt Company Ltd.
 // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
 
-#ifndef QVALUE3DAXISFORMATTER_H
-#define QVALUE3DAXISFORMATTER_H
+#ifndef QTGRAPHS_QVALUE3DAXISFORMATTER_H
+#define QTGRAPHS_QVALUE3DAXISFORMATTER_H
 
 #include <QtCore/qlist.h>
 #include <QtCore/qlocale.h>
@@ -10,6 +10,7 @@
 #include <QtCore/qscopedpointer.h>
 #include <QtCore/qstringlist.h>
 #include <QtGraphs/qgraphsglobal.h>
+#include <QtQmlIntegration/qqmlintegration.h>
 
 QT_BEGIN_NAMESPACE
 
@@ -20,6 +21,7 @@ class Q_GRAPHS_EXPORT QValue3DAxisFormat
 {
     Q_OBJECT
     Q_DECLARE_PRIVATE(QValue3DAxisFormatter)
+    QML_NAMED_ELEMENT(Value3DAxisFormatter)
 
 protected:
     explicit QValue3DAxisFormatter(QValue3DAxisFormatterPrivate &d, QObject *parent = nullptr);
diff -pruN 6.8.2-4/src/graphs3d/data/qabstract3dseries.cpp 6.9.1-1/src/graphs3d/data/qabstract3dseries.cpp
--- 6.8.2-4/src/graphs3d/data/qabstract3dseries.cpp	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs3d/data/qabstract3dseries.cpp	2025-05-29 02:19:47.000000000 +0000
@@ -178,7 +178,7 @@ QT_BEGIN_NAMESPACE
  *
  * Sets the base gradient of the series.
  *
- * \sa colorStyle, {GraphsTheme::seriesGradients}{GraphsTheme.seriesGradients}
+ * \sa colorStyle
  */
 
 /*!
diff -pruN 6.8.2-4/src/graphs3d/data/qabstract3dseries.h 6.9.1-1/src/graphs3d/data/qabstract3dseries.h
--- 6.8.2-4/src/graphs3d/data/qabstract3dseries.h	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs3d/data/qabstract3dseries.h	2025-05-29 02:19:47.000000000 +0000
@@ -1,8 +1,8 @@
 // Copyright (C) 2023 The Qt Company Ltd.
 // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
 
-#ifndef QABSTRACT3DSERIES_H
-#define QABSTRACT3DSERIES_H
+#ifndef QTGRAPHS_QABSTRACT3DSERIES_H
+#define QTGRAPHS_QABSTRACT3DSERIES_H
 
 #include <QtCore/qobject.h>
 #include <QtCore/qscopedpointer.h>
@@ -47,7 +47,8 @@ class Q_GRAPHS_EXPORT QAbstract3DSeries
     Q_PROPERTY(QString itemLabel READ itemLabel NOTIFY itemLabelChanged)
     Q_PROPERTY(bool itemLabelVisible READ isItemLabelVisible WRITE setItemLabelVisible NOTIFY
                    itemLabelVisibleChanged)
-
+    QML_NAMED_ELEMENT(Abstract3DSeries)
+    QML_UNCREATABLE("Uncreatable base type")
 public:
     enum class SeriesType {
         None,
diff -pruN 6.8.2-4/src/graphs3d/data/qabstractdataproxy.h 6.9.1-1/src/graphs3d/data/qabstractdataproxy.h
--- 6.8.2-4/src/graphs3d/data/qabstractdataproxy.h	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs3d/data/qabstractdataproxy.h	2025-05-29 02:19:47.000000000 +0000
@@ -1,12 +1,13 @@
 // Copyright (C) 2023 The Qt Company Ltd.
 // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
 
-#ifndef QABSTRACTDATAPROXY_H
-#define QABSTRACTDATAPROXY_H
+#ifndef QTGRAPHS_QABSTRACTDATAPROXY_H
+#define QTGRAPHS_QABSTRACTDATAPROXY_H
 
 #include <QtCore/qobject.h>
 #include <QtCore/qscopedpointer.h>
 #include <QtGraphs/qgraphsglobal.h>
+#include <QtQmlIntegration/qqmlintegration.h>
 
 QT_BEGIN_NAMESPACE
 
@@ -18,6 +19,8 @@ class Q_GRAPHS_EXPORT QAbstractDataProxy
     Q_DECLARE_PRIVATE(QAbstractDataProxy)
     Q_CLASSINFO("RegisterEnumClassesUnscoped", "false")
     Q_PROPERTY(QAbstractDataProxy::DataType type READ type CONSTANT)
+    QML_NAMED_ELEMENT(AbstractDataProxy)
+    QML_UNCREATABLE("Uncreatable base type")
 
 public:
     enum class DataType {
diff -pruN 6.8.2-4/src/graphs3d/data/qbar3dseries.cpp 6.9.1-1/src/graphs3d/data/qbar3dseries.cpp
--- 6.8.2-4/src/graphs3d/data/qbar3dseries.cpp	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs3d/data/qbar3dseries.cpp	2025-05-29 02:19:47.000000000 +0000
@@ -406,6 +406,31 @@ void QBar3DSeries::setRowColors(const QL
 }
 
 /*!
+ * \property QBar3DSeries::valueColoringEnabled
+ * \since 6.9
+ *
+ * \brief Use the given value to color the whole bar based on the range gradient
+ *
+ * This property can be used to color each
+ * bar separately based on its value and given range gradient.
+ * The QGraphsTheme::ColorStyle must be set to
+ * QGraphsTheme::ColorStyle::RangeGradient to use this property.
+ *
+ * \sa QGraphsTheme::ColorStyle::RangeGradient
+ */
+void QBar3DSeries::setValueColoringEnabled(bool enabled)
+{
+    Q_D(QBar3DSeries);
+    d->setValueColoringEnabled(enabled);
+}
+
+bool QBar3DSeries::isValueColoringEnabled() const
+{
+    Q_D(const QBar3DSeries);
+    return d->m_valueColoring;
+}
+
+/*!
  * \property QBar3DSeries::dataArray
  *
  * \brief Data array for the series.
@@ -538,6 +563,7 @@ QBar3DSeriesPrivate::QBar3DSeriesPrivate
 {
     m_itemLabelFormat = QStringLiteral("@valueLabel");
     m_mesh = QAbstract3DSeries::Mesh::BevelBar;
+    m_valueColoring = false;
 }
 
 QBar3DSeriesPrivate::~QBar3DSeriesPrivate() {}
@@ -753,6 +779,15 @@ void QBar3DSeriesPrivate::setRowColors(c
     }
 }
 
+void QBar3DSeriesPrivate::setValueColoringEnabled(bool enabled)
+{
+    Q_Q(QBar3DSeries);
+    if (m_valueColoring != enabled) {
+        m_valueColoring = enabled;
+        emit q->valueColoringEnabledChanged(enabled);
+    }
+}
+
 void QBar3DSeriesPrivate::setDataArray(const QBarDataArray &newDataArray)
 {
     m_dataArray = newDataArray;
diff -pruN 6.8.2-4/src/graphs3d/data/qbar3dseries.h 6.9.1-1/src/graphs3d/data/qbar3dseries.h
--- 6.8.2-4/src/graphs3d/data/qbar3dseries.h	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs3d/data/qbar3dseries.h	2025-05-29 02:19:47.000000000 +0000
@@ -1,8 +1,8 @@
 // Copyright (C) 2023 The Qt Company Ltd.
 // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
 
-#ifndef QBAR3DSERIES_H
-#define QBAR3DSERIES_H
+#ifndef QTGRAPHS_QBAR3DSERIES_H
+#define QTGRAPHS_QBAR3DSERIES_H
 
 #include <QtCore/qpoint.h>
 #include <QtGraphs/qabstract3dseries.h>
@@ -26,7 +26,10 @@ class Q_GRAPHS_EXPORT QBar3DSeries : pub
                    columnLabelsChanged FINAL)
     Q_PROPERTY(
         QBarDataArray dataArray READ dataArray WRITE setDataArray NOTIFY dataArrayChanged FINAL)
-
+    Q_PROPERTY(bool valueColoringEnabled READ isValueColoringEnabled WRITE setValueColoringEnabled
+                   NOTIFY valueColoringEnabledChanged REVISION(6, 9))
+    QML_ELEMENT
+    QML_UNCREATABLE("Trying to create uncreatable: QBar3DSeries, use Bar3DSeries instead.")
 public:
     explicit QBar3DSeries(QObject *parent = nullptr);
     explicit QBar3DSeries(QBarDataProxy *dataProxy, QObject *parent = nullptr);
@@ -45,6 +48,9 @@ public:
     QList<QColor> rowColors() const;
     void setRowColors(const QList<QColor> &colors);
 
+    bool isValueColoringEnabled() const;
+    void setValueColoringEnabled(bool enabled);
+
     void setDataArray(const QBarDataArray &newDataArray);
     void clearRow(qsizetype rowIndex);
     void clearArray();
@@ -63,6 +69,7 @@ Q_SIGNALS:
     void rowLabelsChanged();
     void columnLabelsChanged();
     void dataArrayChanged(const QBarDataArray &array);
+    Q_REVISION(6, 9) void valueColoringEnabledChanged(bool enabled);
 
 private:
     Q_DISABLE_COPY(QBar3DSeries)
diff -pruN 6.8.2-4/src/graphs3d/data/qbar3dseries_p.h 6.9.1-1/src/graphs3d/data/qbar3dseries_p.h
--- 6.8.2-4/src/graphs3d/data/qbar3dseries_p.h	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs3d/data/qbar3dseries_p.h	2025-05-29 02:19:47.000000000 +0000
@@ -36,6 +36,8 @@ public:
 
     void setRowColors(const QList<QColor> &colors);
 
+    void setValueColoringEnabled(bool enabled);
+
     void setDataArray(const QBarDataArray &newDataArray);
     void clearRow(qsizetype rowIndex);
     void clearArray();
@@ -53,6 +55,7 @@ private:
     QStringList m_columnLabels;
     QPoint m_selectedBar;
     QList<QColor> m_rowColors;
+    bool m_valueColoring;
 
     friend class QQuickGraphsBars;
 };
diff -pruN 6.8.2-4/src/graphs3d/data/qbardataitem.h 6.9.1-1/src/graphs3d/data/qbardataitem.h
--- 6.8.2-4/src/graphs3d/data/qbardataitem.h	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs3d/data/qbardataitem.h	2025-05-29 02:19:47.000000000 +0000
@@ -1,8 +1,8 @@
 // Copyright (C) 2023 The Qt Company Ltd.
 // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
 
-#ifndef QBARDATAITEM_H
-#define QBARDATAITEM_H
+#ifndef QTGRAPHS_QBARDATAITEM_H
+#define QTGRAPHS_QBARDATAITEM_H
 
 #include <QtGraphs/qgraphsglobal.h>
 
diff -pruN 6.8.2-4/src/graphs3d/data/qbardataproxy.h 6.9.1-1/src/graphs3d/data/qbardataproxy.h
--- 6.8.2-4/src/graphs3d/data/qbardataproxy.h	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs3d/data/qbardataproxy.h	2025-05-29 02:19:47.000000000 +0000
@@ -1,8 +1,8 @@
 // Copyright (C) 2023 The Qt Company Ltd.
 // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
 
-#ifndef QBARDATAPROXY_H
-#define QBARDATAPROXY_H
+#ifndef QTGRAPHS_QBARDATAPROXY_H
+#define QTGRAPHS_QBARDATAPROXY_H
 
 #include <QtCore/qlist.h>
 #include <QtCore/qstringlist.h>
@@ -26,6 +26,9 @@ class Q_GRAPHS_EXPORT QBarDataProxy : pu
     Q_PROPERTY(qsizetype rowCount READ rowCount NOTIFY rowCountChanged FINAL)
     Q_PROPERTY(qsizetype colCount READ colCount NOTIFY colCountChanged FINAL)
     Q_PROPERTY(QBar3DSeries *series READ series NOTIFY seriesChanged FINAL)
+    QML_NAMED_ELEMENT(BarDataProxy)
+    QML_UNCREATABLE("")
+
 public:
     explicit QBarDataProxy(QObject *parent = nullptr);
     ~QBarDataProxy() override;
diff -pruN 6.8.2-4/src/graphs3d/data/qcustom3ditem.cpp 6.9.1-1/src/graphs3d/data/qcustom3ditem.cpp
--- 6.8.2-4/src/graphs3d/data/qcustom3ditem.cpp	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs3d/data/qcustom3ditem.cpp	2025-05-29 02:19:47.000000000 +0000
@@ -83,6 +83,13 @@ QT_BEGIN_NAMESPACE
  * 10% of the height of the graph, provided the item mesh is normalized and the
  * graph aspect ratios have not been changed from the defaults.
  *
+ * \note Only absolute scaling is supported for Custom3DLabel items or for
+ * custom items used in \l{GraphsItem3D::polar}{polar} graphs.
+ *
+ * \note In Qt 6.8 models were incorrectly assumed to be scaled to a size of 1 (-0.5...0.5)
+ * by default, when they in reality are scaled to the size of 2 (-1...1). Because of this, all
+ * custom items from Qt 6.9 onwards are twice the size compared to Qt 6.8
+ *
  * \sa scalingAbsolute
  */
 
@@ -324,6 +331,10 @@ bool QCustom3DItem::isPositionAbsolute()
  * normalized and the graph aspect ratios have not been changed from the
  * defaults.
  *
+ * \note In Qt 6.8 models were incorrectly assumed to be scaled to a size of 1 (-0.5...0.5)
+ * by default, when they in reality are scaled to the size of 2 (-1...1). Because of this, all
+ * custom items from Qt 6.9 onwards are twice the size compared to Qt 6.8
+ *
  * \sa scalingAbsolute
  */
 void QCustom3DItem::setScaling(QVector3D scaling)
diff -pruN 6.8.2-4/src/graphs3d/data/qcustom3ditem.h 6.9.1-1/src/graphs3d/data/qcustom3ditem.h
--- 6.8.2-4/src/graphs3d/data/qcustom3ditem.h	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs3d/data/qcustom3ditem.h	2025-05-29 02:19:47.000000000 +0000
@@ -1,14 +1,15 @@
 // Copyright (C) 2023 The Qt Company Ltd.
 // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
 
-#ifndef QCUSTOM3DITEM_H
-#define QCUSTOM3DITEM_H
+#ifndef QTGRAPHS_QCUSTOM3DITEM_H
+#define QTGRAPHS_QCUSTOM3DITEM_H
 
 #include <QtCore/qobject.h>
 #include <QtGraphs/qgraphsglobal.h>
 #include <QtGui/qimage.h>
 #include <QtGui/qquaternion.h>
 #include <QtGui/qvector3d.h>
+#include <QtQmlIntegration/qqmlintegration.h>
 
 QT_BEGIN_NAMESPACE
 
@@ -31,6 +32,7 @@ class Q_GRAPHS_EXPORT QCustom3DItem : pu
                    shadowCastingChanged FINAL)
     Q_PROPERTY(bool scalingAbsolute READ isScalingAbsolute WRITE setScalingAbsolute NOTIFY
                    scalingAbsoluteChanged FINAL)
+    QML_NAMED_ELEMENT(Custom3DItem)
 
 public:
     explicit QCustom3DItem(QObject *parent = nullptr);
diff -pruN 6.8.2-4/src/graphs3d/data/qcustom3dlabel.h 6.9.1-1/src/graphs3d/data/qcustom3dlabel.h
--- 6.8.2-4/src/graphs3d/data/qcustom3dlabel.h	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs3d/data/qcustom3dlabel.h	2025-05-29 02:19:47.000000000 +0000
@@ -1,8 +1,8 @@
 // Copyright (C) 2023 The Qt Company Ltd.
 // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
 
-#ifndef QCUSTOMLABELITEM_H
-#define QCUSTOMLABELITEM_H
+#ifndef QTGRAPHS_QCUSTOMLABELITEM_H
+#define QTGRAPHS_QCUSTOMLABELITEM_H
 
 #include <QtGraphs/qcustom3ditem.h>
 #include <QtGraphs/qgraphsglobal.h>
@@ -30,6 +30,7 @@ class Q_GRAPHS_EXPORT QCustom3DLabel : p
                    backgroundVisibleChanged FINAL)
     Q_PROPERTY(bool facingCamera READ isFacingCamera WRITE setFacingCamera NOTIFY
                    facingCameraChanged FINAL)
+    QML_NAMED_ELEMENT(Custom3DLabel)
 
 public:
     explicit QCustom3DLabel(QObject *parent = nullptr);
diff -pruN 6.8.2-4/src/graphs3d/data/qcustom3dvolume.cpp 6.9.1-1/src/graphs3d/data/qcustom3dvolume.cpp
--- 6.8.2-4/src/graphs3d/data/qcustom3dvolume.cpp	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs3d/data/qcustom3dvolume.cpp	2025-05-29 02:19:47.000000000 +0000
@@ -1,5 +1,6 @@
 // Copyright (C) 2023 The Qt Company Ltd.
 // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+// Qt-Security score:critical reason:execute-external-code
 
 #include "qcustom3dvolume_p.h"
 
diff -pruN 6.8.2-4/src/graphs3d/data/qcustom3dvolume.h 6.9.1-1/src/graphs3d/data/qcustom3dvolume.h
--- 6.8.2-4/src/graphs3d/data/qcustom3dvolume.h	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs3d/data/qcustom3dvolume.h	2025-05-29 02:19:47.000000000 +0000
@@ -1,8 +1,8 @@
 // Copyright (C) 2023 The Qt Company Ltd.
 // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
 
-#ifndef QCUSTOM3DVOLUME_H
-#define QCUSTOM3DVOLUME_H
+#ifndef QTGRAPHS_QCUSTOM3DVOLUME_H
+#define QTGRAPHS_QCUSTOM3DVOLUME_H
 
 #include <QtGraphs/qcustom3ditem.h>
 #include <QtGraphs/qgraphsglobal.h>
@@ -47,6 +47,7 @@ class Q_GRAPHS_EXPORT QCustom3DVolume :
                    sliceFrameGapsChanged FINAL)
     Q_PROPERTY(QVector3D sliceFrameThicknesses READ sliceFrameThicknesses WRITE
                    setSliceFrameThicknesses NOTIFY sliceFrameThicknessesChanged FINAL)
+    QML_NAMED_ELEMENT(Custom3DVolume)
 
 public:
     explicit QCustom3DVolume(QObject *parent = nullptr);
diff -pruN 6.8.2-4/src/graphs3d/data/qheightmapsurfacedataproxy.h 6.9.1-1/src/graphs3d/data/qheightmapsurfacedataproxy.h
--- 6.8.2-4/src/graphs3d/data/qheightmapsurfacedataproxy.h	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs3d/data/qheightmapsurfacedataproxy.h	2025-05-29 02:19:47.000000000 +0000
@@ -1,8 +1,8 @@
 // Copyright (C) 2023 The Qt Company Ltd.
 // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
 
-#ifndef QHEIGHTMAPSURFACEDATAPROXY_H
-#define QHEIGHTMAPSURFACEDATAPROXY_H
+#ifndef QTGRAPHS_QHEIGHTMAPSURFACEDATAPROXY_H
+#define QTGRAPHS_QHEIGHTMAPSURFACEDATAPROXY_H
 
 #include <QtCore/qstring.h>
 #include <QtGraphs/qsurfacedataproxy.h>
@@ -26,6 +26,7 @@ class Q_GRAPHS_EXPORT QHeightMapSurfaceD
     Q_PROPERTY(float minYValue READ minYValue WRITE setMinYValue NOTIFY minYValueChanged FINAL)
     Q_PROPERTY(float maxYValue READ maxYValue WRITE setMaxYValue NOTIFY maxYValueChanged FINAL)
     Q_PROPERTY(bool autoScaleY READ autoScaleY WRITE setAutoScaleY NOTIFY autoScaleYChanged FINAL)
+    QML_NAMED_ELEMENT(HeightMapSurfaceDataProxy)
 
 public:
     explicit QHeightMapSurfaceDataProxy(QObject *parent = nullptr);
diff -pruN 6.8.2-4/src/graphs3d/data/qitemmodelbardataproxy.h 6.9.1-1/src/graphs3d/data/qitemmodelbardataproxy.h
--- 6.8.2-4/src/graphs3d/data/qitemmodelbardataproxy.h	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs3d/data/qitemmodelbardataproxy.h	2025-05-29 02:19:47.000000000 +0000
@@ -1,8 +1,8 @@
 // Copyright (C) 2023 The Qt Company Ltd.
 // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
 
-#ifndef QITEMMODELBARDATAPROXY_H
-#define QITEMMODELBARDATAPROXY_H
+#ifndef QTGRAPHS_QITEMMODELBARDATAPROXY_H
+#define QTGRAPHS_QITEMMODELBARDATAPROXY_H
 
 #include <QtCore/qabstractitemmodel.h>
 #include <QtCore/qregularexpression.h>
@@ -52,6 +52,7 @@ class Q_GRAPHS_EXPORT QItemModelBarDataP
                    NOTIFY rotationRoleReplaceChanged FINAL)
     Q_PROPERTY(QItemModelBarDataProxy::MultiMatchBehavior multiMatchBehavior READ multiMatchBehavior
                    WRITE setMultiMatchBehavior NOTIFY multiMatchBehaviorChanged FINAL)
+    QML_NAMED_ELEMENT(ItemModelBarDataProxy)
 
 public:
     enum class MultiMatchBehavior {
diff -pruN 6.8.2-4/src/graphs3d/data/qitemmodelscatterdataproxy.h 6.9.1-1/src/graphs3d/data/qitemmodelscatterdataproxy.h
--- 6.8.2-4/src/graphs3d/data/qitemmodelscatterdataproxy.h	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs3d/data/qitemmodelscatterdataproxy.h	2025-05-29 02:19:47.000000000 +0000
@@ -1,8 +1,8 @@
 // Copyright (C) 2023 The Qt Company Ltd.
 // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
 
-#ifndef QITEMMODELSCATTERDATAPROXY_H
-#define QITEMMODELSCATTERDATAPROXY_H
+#ifndef QTGRAPHS_QITEMMODELSCATTERDATAPROXY_H
+#define QTGRAPHS_QITEMMODELSCATTERDATAPROXY_H
 
 #include <QtCore/qabstractitemmodel.h>
 #include <QtCore/qregularexpression.h>
@@ -40,6 +40,7 @@ class Q_GRAPHS_EXPORT QItemModelScatterD
                    zPosRoleReplaceChanged FINAL)
     Q_PROPERTY(QString rotationRoleReplace READ rotationRoleReplace WRITE setRotationRoleReplace
                    NOTIFY rotationRoleReplaceChanged FINAL)
+    QML_NAMED_ELEMENT(ItemModelScatterDataProxy)
 
 public:
     explicit QItemModelScatterDataProxy(QObject *parent = nullptr);
diff -pruN 6.8.2-4/src/graphs3d/data/qitemmodelsurfacedataproxy.h 6.9.1-1/src/graphs3d/data/qitemmodelsurfacedataproxy.h
--- 6.8.2-4/src/graphs3d/data/qitemmodelsurfacedataproxy.h	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs3d/data/qitemmodelsurfacedataproxy.h	2025-05-29 02:19:47.000000000 +0000
@@ -1,8 +1,8 @@
 // Copyright (C) 2023 The Qt Company Ltd.
 // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
 
-#ifndef QITEMMODELSURFACEDATAPROXY_H
-#define QITEMMODELSURFACEDATAPROXY_H
+#ifndef QTGRAPHS_QITEMMODELSURFACEDATAPROXY_H
+#define QTGRAPHS_QITEMMODELSURFACEDATAPROXY_H
 
 #include <QtCore/qabstractitemmodel.h>
 #include <QtCore/qregularexpression.h>
@@ -58,6 +58,7 @@ class Q_GRAPHS_EXPORT QItemModelSurfaceD
     Q_PROPERTY(
         QItemModelSurfaceDataProxy::MultiMatchBehavior multiMatchBehavior READ multiMatchBehavior
             WRITE setMultiMatchBehavior NOTIFY multiMatchBehaviorChanged FINAL)
+    QML_NAMED_ELEMENT(ItemModelSurfaceDataProxy)
 
 public:
     enum class MultiMatchBehavior {
diff -pruN 6.8.2-4/src/graphs3d/data/qscatter3dseries.cpp 6.9.1-1/src/graphs3d/data/qscatter3dseries.cpp
--- 6.8.2-4/src/graphs3d/data/qscatter3dseries.cpp	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs3d/data/qscatter3dseries.cpp	2025-05-29 02:19:47.000000000 +0000
@@ -123,7 +123,7 @@ QT_BEGIN_NAMESPACE
  */
 
 /*!
- * \qmlproperty float Scatter3DSeries::itemSize
+ * \qmlproperty real Scatter3DSeries::itemSize
  *
  * Sets the item size for the series. The size must be between \c 0.0 and
  * \c 1.0. Setting the size to \c 0.0 causes the item size to be automatically
diff -pruN 6.8.2-4/src/graphs3d/data/qscatter3dseries.h 6.9.1-1/src/graphs3d/data/qscatter3dseries.h
--- 6.8.2-4/src/graphs3d/data/qscatter3dseries.h	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs3d/data/qscatter3dseries.h	2025-05-29 02:19:47.000000000 +0000
@@ -1,8 +1,8 @@
 // Copyright (C) 2023 The Qt Company Ltd.
 // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
 
-#ifndef QSCATTER3DSERIES_H
-#define QSCATTER3DSERIES_H
+#ifndef QTGRAPHS_QSCATTER3DSERIES_H
+#define QTGRAPHS_QSCATTER3DSERIES_H
 
 #include <QtGraphs/qabstract3dseries.h>
 #include <QtGraphs/qscatterdataproxy.h>
@@ -21,6 +21,9 @@ class Q_GRAPHS_EXPORT QScatter3DSeries :
     Q_PROPERTY(float itemSize READ itemSize WRITE setItemSize NOTIFY itemSizeChanged FINAL)
     Q_PROPERTY(QScatterDataArray dataArray READ dataArray WRITE setDataArray NOTIFY dataArrayChanged FINAL)
 
+    QML_ELEMENT
+    QML_UNCREATABLE("Trying to create uncreatable: QScatter3DSeries, use Scatter3DSeries instead.")
+
 public:
     explicit QScatter3DSeries(QObject *parent = nullptr);
     explicit QScatter3DSeries(QScatterDataProxy *dataProxy, QObject *parent = nullptr);
diff -pruN 6.8.2-4/src/graphs3d/data/qscatterdataitem.h 6.9.1-1/src/graphs3d/data/qscatterdataitem.h
--- 6.8.2-4/src/graphs3d/data/qscatterdataitem.h	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs3d/data/qscatterdataitem.h	2025-05-29 02:19:47.000000000 +0000
@@ -1,8 +1,8 @@
 // Copyright (C) 2023 The Qt Company Ltd.
 // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
 
-#ifndef QSCATTERDATAITEM_H
-#define QSCATTERDATAITEM_H
+#ifndef QTGRAPHS_QSCATTERDATAITEM_H
+#define QTGRAPHS_QSCATTERDATAITEM_H
 
 #include <QtGraphs/qgraphsglobal.h>
 #include <QtGui/qquaternion.h>
diff -pruN 6.8.2-4/src/graphs3d/data/qscatterdataproxy.h 6.9.1-1/src/graphs3d/data/qscatterdataproxy.h
--- 6.8.2-4/src/graphs3d/data/qscatterdataproxy.h	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs3d/data/qscatterdataproxy.h	2025-05-29 02:19:47.000000000 +0000
@@ -1,8 +1,8 @@
 // Copyright (C) 2023 The Qt Company Ltd.
 // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
 
-#ifndef QSCATTERDATAPROXY_H
-#define QSCATTERDATAPROXY_H
+#ifndef QTGRAPHS_QSCATTERDATAPROXY_H
+#define QTGRAPHS_QSCATTERDATAPROXY_H
 
 #include <QtGraphs/qabstractdataproxy.h>
 #include <QtGraphs/qscatterdataitem.h>
@@ -22,6 +22,8 @@ class Q_GRAPHS_EXPORT QScatterDataProxy
     Q_DECLARE_PRIVATE(QScatterDataProxy)
     Q_PROPERTY(qsizetype itemCount READ itemCount NOTIFY itemCountChanged FINAL)
     Q_PROPERTY(QScatter3DSeries *series READ series NOTIFY seriesChanged FINAL)
+    QML_NAMED_ELEMENT(ScatterDataProxy)
+    QML_UNCREATABLE("")
 
 public:
     explicit QScatterDataProxy(QObject *parent = nullptr);
diff -pruN 6.8.2-4/src/graphs3d/data/qspline3dseries.cpp 6.9.1-1/src/graphs3d/data/qspline3dseries.cpp
--- 6.8.2-4/src/graphs3d/data/qspline3dseries.cpp	1970-01-01 00:00:00.000000000 +0000
+++ 6.9.1-1/src/graphs3d/data/qspline3dseries.cpp	2025-05-29 02:19:47.000000000 +0000
@@ -0,0 +1,340 @@
+// Copyright (C) 2024 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+#include <private/qspline3dseries_p.h>
+
+QT_BEGIN_NAMESPACE
+
+/*!
+ * \class QSpline3DSeries
+ * \inmodule QtGraphs
+ * \ingroup graphs_3D
+ * \since 6.9
+ * \brief The QSpline3DSeries class represents a data series as a spline.
+ *
+ * Spline graphs are used to show information as a series of data points connected
+ * by a curved or straight Catmull-Rom spline.
+ *
+ * This class manages the spline specific visual elements.
+ *
+ * Spline3DSeries extends the Scatter3DSeries API.
+ */
+
+/*!
+ * \qmltype Spline3DSeries
+ * \nativetype QSpline3DSeries
+ * \inqmlmodule QtGraphs
+ * \ingroup graphs_qml_3D
+ * \inherits Scatter3DSeries
+ * \since 6.9
+ * \brief Represents a data series in a 3D spline graph.
+ *
+ * Spline graphs are used to show information as a series of data points connected
+ * by a curved or straight Catmull-Rom spline.
+ *
+ * This type manages the spline specific visual elements.
+ *
+ */
+
+/*!
+ * \qmlproperty bool Spline3DSeries::splineVisible
+ *
+ * Visibility of the spline. The default value is \c true.
+ */
+
+/*!
+ * \qmlproperty real Spline3DSeries::splineTension
+ *
+ * The tension of the spline.
+ *
+ * The spline uses maximum curvature for segments at a value of \c 0.0
+ * Segments are completely straight at a value of \c 1.0
+ * Must be between \c 0.0 and \c 1.0
+ * The default value is \c 0.0
+ *
+ */
+
+/*!
+ * \qmlproperty real Spline3DSeries::splineKnotting
+ *
+ * The knot parametrization of the spline.
+ *
+ * This parameter can change the profile of the curve.
+ * The spline is classified as a uniform Catmull-Rom spline at a value of \c 0.0,
+ * a centripetal Catmull-Rom spline at a value of \c 0.5,
+ * and a chordal Catmull-Rom spline at a value of \c 1.0.
+ *
+ * The value must be between \c 0.0 and \c 1.0.
+ * The default value is \c 0.5.
+ *
+ */
+
+/*!
+ * \qmlproperty bool Spline3DSeries::splineLooping
+ *
+ * Determines whether the spline loops.
+ *
+ * This adds a spline segment between the first and last points of the series
+ * connecting the spline into a loop.
+ *
+ * The default value is \c false
+ *
+ */
+
+/*!
+ * \qmlproperty int QSpline3DSeries::splineResolution
+ * 
+ * The resolution of the segments spline.
+ * 
+ * The number of vertices per spline segment,
+ * which is defined as the part between two points.
+ * 
+ * Must be a value above \c 2. 
+ * The default value is \c 10.
+ */
+
+/*!
+ * \qmlproperty color Spline3DSeries::splineColor
+ *
+ * The color of the spline.
+ *
+ */
+
+/*!
+    \qmlsignal Scatter3DSeries::splineVisibilityChanged(bool visible)
+
+    This signal is emitted when splineVisible changes to \a visible.
+*/
+
+/*!
+    \qmlsignal Scatter3DSeries::splineTensionChanged(real tension)
+
+    This signal is emitted when splineTension changes to \a tension.
+*/
+
+/*!
+    \qmlsignal Scatter3DSeries::splineKnottingChanged(real knotting)
+
+    This signal is emitted when splineKnotting changes to \a knotting.
+*/
+
+/*!
+    \qmlsignal Scatter3DSeries::splineLoopingChanged(bool looping)
+
+    This signal is emitted when splineLooping changes to \a looping.
+*/
+
+/*!
+    \qmlsignal Scatter3DSeries::splineColorChanged(color color)
+
+    This signal is emitted when splineColor changes to \a color.
+*/
+
+/*!
+    \qmlsignal Scatter3DSeries::splineResolutionChanged(int resolution)
+
+    This signal is emitted when splineResolution changes to \a resolution.
+*/
+
+/*!
+ * Constructs a spline 3D series with the parent \a parent.
+ */
+QSpline3DSeries ::QSpline3DSeries(QObject *parent)
+    : QScatter3DSeries(*(new QSpline3DSeriesPrivate()), parent)
+{
+    Q_D(QScatter3DSeries);
+    // Default proxy
+    d->setDataProxy(new QScatterDataProxy);
+}
+
+/*!
+ * Constructs a spline 3D series with the data proxy \a dataProxy and the
+ * parent \a parent.
+ */
+QSpline3DSeries ::QSpline3DSeries(QScatterDataProxy *dataProxy, QObject *parent)
+    : QScatter3DSeries(*(new QSpline3DSeriesPrivate()), parent)
+{
+    Q_D(QScatter3DSeries);
+    // Default proxy
+    d->setDataProxy(dataProxy);
+}
+
+/*!
+ * \internal
+ */
+QSpline3DSeries ::QSpline3DSeries(QSpline3DSeriesPrivate &dd, QObject *parent)
+    : QScatter3DSeries(dd, parent)
+{}
+
+/*!
+ * Deletes the spline 3D series.
+ */
+QSpline3DSeries::~QSpline3DSeries() {}
+
+/*!
+ * \property QSpline3DSeries::splineVisible
+ *
+ * \brief Visibility of the spline.
+ *
+ * Visibility of the spline.
+ * The default value is \c true.
+ *
+ */
+void QSpline3DSeries::setSplineVisible(bool visible)
+{
+    Q_D(QSpline3DSeries);
+    if (d->m_splineVisible != visible) {
+        d->m_splineVisible = visible;
+        emit splineVisibilityChanged(visible);
+    }
+}
+
+bool QSpline3DSeries::isSplineVisible() const
+{
+    const Q_D(QSpline3DSeries);
+    return d->m_splineVisible;
+}
+
+/*!
+ * \property QSpline3DSeries::splineTension
+ *
+ * \brief The tension of the spline.
+ *
+ * The spline uses maximum curvature for segments at a value of \c 0.0
+ * Segments are completely straight at a value of \c 1.0
+ * Must be between \c 0.0 and \c 1.0
+ * The default value is \c 0.0
+ *
+ */
+void QSpline3DSeries::setSplineTension(qreal tension)
+{
+    Q_D(QSpline3DSeries);
+    if (tension < 0.0f || tension > 1.0f) {
+        qWarning("Invalid tension. Valid range for tension is 0.0f...1.0f");
+    } else if (d->m_tension != tension) {
+        d->m_tension = tension;
+        emit splineTensionChanged(tension);
+    }
+}
+
+qreal QSpline3DSeries::splineTension() const
+{
+    const Q_D(QSpline3DSeries);
+    return d->m_tension;
+}
+
+/*!
+ * \property QSpline3DSeries::splineKnotting
+ *
+ * \brief The knot parametrization of the spline.
+ *
+ * This parameter can change the profile of the curve.
+ * The spline is classified as a uniform Catmull-Rom spline at a value of \c 0.0,
+ * a centripetal Catmull-Rom spline at a value of \c 0.5,
+ * and a chordal Catmull-Rom spline at a value of \c 1.0.
+ *
+ * The value must be between \c 0.0 and \c 1.0.
+ * The default value is \c 0.5.
+ *
+ */
+void QSpline3DSeries::setSplineKnotting(qreal knotting)
+{
+    Q_D(QSpline3DSeries);
+    if (knotting < 0.0f || knotting > 1.0f) {
+        qWarning("Invalid knotting. Valid range for knotting is 0.0f...1.0f");
+    } else if (d->m_knotting != knotting) {
+        d->m_knotting = knotting;
+        emit splineKnottingChanged(knotting);
+    }
+}
+
+qreal QSpline3DSeries::splineKnotting() const
+{
+    const Q_D(QSpline3DSeries);
+    return d->m_knotting;
+}
+
+/*!
+ * \property QSpline3DSeries::splineLooping
+ *
+ * \brief Determines whether the spline loops.
+ *
+ * This adds a spline segment between the first and last points of the series
+ * connecting the spline into a loop.
+ *
+ * The default value is \c false
+ *
+ */
+void QSpline3DSeries::setSplineLooping(bool looping)
+{
+    Q_D(QSpline3DSeries);
+    if (d->m_looping != looping) {
+        d->m_looping = looping;
+        emit splineLoopingChanged(looping);
+    }
+}
+
+bool QSpline3DSeries::isSplineLooping() const
+{
+    const Q_D(QSpline3DSeries);
+    return d->m_looping;
+}
+
+/*!
+ * \property QSpline3DSeries::splineColor
+ *
+ * \brief The color of the spline.
+ *
+ */
+void QSpline3DSeries::setSplineColor(QColor color)
+{
+    Q_D(QSpline3DSeries);
+    if (d->m_splineColor != color) {
+        d->m_splineColor = color;
+        emit splineColorChanged(color);
+    }
+}
+
+QColor QSpline3DSeries::splineColor() const
+{
+    const Q_D(QSpline3DSeries);
+    return d->m_splineColor;
+}
+
+/*!
+ * \property QSpline3DSeries::splineResolution
+ *
+ * \brief The resolution of the segments spline.
+ * 
+ * The number of vertices per spline segment,
+ * which is defined as the part between two points.
+ * 
+ * Must be a value above \c 2. 
+ * The default value is \c 10.
+ */
+
+void QSpline3DSeries::setSplineResolution(int resolution)
+{
+    Q_D(QSpline3DSeries);
+    if (resolution < 2) {
+        qWarning("Invalid resolution. The resolution must be 2 or above");
+    } else if (d->m_resolution != resolution) {
+        d->m_resolution = resolution;
+        emit splineResolutionChanged(resolution);
+    }
+}
+
+int QSpline3DSeries::splineResolution() const
+{
+    const Q_D(QSpline3DSeries);
+    return d->m_resolution;
+}
+
+// QSpline3DSeriesPrivate
+
+QSpline3DSeriesPrivate::QSpline3DSeriesPrivate()
+    : QScatter3DSeriesPrivate()
+{}
+
+QSpline3DSeriesPrivate::~QSpline3DSeriesPrivate() {}
+
+QT_END_NAMESPACE
diff -pruN 6.8.2-4/src/graphs3d/data/qspline3dseries.h 6.9.1-1/src/graphs3d/data/qspline3dseries.h
--- 6.8.2-4/src/graphs3d/data/qspline3dseries.h	1970-01-01 00:00:00.000000000 +0000
+++ 6.9.1-1/src/graphs3d/data/qspline3dseries.h	2025-05-29 02:19:47.000000000 +0000
@@ -0,0 +1,72 @@
+// Copyright (C) 2024 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+#ifndef QTGRAPHS_QSPLINE3DSERIES_H
+#define QTGRAPHS_QSPLINE3DSERIES_H
+
+#include <QtGraphs/qscatter3dseries.h>
+QT_BEGIN_NAMESPACE
+
+class QSpline3DSeriesPrivate;
+
+class Q_GRAPHS_EXPORT QSpline3DSeries : public QScatter3DSeries
+{
+    Q_OBJECT
+    Q_DECLARE_PRIVATE(QSpline3DSeries)
+    Q_PROPERTY(bool splineVisible READ isSplineVisible WRITE setSplineVisible NOTIFY
+                   splineVisibilityChanged FINAL)
+    Q_PROPERTY(qreal splineTension READ splineTension WRITE setSplineTension NOTIFY
+                   splineTensionChanged FINAL)
+    Q_PROPERTY(qreal splineKnotting READ splineKnotting WRITE setSplineKnotting NOTIFY
+                   splineKnottingChanged FINAL)
+    Q_PROPERTY(bool splineLooping READ isSplineLooping WRITE setSplineLooping NOTIFY
+                   splineLoopingChanged FINAL)
+    Q_PROPERTY(
+        QColor splineColor READ splineColor WRITE setSplineColor NOTIFY splineColorChanged FINAL)
+    Q_PROPERTY(int splineResolution READ splineResolution WRITE setSplineResolution NOTIFY
+                   splineResolutionChanged FINAL)
+    QML_ADDED_IN_VERSION(6, 9)
+    QML_ELEMENT
+    QML_UNCREATABLE("Trying to create uncreatable: QSpline3DSeries, use Spline3DSeries instead.")
+public:
+    explicit QSpline3DSeries(QObject *parent = nullptr);
+    explicit QSpline3DSeries(QScatterDataProxy *dataProxy, QObject *parent = nullptr);
+    ~QSpline3DSeries() override;
+
+    void setSplineVisible(bool draw);
+    bool isSplineVisible() const;
+
+    void setSplineTension(qreal tension);
+    qreal splineTension() const;
+
+    void setSplineKnotting(qreal knotting);
+    qreal splineKnotting() const;
+
+    void setSplineLooping(bool looping);
+    bool isSplineLooping() const;
+
+    void setSplineColor(QColor color);
+    QColor splineColor() const;
+
+    void setSplineResolution(int resolution);
+    int splineResolution() const;
+
+Q_SIGNALS:
+    void splineVisibilityChanged(bool visible);
+    void splineTensionChanged(qreal tension);
+    void splineKnottingChanged(qreal knotting);
+    void splineLoopingChanged(bool looping);
+    void splineColorChanged(QColor color);
+    void splineResolutionChanged(int resolution);
+
+protected:
+    explicit QSpline3DSeries(QSpline3DSeriesPrivate &d, QObject *parent = nullptr);
+
+private:
+    Q_DISABLE_COPY_MOVE(QSpline3DSeries)
+
+    friend class QQuickGraphsScatter;
+};
+
+QT_END_NAMESPACE
+
+#endif // QTGRAPHS_QSPLINE3DSERIES_H
diff -pruN 6.8.2-4/src/graphs3d/data/qspline3dseries_p.h 6.9.1-1/src/graphs3d/data/qspline3dseries_p.h
--- 6.8.2-4/src/graphs3d/data/qspline3dseries_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 6.9.1-1/src/graphs3d/data/qspline3dseries_p.h	2025-05-29 02:19:47.000000000 +0000
@@ -0,0 +1,40 @@
+// Copyright (C) 2024 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+//  W A R N I N G
+//  -------------
+//
+// This file is not part of the Qt Graphs API.  It exists purely as an
+// implementation detail.  This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+
+#ifndef QSPLINE3DSERIES_P_H
+#define QSPLINE3DSERIES_P_H
+
+#include <QtGraphs/qspline3dseries.h>
+#include <private/qscatter3dseries_p.h>
+
+QT_BEGIN_NAMESPACE
+
+class QSpline3DSeriesPrivate : public QScatter3DSeriesPrivate
+{
+    Q_DECLARE_PUBLIC(QSpline3DSeries)
+
+public:
+    QSpline3DSeriesPrivate();
+    ~QSpline3DSeriesPrivate() override;
+
+private:
+    bool m_splineVisible = true;
+    qreal m_tension = 0;
+    qreal m_knotting = 0.5;
+    bool m_looping = false;
+    QColor m_splineColor = QColor(255, 0, 0);
+    qsizetype m_resolution = 10;
+};
+
+QT_END_NAMESPACE
+
+#endif // QSPLINE3DSERIES_P_H
diff -pruN 6.8.2-4/src/graphs3d/data/qsurface3dseries.h 6.9.1-1/src/graphs3d/data/qsurface3dseries.h
--- 6.8.2-4/src/graphs3d/data/qsurface3dseries.h	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs3d/data/qsurface3dseries.h	2025-05-29 02:19:47.000000000 +0000
@@ -1,8 +1,8 @@
 // Copyright (C) 2023 The Qt Company Ltd.
 // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
 
-#ifndef QSURFACE3DSERIES_H
-#define QSURFACE3DSERIES_H
+#ifndef QTGRAPHS_QSURFACE3DSERIES_H
+#define QTGRAPHS_QSURFACE3DSERIES_H
 
 #include <QtGraphs/qabstract3dseries.h>
 #include <QtGraphs/qsurfacedataproxy.h>
@@ -31,6 +31,8 @@ class Q_GRAPHS_EXPORT QSurface3DSeries :
                    wireframeColorChanged FINAL)
     Q_PROPERTY(
         QSurfaceDataArray dataArray READ dataArray WRITE setDataArray NOTIFY dataArrayChanged FINAL)
+    QML_ELEMENT
+    QML_UNCREATABLE("Trying to create uncreatable: QSurface3DSeries, use Surface3DSeries instead.")
 
 public:
     enum DrawFlag {
diff -pruN 6.8.2-4/src/graphs3d/data/qsurfacedataitem.h 6.9.1-1/src/graphs3d/data/qsurfacedataitem.h
--- 6.8.2-4/src/graphs3d/data/qsurfacedataitem.h	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs3d/data/qsurfacedataitem.h	2025-05-29 02:19:47.000000000 +0000
@@ -1,8 +1,8 @@
 // Copyright (C) 2023 The Qt Company Ltd.
 // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
 
-#ifndef QSURFACEDATAITEM_H
-#define QSURFACEDATAITEM_H
+#ifndef QTGRAPHS_QSURFACEDATAITEM_H
+#define QTGRAPHS_QSURFACEDATAITEM_H
 
 #include <QtGraphs/qgraphsglobal.h>
 #include <QtGui/qvector3d.h>
diff -pruN 6.8.2-4/src/graphs3d/data/qsurfacedataproxy.h 6.9.1-1/src/graphs3d/data/qsurfacedataproxy.h
--- 6.8.2-4/src/graphs3d/data/qsurfacedataproxy.h	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs3d/data/qsurfacedataproxy.h	2025-05-29 02:19:47.000000000 +0000
@@ -1,8 +1,8 @@
 // Copyright (C) 2023 The Qt Company Ltd.
 // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
 
-#ifndef QSURFACEDATAPROXY_H
-#define QSURFACEDATAPROXY_H
+#ifndef QTGRAPHS_QSURFACEDATAPROXY_H
+#define QTGRAPHS_QSURFACEDATAPROXY_H
 
 #include <QtGraphs/qabstractdataproxy.h>
 #include <QtGraphs/qsurfacedataitem.h>
@@ -24,6 +24,8 @@ class Q_GRAPHS_EXPORT QSurfaceDataProxy
     Q_PROPERTY(qsizetype rowCount READ rowCount NOTIFY rowCountChanged FINAL)
     Q_PROPERTY(qsizetype columnCount READ columnCount NOTIFY columnCountChanged FINAL)
     Q_PROPERTY(QSurface3DSeries *series READ series NOTIFY seriesChanged FINAL)
+    QML_NAMED_ELEMENT(SurfaceDataProxy)
+    QML_UNCREATABLE("")
 
 public:
     explicit QSurfaceDataProxy(QObject *parent = nullptr);
diff -pruN 6.8.2-4/src/graphs3d/doc/src/qtgraphs3d-overview.qdoc 6.9.1-1/src/graphs3d/doc/src/qtgraphs3d-overview.qdoc
--- 6.8.2-4/src/graphs3d/doc/src/qtgraphs3d-overview.qdoc	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs3d/doc/src/qtgraphs3d-overview.qdoc	2025-05-29 02:19:47.000000000 +0000
@@ -64,11 +64,11 @@
 
     \section2 3D Scatter Graphs
 
-    3D scatter graphs present data as a collection of points. The
+    3D scatter graphs present data as a collection of points or a spline. The
     \l Q3DScatterWidgetItem class is used to create a graph. The
-    \l QScatter3DSeries and \l QScatterDataProxy classes are used to set data to
+    \l QScatter3DSeries or \l QSpline3DSeries and \l QScatterDataProxy classes are used to set data to
     the graph and to control the visual properties of the graph. In QML, the
-    corresponding types are \l Scatter3D, \l Scatter3DSeries, and
+    corresponding types are \l Scatter3D, \l Scatter3DSeries, \l Spline3DSeries, and
     \l ScatterDataProxy.
 
     \image q3dscatter-minimal.png
diff -pruN 6.8.2-4/src/graphs3d/doc/src/qtgraphs3d-qml-namespace.qdoc 6.9.1-1/src/graphs3d/doc/src/qtgraphs3d-qml-namespace.qdoc
--- 6.8.2-4/src/graphs3d/doc/src/qtgraphs3d-qml-namespace.qdoc	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs3d/doc/src/qtgraphs3d-qml-namespace.qdoc	2025-05-29 02:19:47.000000000 +0000
@@ -176,7 +176,29 @@
            Indicates the graph will be first rendered to an offscreen surface
     that is then drawn during normal QML item rendering. The rendered image is
     antialiased using the multisampling method if it is supported in the current
-    environment and the msaaSamples property value is greater than zero.
-    This rendering mode offers good quality and normal QML item behavior at the
-    expense of performance.
+    environment and the \l {GraphsItem3D::msaaSamples}{msaaSamples} property
+    value is greater than zero. This rendering mode offers good quality and normal
+    QML item behavior at the expense of performance.
+
+    \section1 Graphs3D.TransparencyTechnique
+
+    \value Default
+           Indicates that order-independent transparency techniques are not used.
+           Offers the best performance. Use when graphs don't contain
+           transparency or when a bar or scatter graph is also using instancing,
+           that is \l optimizationHint is {QtGraphs3D::OptimizationHint::Default}.
+
+    \value Approximate
+           Indicates that a graph attempts an approximation of order-independent
+           transparency. This method is faster than \c Accurate and works on older
+           hardware but may yield inaccurate results. Use when the order-independent
+           transparency is needed, but the performance cost has to be lower than
+           when using accurate order-independent transparency.
+
+    \value Accurate
+           Indicates that accurate order-independent transparency is used.
+           Use when perfect transparency rendering is needed.
+           \note Accurate transparency is not yet implemented
+               and will be enabled when the required functionality
+               is added to QtQuick3D.
  */
diff -pruN 6.8.2-4/src/graphs3d/engine/barinstancing.cpp 6.9.1-1/src/graphs3d/engine/barinstancing.cpp
--- 6.8.2-4/src/graphs3d/engine/barinstancing.cpp	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs3d/engine/barinstancing.cpp	2025-05-29 02:19:47.000000000 +0000
@@ -24,11 +24,14 @@ QByteArray BarInstancing::getInstanceBuf
             else
                 setDepthSortingEnabled(false);
 
+            QVector4D customData{};
+            customData.setX(item->heightValue);
             if (!item->selectedBar) {
                 auto entry = calculateTableEntryFromQuaternion(item->position,
                                                                item->scale,
                                                                item->rotation,
-                                                               item->color);
+                                                               item->color,
+                                                               customData);
                 m_instanceData.append(reinterpret_cast<char *>(&entry), sizeof(entry));
             } else {
                 // Even selected bars need to be drawn in a very small scale.
diff -pruN 6.8.2-4/src/graphs3d/engine/q3dscene.cpp 6.9.1-1/src/graphs3d/engine/q3dscene.cpp
--- 6.8.2-4/src/graphs3d/engine/q3dscene.cpp	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs3d/engine/q3dscene.cpp	2025-05-29 02:19:47.000000000 +0000
@@ -122,7 +122,7 @@ QT_BEGIN_NAMESPACE
  */
 
 /*!
- * \qmlproperty qreal Scene3D::devicePixelRatio
+ * \qmlproperty real Scene3D::devicePixelRatio
  *
  * The current device pixel ratio that is used when mapping input
  * coordinates to pixel coordinates.
diff -pruN 6.8.2-4/src/graphs3d/engine/q3dscene.h 6.9.1-1/src/graphs3d/engine/q3dscene.h
--- 6.8.2-4/src/graphs3d/engine/q3dscene.h	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs3d/engine/q3dscene.h	2025-05-29 02:19:47.000000000 +0000
@@ -1,8 +1,8 @@
 // Copyright (C) 2023 The Qt Company Ltd.
 // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
 
-#ifndef Q3DSCENE_H
-#define Q3DSCENE_H
+#ifndef QTGRAPHS_Q3DSCENE_H
+#define QTGRAPHS_Q3DSCENE_H
 
 #include <QtCore/qobject.h>
 #include <QtCore/qrect.h>
diff -pruN 6.8.2-4/src/graphs3d/engine/shaders/bars.frag 6.9.1-1/src/graphs3d/engine/shaders/bars.frag
--- 6.8.2-4/src/graphs3d/engine/shaders/bars.frag	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs3d/engine/shaders/bars.frag	2025-05-29 02:19:47.000000000 +0000
@@ -17,7 +17,10 @@ void MAIN()
         color = texture(custex, gradientUV);
         break;
     case 2: //rangegradient
-        gradientUV = vec2((VAR_WORLD_POSITION.y + 1.0) / 2.0, 0.0);
+        if (valueColoring)
+            gradientUV = vec2(heightValue, 0);
+        else
+            gradientUV = vec2(((VAR_WORLD_POSITION.y + rootScale) / 2.0) / rootScale, 0.0);
         color = texture(custex, gradientUV);
         break;
     }
diff -pruN 6.8.2-4/src/graphs3d/engine/shaders/barsinstancing.frag 6.9.1-1/src/graphs3d/engine/shaders/barsinstancing.frag
--- 6.8.2-4/src/graphs3d/engine/shaders/barsinstancing.frag	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs3d/engine/shaders/barsinstancing.frag	2025-05-29 02:19:47.000000000 +0000
@@ -5,6 +5,7 @@ float directionalBrightness = 0.75; // 0
 VARYING vec3 pos;
 VARYING vec3 instanceColor;
 VARYING float instanceAlpha;
+VARYING float heightValue;
 
 void MAIN()
 {
@@ -24,7 +25,10 @@ void MAIN()
         alpha = texture(custex, gradientUV).w;
         break;
     case 2: //rangegradient
-        gradientUV = vec2((VAR_WORLD_POSITION.y + 1.0) / 2.0, 0.0);
+        if (valueColoring)
+            gradientUV = vec2(heightValue, 0);
+        else
+            gradientUV = vec2(((VAR_WORLD_POSITION.y + rootScale) / 2.0) / rootScale, 0.0);
         color = texture(custex, gradientUV).xyz;
         alpha = texture(custex, gradientUV).w;
         break;
diff -pruN 6.8.2-4/src/graphs3d/engine/shaders/barsinstancing.vert 6.9.1-1/src/graphs3d/engine/shaders/barsinstancing.vert
--- 6.8.2-4/src/graphs3d/engine/shaders/barsinstancing.vert	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs3d/engine/shaders/barsinstancing.vert	2025-05-29 02:19:47.000000000 +0000
@@ -1,11 +1,13 @@
 VARYING vec3 pos;
 VARYING vec3 instanceColor;
 VARYING float instanceAlpha;
+VARYING float heightValue;
 
 void MAIN()
 {
     pos = VERTEX;
     instanceColor = INSTANCE_COLOR.rgb;
     instanceAlpha = INSTANCE_COLOR.a;
+    heightValue = INSTANCE_DATA.x;
     POSITION = INSTANCE_MODELVIEWPROJECTION_MATRIX * vec4(VERTEX, 1.0);
 }
diff -pruN 6.8.2-4/src/graphs3d/engine/shaders/scatter.frag 6.9.1-1/src/graphs3d/engine/shaders/scatter.frag
--- 6.8.2-4/src/graphs3d/engine/shaders/scatter.frag	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs3d/engine/shaders/scatter.frag	2025-05-29 02:19:47.000000000 +0000
@@ -23,7 +23,7 @@ void MAIN()
         color = texture(custex, gradientUV);
         break;
     case 2: //  Range gradient
-        vec2 gradientUV = vec2((VAR_WORLD_POSITION.y + 1.0) / 2.0, 0.0);
+        vec2 gradientUV = vec2(((VAR_WORLD_POSITION.y + rootScale) / 2.0) / rootScale, 0.0);
         color = texture(custex, gradientUV);
         break;
     }
diff -pruN 6.8.2-4/src/graphs3d/engine/shaders/scatterinstancing.frag 6.9.1-1/src/graphs3d/engine/shaders/scatterinstancing.frag
--- 6.8.2-4/src/graphs3d/engine/shaders/scatterinstancing.frag	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs3d/engine/shaders/scatterinstancing.frag	2025-05-29 02:19:47.000000000 +0000
@@ -24,7 +24,7 @@ void MAIN()
         color = texture(custex, gradientUV);
         break;
     case 2: //  Range gradient
-        vec2 gradientUV = vec2((VAR_WORLD_POSITION.y + 1.0) / 2.0, 0.0);
+        vec2 gradientUV = vec2(((VAR_WORLD_POSITION.y + rootScale) / 2.0) / rootScale, 0.0);
         color = texture(custex, gradientUV);
         if (!usePoint)
             color = vColor;
diff -pruN 6.8.2-4/src/graphs3d/engine/shaders/spline.frag 6.9.1-1/src/graphs3d/engine/shaders/spline.frag
--- 6.8.2-4/src/graphs3d/engine/shaders/spline.frag	1970-01-01 00:00:00.000000000 +0000
+++ 6.9.1-1/src/graphs3d/engine/shaders/spline.frag	2025-05-29 02:19:47.000000000 +0000
@@ -0,0 +1,6 @@
+void MAIN(){
+}
+
+void POST_PROCESS() {
+    COLOR_SUM = color;
+}
diff -pruN 6.8.2-4/src/graphs3d/engine/shaders/spline.vert 6.9.1-1/src/graphs3d/engine/shaders/spline.vert
--- 6.8.2-4/src/graphs3d/engine/shaders/spline.vert	1970-01-01 00:00:00.000000000 +0000
+++ 6.9.1-1/src/graphs3d/engine/shaders/spline.vert	2025-05-29 02:19:47.000000000 +0000
@@ -0,0 +1,50 @@
+void MAIN() {
+
+    //Catmull-Rom spline
+
+    float curveIndex = UV0.y;
+    float step = 1.0f / float(points);
+
+    //add small offset to avoid sampling the edge of each texture pixel
+    float pixelOffset = step * 0.1f;
+
+
+    vec3 p0 = texture(controlPoints, vec2(curveIndex + pixelOffset, 0.5f)).xyz;
+    vec3 p1 = texture(controlPoints, vec2(curveIndex + step + pixelOffset , 0.5f)).xyz;
+    vec3 p2 = texture(controlPoints, vec2(curveIndex + 2.0f*step + pixelOffset , 0.5f)).xyz;
+    vec3 p3 = texture(controlPoints, vec2(curveIndex + 3.0f*step + pixelOffset , 0.5f)).xyz;
+
+    // check if looping segment
+    float lastThresh = 1.0f - (1.0f / float(points - 2.0f)) - 0.001f;
+    bool lastSegment = (curveIndex * points) / (points - 2.0f) >= lastThresh;
+
+    if (loop && lastSegment) {
+        p2 = texture(controlPoints, vec2(step, 0.5f)).xyz;
+        p3 = texture(controlPoints, vec2(2.0f* step, 0.5f)).xyz;
+    }
+
+    float t01 = pow(distance(p0, p1), knotting);
+    float t12 = pow(distance(p1, p2), knotting);
+    float t23 = pow(distance(p2, p3), knotting);
+
+    vec3 m1 = (1.0f - tension) *
+        (p2 - p1 + t12 * ((p1 - p0) / t01 - (p2 - p0) / (t01 + t12)));
+    vec3 m2 = (1.0f - tension) *
+        (p2 - p1 + t12 * ((p3 - p2) / t23 - (p3 - p1) / (t12 + t23)));
+
+    vec3 A = 2.0f * (p1 - p2) + m1 + m2;
+    vec3 B = -3.0f * (p1 - p2) - m1 - m1 - m2;
+    vec3 C = m1;
+    vec3 D = p1;
+
+    float t = UV0.x;
+
+    vec3 point =
+            A * t * t * t +
+            B * t * t +
+            C * t +
+            D;
+
+    vec4 pos = MODELVIEWPROJECTION_MATRIX * vec4(point, 1.0f);
+    POSITION = pos;
+}
diff -pruN 6.8.2-4/src/graphs3d/engine/shaders/surface.frag 6.9.1-1/src/graphs3d/engine/shaders/surface.frag
--- 6.8.2-4/src/graphs3d/engine/shaders/surface.frag	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs3d/engine/shaders/surface.frag	2025-05-29 02:19:47.000000000 +0000
@@ -6,21 +6,21 @@ VARYING vec2 UV;
 
 void MAIN()
 {
-    if (any(greaterThan(UV, vec2(1.01))) || abs(VAR_WORLD_POSITION.y) > graphHeight)
+    if (any(greaterThan(UV, vec2(1.01))) || abs(pos.y) > graphHeight)
         discard;
-    vec3 color;
+    vec4 color;
     vec2 gradientUV;
     switch (colorStyle) {
     case 0: //Object gradient
         gradientUV = vec2(gradientMin + pos.y * gradientHeight, 0.0);
-        color = texture(custex, gradientUV).xyz;
+        color = texture(custex, gradientUV);
         break;
     case 1: //Range gradient
-        gradientUV = vec2((VAR_WORLD_POSITION.y + 1.0) / 2.0, 0.0);
-        color = texture(custex, gradientUV).xyz;
+        gradientUV = vec2(((VAR_WORLD_POSITION.y + rootScale) / 2.0) / rootScale, 0.0);
+        color = texture(custex, gradientUV);
         break;
     case 2: // Uniform color
-        color = uniformColor.rgb;
+        color = uniformColor;
         break;
     case 3: // Textured model
         vec2 offsetNormalized = uvOffset * (1 / (vertCount - 1));
@@ -29,7 +29,7 @@ void MAIN()
             texUV.x = 1 - texUV.x;
         if (flipV)
             texUV.y = 1 - texUV.y;
-        color = texture(baseColor, texUV).xyz;
+        color = texture(baseColor, texUV);
         break;
     }
 
@@ -41,7 +41,7 @@ void MAIN()
             n = normalize(cross(dpdx,dpdy));
         NORMAL = n;
     }
-    diffuse = vec4(color, 1.0);
+    diffuse = vec4(color);
     BASE_COLOR = diffuse;
 }
 
diff -pruN 6.8.2-4/src/graphs3d/engine/shaders/surface.vert 6.9.1-1/src/graphs3d/engine/shaders/surface.vert
--- 6.8.2-4/src/graphs3d/engine/shaders/surface.vert	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs3d/engine/shaders/surface.vert	2025-05-29 02:19:47.000000000 +0000
@@ -32,6 +32,6 @@ void MAIN()
 
     pos = VERTEX;
     vec4 pos = MODELVIEWPROJECTION_MATRIX * vec4(VERTEX, 1.0);
-    pos.z += 0.000001;
+    pos.z += 0.000002 * (order + 1);
     POSITION = pos;
 }
diff -pruN 6.8.2-4/src/graphs3d/engine/shaders/surfaceGrid.frag 6.9.1-1/src/graphs3d/engine/shaders/surfaceGrid.frag
--- 6.8.2-4/src/graphs3d/engine/shaders/surfaceGrid.frag	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs3d/engine/shaders/surfaceGrid.frag	2025-05-29 02:19:47.000000000 +0000
@@ -1,7 +1,8 @@
 vec4 color;
+VARYING vec3 pos;
 void MAIN()
 {
-    if (abs(VAR_WORLD_POSITION.y) > graphHeight)
+    if (abs(pos.y) > graphHeight)
         discard;
     color = gridColor;
 }
diff -pruN 6.8.2-4/src/graphs3d/engine/shaders/surfaceGrid.vert 6.9.1-1/src/graphs3d/engine/shaders/surfaceGrid.vert
--- 6.8.2-4/src/graphs3d/engine/shaders/surfaceGrid.vert	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs3d/engine/shaders/surfaceGrid.vert	2025-05-29 02:19:47.000000000 +0000
@@ -1,6 +1,8 @@
+VARYING vec3 pos;
 void MAIN()
 {
     vec2 UV = UV0 * (vertices / range);
     VERTEX = texture(height, UV).rgb;
+    pos = VERTEX;
     POSITION = MODELVIEWPROJECTION_MATRIX * vec4(VERTEX, 1.0);
 }
diff -pruN 6.8.2-4/src/graphs3d/qml/foreigntypes_p.h 6.9.1-1/src/graphs3d/qml/foreigntypes_p.h
--- 6.8.2-4/src/graphs3d/qml/foreigntypes_p.h	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs3d/qml/foreigntypes_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1,90 +0,0 @@
-// Copyright (C) 2023 The Qt Company Ltd.
-// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
-
-//
-//  W A R N I N G
-//  -------------
-//
-// This file is not part of the QtGraphs API.  It exists purely as an
-// implementation detail.  This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-
-#ifndef FOREIGNTYPES_P_H
-#define FOREIGNTYPES_P_H
-
-#include <QtQml/qqml.h>
-
-#include <QtCore/qabstractitemmodel.h>
-
-#include <QtCore/private/qglobal_p.h>
-#include <QtGraphs/q3dscene.h>
-#include <QtGraphs/qabstract3daxis.h>
-#include <QtGraphs/qabstract3dseries.h>
-#include <QtGraphs/qabstractdataproxy.h>
-#include <QtGraphs/qcategory3daxis.h>
-#include <QtGraphs/qcustom3ditem.h>
-#include <QtGraphs/qcustom3dlabel.h>
-#include <QtGraphs/qcustom3dvolume.h>
-#include <QtGraphs/qlogvalue3daxisformatter.h>
-#include <QtGraphs/qscatter3dseries.h>
-#include <QtGraphs/qscatterdataproxy.h>
-#include <QtGraphs/qsurface3dseries.h>
-#include <QtGraphs/qsurfacedataproxy.h>
-#include <QtGraphs/qvalue3daxis.h>
-#include <QtGraphs/qvalue3daxisformatter.h>
-
-QT_BEGIN_NAMESPACE
-
-#define DEFINE_FOREIGN_BASE_ATTRIBUTES(type, name, minor) \
-    Q_GADGET \
-    QML_NAMED_ELEMENT(name) \
-    QML_FOREIGN(type) \
-    QML_ADDED_IN_VERSION(6, minor)
-
-#define DEFINE_FOREIGN_UNCREATABLE_TYPE(type, name) \
-    struct type##GraphsForeign \
-    { \
-        DEFINE_FOREIGN_BASE_ATTRIBUTES(type, name, 6) \
-        QML_UNCREATABLE("") \
-    };
-
-#define DEFINE_FOREIGN_CREATABLE_TYPE(type, name, minor) \
-    struct type##GraphsForeign \
-    { \
-        DEFINE_FOREIGN_BASE_ATTRIBUTES(type, name, minor) \
-    };
-
-#define DEFINE_FOREIGN_REPLACED_TYPE(type, name, better) \
-    struct type##GraphsForeign \
-    { \
-        DEFINE_FOREIGN_BASE_ATTRIBUTES(type, name, 6) \
-        QML_UNCREATABLE("Trying to create uncreatable: " #name ", use " #better " instead.") \
-    };
-
-struct Q3DSceneForeign
-{
-    Q_GADGET
-    QML_ANONYMOUS
-    QML_FOREIGN(Q3DScene)
-};
-
-DEFINE_FOREIGN_CREATABLE_TYPE(QCategory3DAxis, Category3DAxis, 6)
-DEFINE_FOREIGN_CREATABLE_TYPE(QValue3DAxis, Value3DAxis, 6)
-
-DEFINE_FOREIGN_CREATABLE_TYPE(QCustom3DItem, Custom3DItem, 6)
-DEFINE_FOREIGN_CREATABLE_TYPE(QCustom3DLabel, Custom3DLabel, 6)
-DEFINE_FOREIGN_CREATABLE_TYPE(QLogValue3DAxisFormatter, LogValue3DAxisFormatter, 6)
-DEFINE_FOREIGN_CREATABLE_TYPE(QValue3DAxisFormatter, Value3DAxisFormatter, 6)
-
-DEFINE_FOREIGN_CREATABLE_TYPE(QCustom3DVolume, Custom3DVolume, 6)
-
-DEFINE_FOREIGN_UNCREATABLE_TYPE(QAbstract3DAxis, Abstract3DAxis)
-DEFINE_FOREIGN_UNCREATABLE_TYPE(QAbstract3DSeries, Abstract3DSeries)
-DEFINE_FOREIGN_UNCREATABLE_TYPE(QAbstractDataProxy, AbstractDataProxy)
-DEFINE_FOREIGN_UNCREATABLE_TYPE(QAbstractItemModel, AbstractItemModel)
-
-QT_END_NAMESPACE
-
-#endif // FOREIGNTYPES_P_H
diff -pruN 6.8.2-4/src/graphs3d/qml/foreigntypesbars_p.h 6.9.1-1/src/graphs3d/qml/foreigntypesbars_p.h
--- 6.8.2-4/src/graphs3d/qml/foreigntypesbars_p.h	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs3d/qml/foreigntypesbars_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1,58 +0,0 @@
-// Copyright (C) 2024 The Qt Company Ltd.
-// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
-
-//
-//  W A R N I N G
-//  -------------
-//
-// This file is not part of the QtGraphs API.  It exists purely as an
-// implementation detail.  This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-
-#ifndef FOREIGNTYPESBARS_P_H
-#define FOREIGNTYPESBARS_P_H
-
-#include <QtCore/private/qglobal_p.h>
-#include <QtGraphs/qbar3dseries.h>
-#include <QtGraphs/qbardataproxy.h>
-#include <QtGraphs/qitemmodelbardataproxy.h>
-
-QT_BEGIN_NAMESPACE
-
-#define DEFINE_FOREIGN_BASE_ATTRIBUTES(type, name, minor) \
-    Q_GADGET \
-    QML_NAMED_ELEMENT(name) \
-    QML_FOREIGN(type) \
-    QML_ADDED_IN_VERSION(6, minor)
-
-#define DEFINE_FOREIGN_UNCREATABLE_TYPE(type, name) \
-    struct type##GraphsForeign \
-    { \
-        DEFINE_FOREIGN_BASE_ATTRIBUTES(type, name, 6) \
-        QML_UNCREATABLE("") \
-    };
-
-#define DEFINE_FOREIGN_CREATABLE_TYPE(type, name, minor) \
-    struct type##GraphsForeign \
-    { \
-        DEFINE_FOREIGN_BASE_ATTRIBUTES(type, name, minor) \
-    };
-
-#define DEFINE_FOREIGN_REPLACED_TYPE(type, name, better) \
-    struct type##GraphsForeign \
-    { \
-        DEFINE_FOREIGN_BASE_ATTRIBUTES(type, name, 6) \
-        QML_UNCREATABLE("Trying to create uncreatable: " #name ", use " #better " instead.") \
-    };
-
-DEFINE_FOREIGN_CREATABLE_TYPE(QItemModelBarDataProxy, ItemModelBarDataProxy, 6)
-
-DEFINE_FOREIGN_REPLACED_TYPE(QBar3DSeries, QBar3DSeries, Bar3DSeries)
-
-DEFINE_FOREIGN_UNCREATABLE_TYPE(QBarDataProxy, BarDataProxy)
-
-QT_END_NAMESPACE
-
-#endif // FOREIGNTYPESBARS_P_H
diff -pruN 6.8.2-4/src/graphs3d/qml/foreigntypesscatter_p.h 6.9.1-1/src/graphs3d/qml/foreigntypesscatter_p.h
--- 6.8.2-4/src/graphs3d/qml/foreigntypesscatter_p.h	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs3d/qml/foreigntypesscatter_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1,58 +0,0 @@
-// Copyright (C) 2024 The Qt Company Ltd.
-// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
-
-//
-//  W A R N I N G
-//  -------------
-//
-// This file is not part of the QtGraphs API.  It exists purely as an
-// implementation detail.  This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-
-#ifndef FOREIGNTYPESSCATTER_P_H
-#define FOREIGNTYPESSCATTER_P_H
-
-#include <QtCore/private/qglobal_p.h>
-#include <QtGraphs/qitemmodelscatterdataproxy.h>
-#include <QtGraphs/qscatter3dseries.h>
-#include <QtGraphs/qscatterdataproxy.h>
-
-QT_BEGIN_NAMESPACE
-
-#define DEFINE_FOREIGN_BASE_ATTRIBUTES(type, name, minor) \
-    Q_GADGET \
-    QML_NAMED_ELEMENT(name) \
-    QML_FOREIGN(type) \
-    QML_ADDED_IN_VERSION(6, minor)
-
-#define DEFINE_FOREIGN_UNCREATABLE_TYPE(type, name) \
-    struct type##GraphsForeign \
-    { \
-        DEFINE_FOREIGN_BASE_ATTRIBUTES(type, name, 6) \
-        QML_UNCREATABLE("") \
-    };
-
-#define DEFINE_FOREIGN_CREATABLE_TYPE(type, name, minor) \
-    struct type##GraphsForeign \
-    { \
-        DEFINE_FOREIGN_BASE_ATTRIBUTES(type, name, minor) \
-    };
-
-#define DEFINE_FOREIGN_REPLACED_TYPE(type, name, better) \
-    struct type##GraphsForeign \
-    { \
-        DEFINE_FOREIGN_BASE_ATTRIBUTES(type, name, 6) \
-        QML_UNCREATABLE("Trying to create uncreatable: " #name ", use " #better " instead.") \
-    };
-
-DEFINE_FOREIGN_CREATABLE_TYPE(QItemModelScatterDataProxy, ItemModelScatterDataProxy, 6)
-
-DEFINE_FOREIGN_REPLACED_TYPE(QScatter3DSeries, QScatter3DSeries, Scatter3DSeries)
-
-DEFINE_FOREIGN_UNCREATABLE_TYPE(QScatterDataProxy, ScatterDataProxy)
-
-QT_END_NAMESPACE
-
-#endif // FOREIGNTYPESSCATTER_P_H
diff -pruN 6.8.2-4/src/graphs3d/qml/foreigntypessurface_p.h 6.9.1-1/src/graphs3d/qml/foreigntypessurface_p.h
--- 6.8.2-4/src/graphs3d/qml/foreigntypessurface_p.h	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs3d/qml/foreigntypessurface_p.h	1970-01-01 00:00:00.000000000 +0000
@@ -1,60 +0,0 @@
-// Copyright (C) 2024 The Qt Company Ltd.
-// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
-
-//
-//  W A R N I N G
-//  -------------
-//
-// This file is not part of the QtGraphs API.  It exists purely as an
-// implementation detail.  This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-
-#ifndef FOREIGNTYPESSURFACE_P_H
-#define FOREIGNTYPESSURFACE_P_H
-
-#include <QtCore/private/qglobal_p.h>
-#include <QtGraphs/qheightmapsurfacedataproxy.h>
-#include <QtGraphs/qitemmodelsurfacedataproxy.h>
-#include <QtGraphs/qsurface3dseries.h>
-#include <QtGraphs/qsurfacedataproxy.h>
-
-QT_BEGIN_NAMESPACE
-
-#define DEFINE_FOREIGN_BASE_ATTRIBUTES(type, name, minor) \
-    Q_GADGET \
-    QML_NAMED_ELEMENT(name) \
-    QML_FOREIGN(type) \
-    QML_ADDED_IN_VERSION(6, minor)
-
-#define DEFINE_FOREIGN_UNCREATABLE_TYPE(type, name) \
-    struct type##GraphsForeign \
-    { \
-        DEFINE_FOREIGN_BASE_ATTRIBUTES(type, name, 6) \
-        QML_UNCREATABLE("") \
-    };
-
-#define DEFINE_FOREIGN_CREATABLE_TYPE(type, name, minor) \
-    struct type##GraphsForeign \
-    { \
-        DEFINE_FOREIGN_BASE_ATTRIBUTES(type, name, minor) \
-    };
-
-#define DEFINE_FOREIGN_REPLACED_TYPE(type, name, better) \
-    struct type##GraphsForeign \
-    { \
-        DEFINE_FOREIGN_BASE_ATTRIBUTES(type, name, 6) \
-        QML_UNCREATABLE("Trying to create uncreatable: " #name ", use " #better " instead.") \
-    };
-
-DEFINE_FOREIGN_CREATABLE_TYPE(QHeightMapSurfaceDataProxy, HeightMapSurfaceDataProxy, 6)
-DEFINE_FOREIGN_CREATABLE_TYPE(QItemModelSurfaceDataProxy, ItemModelSurfaceDataProxy, 6)
-
-DEFINE_FOREIGN_REPLACED_TYPE(QSurface3DSeries, QSurface3DSeries, Surface3DSeries)
-
-DEFINE_FOREIGN_UNCREATABLE_TYPE(QSurfaceDataProxy, SurfaceDataProxy)
-
-QT_END_NAMESPACE
-
-#endif // FOREIGNTYPESSURFACE_P_H
diff -pruN 6.8.2-4/src/graphs3d/qml/qquickgraphsbars.cpp 6.9.1-1/src/graphs3d/qml/qquickgraphsbars.cpp
--- 6.8.2-4/src/graphs3d/qml/qquickgraphsbars.cpp	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs3d/qml/qquickgraphsbars.cpp	2025-05-29 02:19:47.000000000 +0000
@@ -744,19 +744,6 @@ void QQuickGraphsBars::componentComplete
 
 void QQuickGraphsBars::synchData()
 {
-    if (!m_noZeroInRange) {
-        setMinCameraYRotation(-90.0f);
-        setMaxCameraYRotation(90.0f);
-    } else {
-        if ((m_hasNegativeValues && !valueAxis()->reversed())
-            || (!m_hasNegativeValues && valueAxis()->reversed())) {
-            setMinCameraYRotation(-90.0f);
-            setMaxCameraYRotation(0.0f);
-        } else {
-            setMinCameraYRotation(0.0f);
-            setMaxCameraYRotation(90.0f);
-        }
-    }
     if (m_changeTracker.barSpecsChanged || !m_cachedBarThickness.isValid()) {
         updateBarSpecs(m_barThicknessRatio, m_barSpacing, m_isBarSpecRelative);
         m_changeTracker.barSpecsChanged = false;
@@ -996,6 +983,25 @@ void QQuickGraphsBars::calculateHeightAd
     else if (valueAxis()->min() >= m_actualFloorLevel)
         m_hasNegativeValues = false;
 
+    // Check first if user has set the ranges
+    if (!isUserCameraRotationRange()) {
+        // If not, adjust them automatically based on possibly existing negative values
+        if (!m_noZeroInRange) {
+            setMinCameraYRotation(-90.0f);
+            setMaxCameraYRotation(90.0f);
+        } else {
+            if ((m_hasNegativeValues && !valueAxis()->reversed())
+                || (!m_hasNegativeValues && valueAxis()->reversed())) {
+                setMinCameraYRotation(-90.0f);
+                setMaxCameraYRotation(0.0f);
+            } else {
+                setMinCameraYRotation(0.0f);
+                setMaxCameraYRotation(90.0f);
+            }
+        }
+        setUserCameraRotationRange(false);
+    }
+
     if (valueAxis()->max() < m_actualFloorLevel) {
         m_heightNormalizer = float(qFabs(valueAxis()->min()) - qFabs(valueAxis()->max()));
         maxAbs = qFabs(valueAxis()->max()) - qFabs(valueAxis()->min());
@@ -1284,6 +1290,12 @@ void QQuickGraphsBars::handleRowColorsCh
     emitNeedRender();
 }
 
+void QQuickGraphsBars::handleValueColoringChanged()
+{
+    setSeriesVisualsDirty(true);
+    emitNeedRender();
+}
+
 void QQuickGraphsBars::connectSeries(QBar3DSeries *series)
 {
     m_meshType = series->mesh();
@@ -1309,6 +1321,10 @@ void QQuickGraphsBars::connectSeries(QBa
                      &QBar3DSeries::rowColorsChanged,
                      this,
                      &QQuickGraphsBars::handleRowColorsChanged);
+    QObject::connect(series,
+                     &QBar3DSeries::valueColoringEnabledChanged,
+                     this,
+                     &QQuickGraphsBars::handleValueColoringChanged);
 }
 
 void QQuickGraphsBars::disconnectSeries(QBar3DSeries *series)
@@ -1743,6 +1759,10 @@ void QQuickGraphsBars::updateBarVisuals(
                                          barColor,
                                          transparency);
             }
+            QQmlListReference materialsRef(model, "materials");
+            auto customMaterial = qobject_cast<QQuick3DCustomMaterial *>(materialsRef.at(0));
+            customMaterial->setProperty("valueColoring", series->isValueColoringEnabled());
+            customMaterial->setProperty("heightValue", barList.at(i)->heightValue);
         }
     } else if (optimizationHint() == QtGraphs3D::OptimizationHint::Default) {
         for (int i = 0; i < barList.count(); i++) {
@@ -1773,6 +1793,10 @@ void QQuickGraphsBars::updateBarVisuals(
                                              transparency);
                 }
             }
+            QQmlListReference materialsRef(barList.at(i)->model, "materials");
+            auto customMaterial = qobject_cast<QQuick3DCustomMaterial *>(materialsRef.at(0));
+            customMaterial->setProperty("valueColoring", series->isValueColoringEnabled());
+            customMaterial->setProperty("rootScale", rootNode()->scale().y());
         }
     }
 }
@@ -1838,6 +1862,7 @@ void QQuickGraphsBars::updateMaterialPro
         customMaterial->setProperty("isHighlight", isHighlight || isMultiHighlight);
     }
     customMaterial->setProperty("specularBrightness", lightStrength() * 0.05);
+    customMaterial->setProperty("rootScale", rootNode()->scale().y());
 }
 
 void QQuickGraphsBars::removeBarModels()
@@ -1910,6 +1935,90 @@ bool QQuickGraphsBars::doPicking(QPointF
     QQuick3DModel *selectedModel = nullptr;
     QVector3D instancePos = {.0f, .0f, .0f};
     if (!selectionMode().testFlag(QtGraphs3D::SelectionFlag::None)) {
+        if (!pickResults.isEmpty()) {
+            for (const auto &picked : std::as_const(pickResults)) {
+                if (const auto &hit = picked.objectHit()) {
+                    if (hit == backgroundBB() || hit == background()) {
+                        resetClickedStatus();
+                        continue;
+                    } else if (hit->objectName().contains(QStringLiteral("BarModel"))) {
+                        if (optimizationHint() == QtGraphs3D::OptimizationHint::Legacy) {
+                            selectedModel = hit;
+                            for (const auto barlist : std::as_const(m_barModelsMap)) {
+                                for (const auto barModel : *barlist) {
+                                    if (barModel->model == selectedModel) {
+                                        setSelectedBar(barModel->coord,
+                                                       m_barModelsMap.key(barlist),
+                                                       false);
+                                    }
+                                }
+                            }
+                            break;
+                        } else if (optimizationHint() == QtGraphs3D::OptimizationHint::Default) {
+                            BarInstancing *barIns = static_cast<BarInstancing *>(hit->instancing());
+                            // Prevents to select bars with a height of 0 which affect picking.
+                            if (!barIns->dataArray().isEmpty()
+                                && barIns->dataArray().at(picked.instanceIndex())->heightValue
+                                       != 0) {
+                                selectedModel = hit;
+                                instancePos = selectedModel->instancing()->instancePosition(
+                                    picked.instanceIndex());
+                                for (const auto barlist : std::as_const(m_barModelsMap)) {
+                                    for (const auto barModel : *barlist) {
+                                        QList<BarItemHolder *> barItemList = barModel->instancing
+                                                                                 ->dataArray();
+                                        for (const auto bih : barItemList) {
+                                            if (bih->position == instancePos) {
+                                                setSelectedBar(bih->coord,
+                                                               m_barModelsMap.key(barlist),
+                                                               false);
+                                                if (isSliceEnabled())
+                                                    setSliceActivatedChanged(true);
+                                            }
+                                        }
+                                    }
+                                }
+                                break;
+                            }
+                        }
+                    } else if (hit->objectName().contains(QStringLiteral("ElementAxis"))) {
+                        QPoint coord = invalidSelectionPosition();
+                        if (selectionMode().testFlag(QtGraphs3D::SelectionFlag::Column)
+                            && selectedAxis() == axisX()) {
+                            // Use row from previous selection in case of row + column mode
+                            int previousRow = qMax(0, m_selectedBar.x());
+                            coord = QPoint(previousRow, selectedLabelIndex());
+                        } else if (selectionMode().testFlag(QtGraphs3D::SelectionFlag::Row)
+                                   && selectedAxis() == axisZ()) {
+                            // Use column from previous selection in case of row + column mode
+                            int previousCol = qMax(0, m_selectedBar.y());
+                            coord = QPoint(selectedLabelIndex(), previousCol);
+                        }
+                        for (auto it = m_barModelsMap.begin(); it != m_barModelsMap.end(); it++) {
+                            if (it.key()->isVisible())
+                                setSelectedBar(coord, it.key(), false);
+                        }
+                        break;
+                    }
+                }
+            }
+        } else {
+            resetClickedStatus();
+        }
+    }
+    return true;
+}
+
+bool QQuickGraphsBars::doRayPicking(QVector3D origin, QVector3D direction)
+{
+    if (!QQuickGraphsItem::doRayPicking(origin, direction))
+        return false;
+
+    m_selectionDirty = true;
+    QList<QQuick3DPickResult> pickResults = rayPickAll(origin, direction);
+    QQuick3DModel *selectedModel = nullptr;
+    QVector3D instancePos = {.0f, .0f, .0f};
+    if (!selectionMode().testFlag(QtGraphs3D::SelectionFlag::None)) {
         if (!pickResults.isEmpty()) {
             for (const auto &picked : std::as_const(pickResults)) {
                 if (const auto &hit = picked.objectHit()) {
diff -pruN 6.8.2-4/src/graphs3d/qml/qquickgraphsbars_p.h 6.9.1-1/src/graphs3d/qml/qquickgraphsbars_p.h
--- 6.8.2-4/src/graphs3d/qml/qquickgraphsbars_p.h	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs3d/qml/qquickgraphsbars_p.h	2025-05-29 02:19:47.000000000 +0000
@@ -168,6 +168,7 @@ protected:
     void handleLabelCountChanged(QQuick3DRepeater *repeater, QColor axisLabelColor) override;
     void updateSelectionMode(QtGraphs3D::SelectionFlags mode) override;
     bool doPicking(QPointF position) override;
+    bool doRayPicking(QVector3D origin, QVector3D direction) override;
     QAbstract3DAxis *createDefaultAxis(QAbstract3DAxis::AxisOrientation orientation) override;
     void updateSliceItemLabel(const QString &label, QVector3D position) override;
 
@@ -187,6 +188,7 @@ public Q_SLOTS:
     void handleDataRowLabelsChanged();
     void handleDataColumnLabelsChanged();
     void handleRowColorsChanged();
+    void handleValueColoringChanged();
 
 Q_SIGNALS:
     void rowAxisChanged(QCategory3DAxis *axis);
diff -pruN 6.8.2-4/src/graphs3d/qml/qquickgraphsbarsseries_p.h 6.9.1-1/src/graphs3d/qml/qquickgraphsbarsseries_p.h
--- 6.8.2-4/src/graphs3d/qml/qquickgraphsbarsseries_p.h	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs3d/qml/qquickgraphsbarsseries_p.h	2025-05-29 02:19:47.000000000 +0000
@@ -14,9 +14,9 @@
 #ifndef QQUICKGRAPHSBARSSERIES_P_H
 #define QQUICKGRAPHSBARSSERIES_P_H
 
-#include "common/theme/qquickgraphscolor_p.h"
 #include "gradientholder_p.h"
 #include "qbar3dseries.h"
+#include "theme/qquickgraphscolor_p.h"
 
 #include <QtQml/qqml.h>
 #include <QtQuick/private/qquickrectangle_p.h>
diff -pruN 6.8.2-4/src/graphs3d/qml/qquickgraphsitem.cpp 6.9.1-1/src/graphs3d/qml/qquickgraphsitem.cpp
--- 6.8.2-4/src/graphs3d/qml/qquickgraphsitem.cpp	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs3d/qml/qquickgraphsitem.cpp	2025-05-29 02:19:47.000000000 +0000
@@ -76,20 +76,52 @@ constexpr float polarRoundness = 64.0f;
  */
 
 /*!
- * \qmlproperty float GraphsItem3D::cameraXRotation
+ * \qmlproperty real GraphsItem3D::cameraXRotation
  *
  * The X-rotation angle of the camera around the target point in degrees
  * starting from the current base position.
  */
 
 /*!
- * \qmlproperty float GraphsItem3D::cameraYRotation
+ * \qmlproperty real GraphsItem3D::cameraYRotation
  *
  * The Y-rotation angle of the camera around the target point in degrees
  * starting from the current base position.
  */
 
 /*!
+ * \qmlproperty real GraphsItem3D::minCameraXRotation
+ * \since 6.9
+ *
+ * \brief The minimum X-rotation angle of the camera around the target point in degrees.
+ * The default value is \c{-180.0}
+ */
+
+/*!
+ * \qmlproperty real GraphsItem3D::maxCameraXRotation
+ * \since 6.9
+ *
+ * \brief The maximum X-rotation angle of the camera around the target point in degrees.
+ * The default value is \c{180.0}
+ */
+
+/*!
+ * \qmlproperty real GraphsItem3D::minCameraYRotation
+ * \since 6.9
+ *
+ * \brief The minimum Y-rotation angle of the camera around the target point in degrees.
+ * The default value is \c{0.0}
+ */
+
+/*!
+ * \qmlproperty real GraphsItem3D::maxCameraYRotation
+ * \since 6.9
+ *
+ * \brief The maximum Y-rotation angle of the camera around the target point in degrees.
+ * The default value is \c{90.0}
+ */
+
+/*!
  * \qmlproperty bool GraphsItem3D::zoomAtTargetEnabled
  *
  * Whether zooming should change the camera target so that the zoomed point
@@ -123,7 +155,7 @@ constexpr float polarRoundness = 64.0f;
  */
 
 /*!
- * \qmlproperty float GraphsItem3D::cameraZoomLevel
+ * \qmlproperty real GraphsItem3D::cameraZoomLevel
  *
  * The camera zoom level in percentage. The default value of \c{100.0}
  * means there is no zoom in or out set in the camera.
@@ -134,7 +166,7 @@ constexpr float polarRoundness = 64.0f;
  */
 
 /*!
- * \qmlproperty float GraphsItem3D::minCameraZoomLevel
+ * \qmlproperty real GraphsItem3D::minCameraZoomLevel
  *
  * Sets the minimum allowed camera zoom level.
  * If the new minimum level is higher than the existing maximum level, the
@@ -147,7 +179,7 @@ constexpr float polarRoundness = 64.0f;
  */
 
 /*!
- * \qmlproperty float GraphsItem3D::maxCameraZoomLevel
+ * \qmlproperty real GraphsItem3D::maxCameraZoomLevel
  *
  * Sets the maximum allowed camera zoom level.
  * If the new maximum level is lower than the existing minimum level, the
@@ -195,6 +227,27 @@ constexpr float polarRoundness = 64.0f;
  */
 
 /*!
+ * \qmlproperty Node GraphsItem3D::rootNode
+ * \readonly
+ * \since 6.9
+ *
+ * Returns a pointer to the root node of the 3D graph. Use this property
+ * for injecting a 3D graph into a separate \l {View3D} using
+ * \l {View3D::}{importScene}:
+ *
+ * \code
+ * Bars3D {
+ *   id: bars
+ * }
+ * View3D {
+ *   importScene: bars.rootNode
+ * }
+ * \endcode
+ *
+ * \sa {View3D}
+ */
+
+/*!
  * \qmlproperty Scene3D GraphsItem3D::scene
  * \readonly
  *
@@ -224,6 +277,34 @@ constexpr float polarRoundness = 64.0f;
  */
 
 /*!
+ * \qmlproperty Graphs3D.TransparencyTechnique GraphsItem3D::transparencyTechnique
+ * \since 6.9
+ *
+ * Specifies which transparency technique to use. The Default value is \c{Default}.
+ * When rendering transparent surface graphs, use \c{Approximate} or \c{Accurate}.
+ *
+ * \value Default
+ *        Indicates that order-independent transparency techniques are not used.
+ *        Offers the best performance. Use when graphs don't contain
+ *        transparency or when a bar or scatter graph is also using instancing,
+ *        that is \l optimizationHint is {QtGraphs3D::OptimizationHint::Default}.
+ *
+ * \value Approximate
+ *        Indicates that a graph attempts an approximation of order-independent
+ *        transparency. This method is faster than \c Accurate and works on older
+ *        hardware but may yield inaccurate results. Use when the order-independent
+ *        transparency is needed, but the performance cost has to be lower than
+ *        when using accurate order-independent transparency.
+ *
+ * \value Accurate
+ *        Indicates that accurate order-independent transparency is used.
+ *        Use when perfect transparency rendering is needed.
+ *        \note Accurate transparency is not yet implemented
+ *              and will be enabled when the required functionality
+ *              is added to QtQuick3D.
+ */
+
+/*!
  * \qmlproperty int GraphsItem3D::msaaSamples
  * The number of samples used in multisample antialiasing when renderingMode
  * is \c Indirect. When renderingMode is \c DirectToBackground, this property
@@ -350,6 +431,36 @@ constexpr float polarRoundness = 64.0f;
  */
 
 /*!
+ * \qmlmethod void GraphsItem3D::releaseCustomItem(Custom3DItem item)
+ *
+ * Gets ownership of \a item back and removes the \a item from the graph.
+ *
+ * \note If the same item is added back to the graph, the texture file needs to
+ * be re-set.
+ *
+ * \sa Custom3DItem::textureFile
+ */
+
+/*!
+ * \qmlmethod void GraphsItem3D::doPicking(QPoint point)
+ *
+ * Performs picking using view coordinates from \a point
+ * on the elements of the graph, selecting the first item hit.
+ * Default input handling performs this upon receiving the onTapped event.
+ *
+ * \sa selectedElement
+ */
+
+/*!
+ * \qmlmethod void GraphsItem3D::doPicking(QVector3D origin, QVector3D direction)
+ *
+ * Performs picking starting from \a origin and in \a direction
+ * on the elements of the graph, selecting the first item hit.
+ *
+ * \sa selectedElement
+ */
+
+/*!
  * \qmlmethod int GraphsItem3D::selectedLabelIndex()
  *
  * Can be used to query the index of the selected label after receiving
@@ -693,6 +804,8 @@ QQuickGraphsItem::QQuickGraphsItem(QQuic
     setRenderingMode(QtGraphs3D::RenderingMode::Indirect);
     setMsaaSamples(4);
 
+    setTransparencyTechnique(QtGraphs3D::TransparencyTechnique::Default);
+
     // Accept touchevents
     setAcceptTouchEvents(true);
 
@@ -860,6 +973,18 @@ void QQuickGraphsItem::handleAxisLabelAu
     handleAxisLabelAutoRotationChangedBySender(sender());
 }
 
+void QQuickGraphsItem::handleAxisScaleLabelsByCountChanged(bool adjust)
+{
+    Q_UNUSED(adjust);
+    handleAxisScaleLabelsByCountChangedBySender(sender());
+}
+
+void QQuickGraphsItem::handleAxisLabelSizeChanged(qreal size)
+{
+    Q_UNUSED(size);
+    handleAxisLabelSizeChangedBySender(sender());
+}
+
 void QQuickGraphsItem::handleAxisTitleVisibilityChanged(bool visible)
 {
     Q_UNUSED(visible);
@@ -991,6 +1116,34 @@ void QQuickGraphsItem::handleAxisLabelAu
     emitNeedRender();
 }
 
+void QQuickGraphsItem::handleAxisScaleLabelsByCountChangedBySender(QObject *sender)
+{
+    if (sender == m_axisX)
+        m_changeTracker.axisXScaleLabelsByCountChanged = true;
+    else if (sender == m_axisY)
+        m_changeTracker.axisYScaleLabelsByCountChanged = true;
+    else if (sender == m_axisZ)
+        m_changeTracker.axisZScaleLabelsByCountChanged = true;
+    else
+        qWarning("%ls invoked for invalid axis", qUtf16Printable(QString::fromUtf8(__func__)));
+
+    emitNeedRender();
+}
+
+void QQuickGraphsItem::handleAxisLabelSizeChangedBySender(QObject *sender)
+{
+    if (sender == m_axisX)
+        m_changeTracker.axisXLabelSizeChanged = true;
+    else if (sender == m_axisY)
+        m_changeTracker.axisYLabelSizeChanged = true;
+    else if (sender == m_axisZ)
+        m_changeTracker.axisZLabelSizeChanged = true;
+    else
+        qWarning("%ls invoked for invalid axis", qUtf16Printable(QString::fromUtf8(__func__)));
+
+    emitNeedRender();
+}
+
 void QQuickGraphsItem::handleAxisTitleVisibilityChangedBySender(QObject *sender)
 {
     if (sender == m_axisX)
@@ -1158,6 +1311,18 @@ void QQuickGraphsItem::setAxisHelper(QAb
                      this,
                      &QQuickGraphsItem::handleAxisLabelAutoRotationChanged);
     QObject::connect(axis,
+                     &QAbstract3DAxis::labelAutoAngleChanged,
+                     this,
+                     &QQuickGraphsItem::handleAxisLabelAutoRotationChanged);
+    QObject::connect(axis,
+                     &QAbstract3DAxis::scaleLabelsByCountChanged,
+                     this,
+                     &QQuickGraphsItem::handleAxisScaleLabelsByCountChanged);
+    QObject::connect(axis,
+                     &QAbstract3DAxis::labelSizeChanged,
+                     this,
+                     &QQuickGraphsItem::handleAxisLabelSizeChanged);
+    QObject::connect(axis,
                      &QAbstract3DAxis::titleVisibleChanged,
                      this,
                      &QQuickGraphsItem::handleAxisTitleVisibilityChanged);
@@ -1542,6 +1707,33 @@ QtGraphs3D::RenderingMode QQuickGraphsIt
     return m_renderMode;
 }
 
+void QQuickGraphsItem::setTransparencyTechnique(QtGraphs3D::TransparencyTechnique technique)
+{
+    if (technique == m_transparencyTechnique)
+        return;
+
+    switch (technique) {
+    case QtGraphs3D::TransparencyTechnique::Default:
+        environment()->setOitMethod(QQuick3DSceneEnvironment::OITNone);
+        break;
+    case QtGraphs3D::TransparencyTechnique::Approximate:
+        environment()->setOitMethod(QQuick3DSceneEnvironment::OITWeightedBlended);
+        break;
+    case QtGraphs3D::TransparencyTechnique::Accurate:
+        // environment()->setOitMethod(QQuick3DSceneEnvironment::OITSpinlock);
+        //TODO: Add this method when it is implemended in QtQuick3D
+        break;
+    }
+    m_transparencyTechnique = technique;
+
+    emit transparencyTechniqueChanged(technique);
+}
+
+QtGraphs3D::TransparencyTechnique QQuickGraphsItem::transparencyTechnique() const
+{
+    return m_transparencyTechnique;
+}
+
 void QQuickGraphsItem::keyPressEvent(QKeyEvent *ev)
 {
     ev->ignore();
@@ -1604,6 +1796,8 @@ void QQuickGraphsItem::componentComplete
 {
     QQuick3DViewport::componentComplete();
 
+    rootNode()->setScale(QVector3D(100,100,100));
+
     auto url = QUrl(QStringLiteral("defaultMeshes/backgroundMesh"));
     m_background = new QQuick3DModel();
     m_backgroundScale = new QQuick3DNode();
@@ -1985,6 +2179,7 @@ void QQuickGraphsItem::removeCustomItem(
             m_customVolumes.remove(volume);
         }
     } else {
+        m_customItemList[item]->deleteLater();
         m_customItemList.remove(item);
     }
     deleteCustomItem(item);
@@ -2007,7 +2202,7 @@ void QQuickGraphsItem::removeCustomItemA
     while (itemIterator != m_customItemList.constEnd()) {
         QCustom3DItem *item = itemIterator.key();
         if (item->position() == position) {
-            itemIterator.value()->setVisible(false);
+            m_customItemList[item]->deleteLater();
             itemIterator = m_customItemList.erase(itemIterator);
             if (isCustomVolumeItem(item)) {
                 auto volume = static_cast<QCustom3DVolume *>(item);
@@ -2380,6 +2575,35 @@ void QQuickGraphsItem::synchData()
         axisDirty = true;
         m_changeTracker.axisZLabelAutoRotationChanged = false;
     }
+    if (m_changeTracker.axisXScaleLabelsByCountChanged) {
+        axisDirty = true;
+        m_changeTracker.axisXScaleLabelsByCountChanged = false;
+    }
+
+    if (m_changeTracker.axisYScaleLabelsByCountChanged) {
+        axisDirty = true;
+        m_changeTracker.axisYScaleLabelsByCountChanged = false;
+    }
+
+    if (m_changeTracker.axisZScaleLabelsByCountChanged) {
+        axisDirty = true;
+        m_changeTracker.axisZScaleLabelsByCountChanged = false;
+    }
+
+    if (m_changeTracker.axisXLabelSizeChanged) {
+        axisDirty = true;
+        m_changeTracker.axisXLabelSizeChanged = false;
+    }
+
+    if (m_changeTracker.axisYLabelSizeChanged) {
+        axisDirty = true;
+        m_changeTracker.axisYLabelSizeChanged = false;
+    }
+
+    if (m_changeTracker.axisZLabelSizeChanged) {
+        axisDirty = true;
+        m_changeTracker.axisZLabelSizeChanged = false;
+    }
 
     if (m_changeTracker.axisXTitleFixedChanged) {
         axisDirty = true;
@@ -3512,18 +3736,36 @@ void QQuickGraphsItem::updateLabels()
 
     float scale = backgroundScale.x() - m_backgroundScaleMargin.x();
 
+    float relativeScale = scale / m_axisX->labels().count();
+
     float pointSize = theme()->labelFont().pointSizeF();
 
     float textPadding = pointSize * .5f;
 
     float labelsMaxWidth = float(findLabelsMaxWidth(axisX()->labels())) + textPadding;
+
     QFontMetrics fm(theme()->labelFont());
     float labelHeight = fm.height() + textPadding;
 
-    float scaleFactor = fontScaleFactor(pointSize) * pointSize;
+    // set base size to some reasonable value
     float fontRatio = labelsMaxWidth / labelHeight;
-    m_fontScaled = QVector3D(scaleFactor * fontRatio, scaleFactor, 0.00001f);
-    float adjustment = labelAdjustment(labelsMaxWidth);
+
+    float adjustment;
+    const float baseSize = 25.0f;
+    const float relativePointSize = theme()->labelFont().pointSizeF() / baseSize;
+    const float scaleFactor = fontScaleFactor(pointSize) * pointSize;
+
+    if (axisX()->isScaleLabelsByCount()) {
+        m_fontScaled = QVector3D(0.01f * fontRatio * relativePointSize * relativeScale,
+                                 0.01f * relativePointSize * relativeScale,
+                                 0.01f) * axisX()->labelSize();
+        adjustment = m_fontScaled.y() * 110.0f;
+    } else {
+        m_fontScaled = QVector3D(scaleFactor * fontRatio, scaleFactor, 0.00001f)
+                * axisX()->labelSize();
+        adjustment = labelAdjustment(labelsMaxWidth * axisX()->labelSize());
+    }
+
     zPos = backgroundScale.z() + adjustment + m_labelMargin;
 
     adjustment *= qAbs(qSin(qDegreesToRadians(labelRotation.z())));
@@ -3647,14 +3889,23 @@ void QQuickGraphsItem::updateLabels()
     scale = backgroundScale.y() - m_backgroundScaleMargin.y();
     labelsMaxWidth = float(findLabelsMaxWidth(axisY()->labels())) + textPadding;
     fontRatio = labelsMaxWidth / labelHeight;
-    m_fontScaled = QVector3D(scaleFactor * fontRatio, scaleFactor, 0.00001f);
+    relativeScale = scale / m_axisY->labels().count();
+    if (axisY()->isScaleLabelsByCount()) {
+        m_fontScaled = QVector3D(0.01f * fontRatio * relativePointSize * relativeScale,
+                                 0.01f * relativePointSize * relativeScale,
+                                 0.01f) * axisY()->labelSize();
+        adjustment = m_fontScaled.y() * 190.0f;
+    } else {
+        m_fontScaled = QVector3D(scaleFactor * fontRatio, scaleFactor, 0.00001f)
+                * axisY()->labelSize();
+        adjustment = labelAdjustment(labelsMaxWidth * axisY()->labelSize());
+    }
 
     xPos = backgroundScale.x() - labelDepthMargin;
     if (!xFlipped)
         xPos *= -1.0f;
     labelTrans.setX(xPos);
 
-    adjustment = labelAdjustment(labelsMaxWidth);
     zPos = backgroundScale.z() + adjustment + m_labelMargin;
     if (zFlipped)
         zPos *= -1.0f;
@@ -3766,8 +4017,19 @@ void QQuickGraphsItem::updateLabels()
     scale = backgroundScale.z() - m_backgroundScaleMargin.z();
     labelsMaxWidth = float(findLabelsMaxWidth(axisZ()->labels())) + textPadding;
     fontRatio = labelsMaxWidth / labelHeight;
-    m_fontScaled = QVector3D(scaleFactor * fontRatio, scaleFactor, 0.00001f);
-    adjustment = labelAdjustment(labelsMaxWidth);
+    relativeScale = scale / m_axisZ->labels().count();
+
+    if (axisZ()->isScaleLabelsByCount()) {
+        m_fontScaled = QVector3D(0.01f * fontRatio * relativePointSize * relativeScale,
+                                 0.01f * relativePointSize * relativeScale,
+                                 0.01f) * axisZ()->labelSize();
+        adjustment = m_fontScaled.y() * 110.0f;
+    } else {
+        m_fontScaled = QVector3D(scaleFactor * fontRatio, scaleFactor, 0.00001f)
+                * axisZ()->labelSize();
+        adjustment = labelAdjustment(labelsMaxWidth * axisZ()->labelSize());
+    }
+
     xPos = backgroundScale.x() + adjustment + m_labelMargin;
     if (xFlipped)
         xPos *= -1.0f;
@@ -3837,8 +4099,17 @@ void QQuickGraphsItem::updateLabels()
     scale = backgroundScale.y() - m_backgroundScaleMargin.y();
     labelsMaxWidth = float(findLabelsMaxWidth(axisY()->labels())) + textPadding;
     fontRatio = labelsMaxWidth / labelHeight;
-    m_fontScaled = QVector3D(scaleFactor * fontRatio, scaleFactor, 0.00001f);
-    adjustment = labelAdjustment(labelsMaxWidth);
+    relativeScale = scale / m_axisY->labels().count();
+    if (axisY()->isScaleLabelsByCount()) {
+        m_fontScaled = QVector3D(0.01f * fontRatio * relativePointSize * relativeScale,
+                                 0.01f * relativePointSize * relativeScale,
+                                 0.01f) * axisY()->labelSize();
+        adjustment = m_fontScaled.y() * 190.0f;
+    } else {
+        m_fontScaled = QVector3D(scaleFactor * fontRatio, scaleFactor, 0.00001f)
+                * axisY()->labelSize();
+        adjustment = labelAdjustment(labelsMaxWidth * axisY()->labelSize());
+    }
 
     xPos = backgroundScale.x() + adjustment + m_labelMargin;
     if (xFlipped)
@@ -3966,9 +4237,10 @@ void QQuickGraphsItem::updateItemLabel(Q
 {
     if (m_labelPosition != position)
         m_labelPosition = position;
-    QVector3D pos2d = mapFrom3DScene(m_labelPosition);
+
+    QVector3D pos2d = mapFrom3DScene(m_labelPosition * rootNode()->scale().z());
     int pointSize = theme()->labelFont().pointSize();
-    float scale = m_labelScale.x() * ((-10.0f * pointSize) + 650.0f) / pos2d.z();
+    float scale = m_labelScale.x() * ((-10.0f * pointSize) + 650.0f) / (pos2d.z() / rootNode()->scale().z());
     scale = scale < 0 ? -scale : scale;
     if (m_sliceView && m_sliceView->isVisible())
         m_itemLabel->setScale(scale * .2f);
@@ -4718,7 +4990,7 @@ void QQuickGraphsItem::updateCamera()
 
     const float scale = qMin(width(), height() * 1.6f);
     const float magnificationScaleFactor = 1.0f / 640.0f;
-    const float magnification = scale * magnificationScaleFactor;
+    const float magnification = scale * magnificationScaleFactor / rootNode()->scale().x();
 
     auto useOrtho = isOrthoProjection();
     if (useOrtho) {
@@ -4781,10 +5053,15 @@ void QQuickGraphsItem::updateCustomData(
         QQuick3DNode *customLabel = labelIterator.value();
 
         QVector3D pos = label->position();
+        // We incorrectly assumed label position to be normalized by default, when it in
+        // reality is -1...1. Because of this we need to multiply the x and z by 2.
+        // (QTBUG-131138)
+        pos.setX(pos.x() * 2.f);
+        pos.setZ(pos.z() * 2.f);
         if (!label->isPositionAbsolute()) {
-            if (label->position().x() < minX || label->position().x() > maxX
-                || label->position().y() < minY || label->position().y() > maxY
-                || label->position().z() < minZ || label->position().z() > maxZ) {
+            if (pos.x() < minX || pos.x() > maxX
+                || pos.y() < minY || pos.y() > maxY
+                || pos.z() < minZ || pos.z() > maxZ) {
                 customLabel->setVisible(false);
                 ++labelIterator;
                 continue;
@@ -4850,9 +5127,15 @@ void QQuickGraphsItem::updateCustomData(
                     iScales[i] *= ratio;
                 }
             }
-            model->setScale(QVector3D(iScales.at(0), iScales.at(1), iScales.at(2)));
+            // We incorrectly assumed models to be scaled to 0...1 by default, when they in
+            // reality are scaled to -1...1. Because of this we need to multiply the scale by 2
+            // (QTBUG-126611)
+            model->setScale(QVector3D(iScales.at(0), iScales.at(1), iScales.at(2)) * 2.f);
         } else {
-            model->setScale(item->scaling());
+            // We incorrectly assumed models to be scaled to 0...1 by default, when they in
+            // reality are scaled to -1...1. Because of this we need to multiply the scale by 2
+            // (QTBUG-126611)
+            model->setScale(item->scaling() * 2.f);
         }
 
         if (auto volume = qobject_cast<QCustom3DVolume *>(item)) {
@@ -5016,9 +5299,10 @@ void QQuickGraphsItem::handleWindowChang
     bool previousVisibility = window->isVisible();
     // Enable touch events for Mac touchpads
     window->setVisible(true);
-    typedef void *(*EnableTouch)(QWindow *, bool);
-    EnableTouch enableTouch = (EnableTouch) QGuiApplication::platformNativeInterface()
-                                  ->nativeResourceFunctionForIntegration("registertouchwindow");
+    typedef void (*EnableTouch)(QWindow *, bool);
+    EnableTouch enableTouch = reinterpret_cast<EnableTouch>(
+                QFunctionPointer(QGuiApplication::platformNativeInterface()
+                                 ->nativeResourceFunctionForIntegration("registertouchwindow")));
     if (enableTouch)
         enableTouch(window, true);
     window->setVisible(previousVisibility);
@@ -5510,6 +5794,56 @@ bool QQuickGraphsItem::doPicking(QPointF
     return true;
 }
 
+bool QQuickGraphsItem::doRayPicking(QVector3D origin, QVector3D direction)
+{
+    checkSliceEnabled();
+
+    QList<QQuick3DPickResult> results = rayPickAll(origin, direction);
+    if (!m_customItemList.isEmpty()) {
+        // Try to pick custom item only
+        for (const auto &result : results) {
+            QCustom3DItem *customItem = m_customItemList.key(result.objectHit(), nullptr);
+
+            if (customItem) {
+                qsizetype selectedIndex = m_customItems.indexOf(customItem);
+                m_selectedCustomItemIndex = selectedIndex;
+                handleSelectedElementChange(QtGraphs3D::ElementType::CustomItem);
+                // Don't allow picking in subclasses if custom item is picked
+                return false;
+            }
+        }
+    }
+
+    for (const auto &result : results) {
+        if (!result.objectHit())
+            continue;
+        QString objName = result.objectHit()->objectName();
+        if (objName.contains(QStringLiteral("ElementAxisXLabel"))) {
+            for (int i = 0; i < repeaterX()->count(); i++) {
+                auto obj = static_cast<QQuick3DNode *>(repeaterX()->objectAt(i));
+                if (result.objectHit() == obj)
+                    m_selectedLabelIndex = i;
+            }
+            handleSelectedElementChange(QtGraphs3D::ElementType::AxisXLabel);
+            break;
+        } else if (objName.contains(QStringLiteral("ElementAxisYLabel"))) {
+            handleSelectedElementChange(QtGraphs3D::ElementType::AxisYLabel);
+            break;
+        } else if (objName.contains(QStringLiteral("ElementAxisZLabel"))) {
+            for (int i = 0; i < repeaterX()->count(); i++) {
+                auto obj = static_cast<QQuick3DNode *>(repeaterZ()->objectAt(i));
+                if (result.objectHit() == obj)
+                    m_selectedLabelIndex = i;
+            }
+            handleSelectedElementChange(QtGraphs3D::ElementType::AxisZLabel);
+            break;
+        } else {
+            continue;
+        }
+    }
+    return true;
+}
+
 void QQuickGraphsItem::minimizeMainGraph()
 {
     QQuickItem *anchor = QQuickItemPrivate::get(this)->anchors()->fill();
@@ -5818,6 +6152,7 @@ void QQuickGraphsItem::setMinCameraXRota
         return;
 
     m_minXRotation = rotation;
+    setUserCameraRotationRange(true);
     emit minCameraXRotationChanged(rotation);
 }
 
@@ -5827,6 +6162,7 @@ void QQuickGraphsItem::setMaxCameraXRota
         return;
 
     m_maxXRotation = rotation;
+    setUserCameraRotationRange(true);
     emit maxCameraXRotationChanged(rotation);
 }
 
@@ -5836,6 +6172,7 @@ void QQuickGraphsItem::setMinCameraYRota
         return;
 
     m_minYRotation = rotation;
+    setUserCameraRotationRange(true);
     emit minCameraYRotationChanged(rotation);
 }
 
@@ -5845,6 +6182,7 @@ void QQuickGraphsItem::setMaxCameraYRota
         return;
 
     m_maxYRotation = rotation;
+    setUserCameraRotationRange(true);
     emit maxCameraYRotationChanged(rotation);
 }
 
@@ -6413,10 +6751,10 @@ void QQuickGraphsItem::setUpCamera()
     // By default we could get away with a value of 10 or 15, but as camera zoom is implemented
     // by moving it, we have to take into account the maximum zoom out level. The other
     // option would be to adjust far clip whenever zoom level changes.
-    const float farclip = 700.f;
+    const float farclip = 7000.f;
 
     m_pCamera = new QQuick3DPerspectiveCamera(rootNode());
-    m_pCamera->setClipNear(0.001f);
+    m_pCamera->setClipNear(0.1f);
     m_pCamera->setClipFar(farclip);
     m_pCamera->setFieldOfView(45.0f);
     m_pCamera->setPosition(QVector3D(.0f, .0f, 5.f));
@@ -6457,7 +6795,6 @@ void QQuickGraphsItem::setUpLight()
         *QQuick3DObjectPrivate::get(rootNode())->sceneManager);
     light->setParent(camera());
     light->setParentItem(camera());
-    light->setShadowBias(0.1f);
     light->setSoftShadowQuality(QQuick3DAbstractLight::QSSGSoftShadowQuality::Hard);
     m_light = light;
 }
diff -pruN 6.8.2-4/src/graphs3d/qml/qquickgraphsitem_p.h 6.9.1-1/src/graphs3d/qml/qquickgraphsitem_p.h
--- 6.8.2-4/src/graphs3d/qml/qquickgraphsitem_p.h	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs3d/qml/qquickgraphsitem_p.h	2025-05-29 02:19:47.000000000 +0000
@@ -77,6 +77,12 @@ struct Abstract3DChangeBitField
     bool axisXLabelAutoRotationChanged : 1;
     bool axisYLabelAutoRotationChanged : 1;
     bool axisZLabelAutoRotationChanged : 1;
+    bool axisXScaleLabelsByCountChanged : 1;
+    bool axisYScaleLabelsByCountChanged : 1;
+    bool axisZScaleLabelsByCountChanged : 1;
+    bool axisXLabelSizeChanged : 1;
+    bool axisYLabelSizeChanged : 1;
+    bool axisZLabelSizeChanged : 1;
     bool aspectRatioChanged : 1;
     bool horizontalAspectRatioChanged : 1;
     bool axisXTitleVisibilityChanged : 1;
@@ -156,6 +162,7 @@ struct Abstract3DChangeBitField
 class Q_GRAPHS_EXPORT QQuickGraphsItem : public QQuick3DViewport
 {
     Q_OBJECT
+    Q_PROPERTY(QQuick3DNode *rootNode READ rootNode CONSTANT REVISION(6, 9))
     Q_PROPERTY(QtGraphs3D::SelectionFlags selectionMode READ selectionMode WRITE setSelectionMode
                    NOTIFY selectionModeChanged)
     Q_PROPERTY(QtGraphs3D::ShadowQuality shadowQuality READ shadowQuality WRITE setShadowQuality
@@ -165,6 +172,8 @@ class Q_GRAPHS_EXPORT QQuickGraphsItem :
     Q_PROPERTY(QGraphsTheme *theme READ theme WRITE setTheme NOTIFY themeChanged)
     Q_PROPERTY(QtGraphs3D::RenderingMode renderingMode READ renderingMode WRITE setRenderingMode
                    NOTIFY renderingModeChanged)
+    Q_PROPERTY(QtGraphs3D::TransparencyTechnique transparencyTechnique READ transparencyTechnique
+                   WRITE setTransparencyTechnique NOTIFY transparencyTechniqueChanged REVISION(6, 9))
     Q_PROPERTY(bool measureFps READ measureFps WRITE setMeasureFps NOTIFY measureFpsChanged)
     Q_PROPERTY(int currentFps READ currentFps NOTIFY currentFpsChanged)
     Q_PROPERTY(QQmlListProperty<QCustom3DItem> customItemList READ customItemList CONSTANT)
@@ -189,6 +198,14 @@ class Q_GRAPHS_EXPORT QQuickGraphsItem :
                    cameraXRotationChanged)
     Q_PROPERTY(float cameraYRotation READ cameraYRotation WRITE setCameraYRotation NOTIFY
                    cameraYRotationChanged)
+    Q_PROPERTY(float minCameraXRotation READ minCameraXRotation WRITE setMinCameraXRotation NOTIFY
+                   minCameraXRotationChanged REVISION(6, 9))
+    Q_PROPERTY(float maxCameraXRotation READ maxCameraXRotation WRITE setMaxCameraXRotation NOTIFY
+                   maxCameraXRotationChanged REVISION(6, 9))
+    Q_PROPERTY(float minCameraYRotation READ minCameraYRotation WRITE setMinCameraYRotation NOTIFY
+                   minCameraYRotationChanged REVISION(6, 9))
+    Q_PROPERTY(float maxCameraYRotation READ maxCameraYRotation WRITE setMaxCameraYRotation NOTIFY
+                   maxCameraYRotationChanged REVISION(6, 9))
     Q_PROPERTY(float cameraZoomLevel READ cameraZoomLevel WRITE setCameraZoomLevel NOTIFY
                    cameraZoomLevelChanged)
     Q_PROPERTY(QtGraphs3D::CameraPreset cameraPreset READ cameraPreset WRITE setCameraPreset NOTIFY
@@ -247,6 +264,8 @@ public:
     virtual void handleAxisReversedChangedBySender(QObject *sender);
     virtual void handleAxisFormatterDirtyBySender(QObject *sender);
     virtual void handleAxisLabelAutoRotationChangedBySender(QObject *sender);
+    virtual void handleAxisScaleLabelsByCountChangedBySender(QObject *sender);
+    virtual void handleAxisLabelSizeChangedBySender(QObject *sender);
     virtual void handleAxisTitleVisibilityChangedBySender(QObject *sender);
     virtual void handleAxisLabelVisibilityChangedBySender(QObject *sender);
     virtual void handleAxisTitleFixedChangedBySender(QObject *sender);
@@ -285,6 +304,9 @@ public:
     virtual void setRenderingMode(QtGraphs3D::RenderingMode mode);
     virtual QtGraphs3D::RenderingMode renderingMode() const;
 
+    virtual void setTransparencyTechnique(QtGraphs3D::TransparencyTechnique technique);
+    virtual QtGraphs3D::TransparencyTechnique transparencyTechnique() const;
+
     virtual void setSelectionMode(QtGraphs3D::SelectionFlags mode);
     virtual QtGraphs3D::SelectionFlags selectionMode() const;
 
@@ -502,6 +524,9 @@ public:
 
     Q_INVOKABLE virtual bool doPicking(QPointF point);
 
+    Q_REVISION(6, 9) Q_INVOKABLE virtual bool doRayPicking(QVector3D origin,
+                                          QVector3D direction);
+
     void minimizeMainGraph();
 
     int horizontalFlipFactor() const;
@@ -531,6 +556,8 @@ public Q_SLOTS:
     void handleAxisSegmentCountChanged(qsizetype count);
     void handleAxisSubSegmentCountChanged(qsizetype count);
     void handleAxisAutoAdjustRangeChanged(bool autoAdjust);
+    void handleAxisScaleLabelsByCountChanged(bool adjust);
+    void handleAxisLabelSizeChanged(qreal size);
     void handleAxisLabelFormatChanged(const QString &format);
     void handleAxisReversedChanged(bool enable);
     void handleAxisFormatterDirty();
@@ -562,6 +589,7 @@ Q_SIGNALS:
     void msaaSamplesChanged(int samples);
     void themeChanged(QGraphsTheme *theme);
     void renderingModeChanged(QtGraphs3D::RenderingMode mode);
+    Q_REVISION(6, 9) void transparencyTechniqueChanged(QtGraphs3D::TransparencyTechnique technique);
     void measureFpsChanged(bool enabled);
     void currentFpsChanged(int fps);
     void selectedElementChanged(QtGraphs3D::ElementType type);
@@ -582,10 +610,10 @@ Q_SIGNALS:
     void cameraTargetPositionChanged(QVector3D target);
     void minCameraZoomLevelChanged(float zoomLevel);
     void maxCameraZoomLevelChanged(float zoomLevel);
-    void minCameraXRotationChanged(float rotation);
-    void minCameraYRotationChanged(float rotation);
-    void maxCameraXRotationChanged(float rotation);
-    void maxCameraYRotationChanged(float rotation);
+    Q_REVISION(6, 9) void minCameraXRotationChanged(float rotation);
+    Q_REVISION(6, 9) void minCameraYRotationChanged(float rotation);
+    Q_REVISION(6, 9) void maxCameraXRotationChanged(float rotation);
+    Q_REVISION(6, 9) void maxCameraYRotationChanged(float rotation);
     void wrapCameraXRotationChanged(bool wrap);
     void wrapCameraYRotationChanged(bool wrap);
     void needRender();
@@ -630,6 +658,11 @@ protected:
     virtual void handleParentHeightChange();
     void componentComplete() override;
     void checkSliceEnabled();
+    bool isUserCameraRotationRange() { return m_userRotationRange; };
+    void setUserCameraRotationRange(bool userRotationRange)
+    {
+        m_userRotationRange = userRotationRange;
+    };
 
     virtual void createSliceView();
 
@@ -758,6 +791,7 @@ protected:
     bool m_isPolar = false;
     float m_radialLabelOffset = 1.0f;
     float m_polarRadius = 2.0f;
+    bool m_userRotationRange = false;
 
     QList<QAbstract3DSeries *> m_seriesList;
 
@@ -827,6 +861,8 @@ private:
     QQuick3DOrthographicCamera *m_oCamera = nullptr;
     QRectF m_cachedGeometry;
     QtGraphs3D::RenderingMode m_renderMode = QtGraphs3D::RenderingMode::DirectToBackground;
+    QtGraphs3D::TransparencyTechnique m_transparencyTechnique
+        = QtGraphs3D::TransparencyTechnique::Default;
     int m_samples = 0;
     int m_windowSamples = 0;
     QSize m_initialisedSize = QSize(0, 0);
diff -pruN 6.8.2-4/src/graphs3d/qml/qquickgraphsscatter.cpp 6.9.1-1/src/graphs3d/qml/qquickgraphsscatter.cpp
--- 6.8.2-4/src/graphs3d/qml/qquickgraphsscatter.cpp	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs3d/qml/qquickgraphsscatter.cpp	2025-05-29 02:19:47.000000000 +0000
@@ -42,7 +42,7 @@ static const int insertRemoveRecordReser
  *
  * See \l{Simple Scatter Graph} for more thorough usage example.
  *
- * \sa Scatter3DSeries, ScatterDataProxy, Bars3D, Surface3D,
+ * \sa Scatter3DSeries, Spline3DSeries, ScatterDataProxy, Bars3D, Surface3D,
  * {Qt Graphs C++ Classes for 3D}
  */
 
@@ -616,6 +616,7 @@ void QQuickGraphsScatter::updateItemMate
         material->setProperty("colorStyle", 2);
 
     material->setProperty("usePoint", usePoint);
+    material->setProperty("rootScale", rootNode()->scale().y());
 }
 
 void QQuickGraphsScatter::updateInstancedMaterialProperties(ScatterModel *graphModel,
@@ -659,6 +660,7 @@ void QQuickGraphsScatter::updateMaterial
     QQmlListReference materialsRef(item, "materials");
     auto customMaterial = static_cast<QQuick3DCustomMaterial *>(materialsRef.at(0));
     customMaterial->setProperty("transparency", transparency);
+    customMaterial->setProperty("rootScale", rootNode()->scale().y());
 
     int style = customMaterial->property("colorStyle").value<int>();
     if (style == 0) {
@@ -723,11 +725,13 @@ void QQuickGraphsScatter::removeDataItem
         deleteDataItem(graphModel->selectionIndicator);
         deleteDataItem(graphModel->baseRef);
         deleteDataItem(graphModel->selectionRef);
+        deleteDataItem(graphModel->splineModel);
 
         graphModel->instancingRootItem = nullptr;
         graphModel->selectionIndicator = nullptr;
         graphModel->baseRef = nullptr;
         graphModel->selectionRef = nullptr;
+        graphModel->splineModel = nullptr;
     } else {
         QList<QQuick3DModel *> &items = graphModel->dataItems;
         removeDataItems(items, items.count());
@@ -1403,6 +1407,36 @@ bool QQuickGraphsScatter::doPicking(QPoi
     return true;
 }
 
+bool QQuickGraphsScatter::doRayPicking(QVector3D origin, QVector3D direction)
+{
+    if (!QQuickGraphsItem::doRayPicking(origin, direction))
+        return false;
+
+    if (selectionMode() == QtGraphs3D::SelectionFlag::Item) {
+        QList<QQuick3DPickResult> results = rayPickAll(origin, direction);
+        if (!results.empty()) {
+            for (const auto &result : std::as_const(results)) {
+                if (const auto &hit = result.objectHit()) {
+                    if (hit == backgroundBB() || hit == background()) {
+                        clearSelectionModel();
+                        continue;
+                    }
+                    if (optimizationHint() == QtGraphs3D::OptimizationHint::Legacy) {
+                        setSelected(hit);
+                        break;
+                    } else if (optimizationHint() == QtGraphs3D::OptimizationHint::Default) {
+                        setSelected(hit, result.instanceIndex());
+                        break;
+                    }
+                }
+            }
+        } else {
+            clearSelectionModel();
+        }
+    }
+    return true;
+}
+
 void QQuickGraphsScatter::updateShadowQuality(QtGraphs3D::ShadowQuality quality)
 {
     // Were shadows visible before?
@@ -1560,6 +1594,177 @@ void QQuickGraphsScatter::calculatePolar
     z = -static_cast<float>(radius * qCos(angle)) * m_polarRadius;
 }
 
+void QQuickGraphsScatter::updateSpline(ScatterModel *model)
+{
+    if (auto series = qobject_cast<QSpline3DSeries *>(model->series)) {
+        if (!series->isSplineVisible()) {
+            if (model->splineModel)
+                model->splineModel->setVisible(false);
+            return;
+        } else {
+            if (!model->splineModel)
+                createSplineModel(model);
+
+            QQmlListReference materialRef(model->splineModel, "materials");
+            QQuick3DCustomMaterial *material = qobject_cast<QQuick3DCustomMaterial *>(
+                materialRef.at(0));
+
+            QVariant splineInputAsVariant = material->property("controlPoints");
+            QQuick3DShaderUtilsTextureInput *splineInput
+                = splineInputAsVariant.value<QQuick3DShaderUtilsTextureInput *>();
+            QQuick3DTexture *splineTexture = splineInput->texture();
+            QQuick3DTextureData *splineData = splineTexture->textureData();
+
+            bool loop = series->isSplineLooping();
+            material->setProperty("tension", series->splineTension());
+            material->setProperty("knotting", series->splineKnotting());
+            material->setProperty("loop", loop);
+            material->setProperty("color", series->splineColor());
+
+            const QScatterDataArray &array = series->dataArray();
+            qsizetype pointCount = array.size();
+            if (isDataDirty() && array.size() != 0) {
+                QVector<QVector4D> splinePoints;
+                QVector<SplineVertex> vertices;
+                splinePoints.reserve(pointCount + 2);
+                splineData->setSize(QSize(pointCount + 2, 1));
+
+                auto normalizedPos = [this](QVector3D pos) {
+                    float posX = static_cast<QValue3DAxis *>(axisX())->positionAt(pos.x())
+                                     * scale().x()
+                                 + translate().x();
+                    float posY = static_cast<QValue3DAxis *>(axisY())->positionAt(pos.y())
+                                     * scale().y()
+                                 + translate().y();
+                    float posZ = static_cast<QValue3DAxis *>(axisZ())->positionAt(pos.z())
+                                     * scale().z()
+                                 + translate().z();
+                    return QVector3D(posX, posY, posZ);
+                };
+
+                QVector3D first = normalizedPos(array.at(0).position());
+                QVector3D second = normalizedPos(array.at(1).position());
+                QVector3D pStart = first + (first - second) * 0.1f;
+                QVector3D last = normalizedPos(array.at(pointCount - 1).position());
+                QVector3D secondLast = normalizedPos(array.at(pointCount - 2).position());
+                QVector3D pEnd = last + (last - secondLast) * 0.1f;
+
+                if (loop)
+                    splinePoints.append(QVector4D(last, 1));
+                else
+                    splinePoints.append(QVector4D(pStart, 1));
+
+                const qsizetype resolution = series->splineResolution();
+                vertices.reserve(resolution * pointCount);
+                for (int i = 0; i < pointCount; i++) {
+                    splinePoints.push_back(QVector4D(normalizedPos(array.at(i).position()), 1));
+                    for (int j = 0; j < resolution; j++) {
+                        SplineVertex vertex;
+                        vertex.position = QVector3D(float(j) / float(resolution), float(i), 0);
+                        vertex.uv = QVector2D(float(j) / float(resolution - 1),
+                                              float(i) / float(pointCount + 2));
+                        vertices.push_back(vertex);
+                    }
+                }
+                if (loop)
+                    splinePoints.append(QVector4D(first, 1));
+                else
+                    splinePoints.append(QVector4D(pEnd, 1));
+
+                QByteArray pointData = QByteArray(reinterpret_cast<char *>(splinePoints.data()),
+                                                  splinePoints.size() * sizeof(QVector4D));
+
+                splineData->setTextureData(pointData);
+                material->setProperty("points", splinePoints.size());
+                QQuick3DGeometry *splineGeometry = model->splineModel->geometry();
+                QByteArray vertexBuffer(reinterpret_cast<char *>(vertices.data()),
+                                        vertices.size() * sizeof(SplineVertex));
+                splineGeometry->setVertexData(vertexBuffer);
+                splineGeometry->update();
+                splineTexture->setTextureData(splineData);
+                splineInput->setTexture(splineTexture);
+            }
+            model->splineModel->setVisible(true);
+        }
+    }
+}
+
+void QQuickGraphsScatter::createSplineModel(ScatterModel *model)
+{
+    QQuick3DModel *splineModel = new QQuick3DModel();
+    splineModel->setParent(model->series);
+    splineModel->setParentItem(graphNode());
+    splineModel->setObjectName(QStringLiteral("SplineModel"));
+    splineModel->setVisible(true);
+    splineModel->setPickable(false);
+    auto geometry = new QQuick3DGeometry();
+    geometry->setParent(splineModel);
+    geometry->setStride(sizeof(SplineVertex)); //pos + uv
+    geometry->setPrimitiveType(QQuick3DGeometry::PrimitiveType::LineStrip);
+    geometry->addAttribute(QQuick3DGeometry::Attribute::PositionSemantic,
+                           0,
+                           QQuick3DGeometry::Attribute::F32Type);
+    geometry->addAttribute(QQuick3DGeometry::Attribute::TexCoord0Semantic,
+                           sizeof(QVector3D),
+                           QQuick3DGeometry::Attribute::F32Type);
+    splineModel->setGeometry(geometry);
+
+    QQuick3DTexture *splineTex = new QQuick3DTexture();
+    splineTex->setHorizontalTiling(QQuick3DTexture::ClampToEdge);
+    splineTex->setVerticalTiling(QQuick3DTexture::ClampToEdge);
+    splineTex->setMinFilter(QQuick3DTexture::Nearest);
+    splineTex->setMagFilter(QQuick3DTexture::Nearest);
+    QQuick3DTextureData *splineData = new QQuick3DTextureData;
+    splineData->setSize(QSize(0, 1));
+    splineData->setFormat(QQuick3DTextureData::RGBA32F);
+    splineData->setParent(splineTex);
+    splineData->setParentItem(splineTex);
+    splineTex->setTextureData(splineData);
+
+    QQmlListReference materialRef(splineModel, "materials");
+    QQuick3DCustomMaterial *material = createQmlCustomMaterial(
+        QStringLiteral(":/materials/SplineMaterial"));
+    material->setParent(splineModel);
+    material->setParentItem(splineModel);
+    material->setObjectName("splineMaterial");
+    QVariant textureInputAsVariant = material->property("controlPoints");
+    QQuick3DShaderUtilsTextureInput *textureInput = textureInputAsVariant
+                                                        .value<QQuick3DShaderUtilsTextureInput *>();
+    textureInput->setTexture(splineTex);
+    splineTex->setParent(material);
+    materialRef.append(material);
+
+    model->splineModel = splineModel;
+
+    if (auto series = qobject_cast<QSpline3DSeries *>(model->series)) {
+        connect(series,
+                &QSpline3DSeries::splineTensionChanged,
+                this,
+                &QQuickGraphsScatter::handleSplineChanged);
+        connect(series,
+                &QSpline3DSeries::splineKnottingChanged,
+                this,
+                &QQuickGraphsScatter::handleSplineChanged);
+        connect(series,
+                &QSpline3DSeries::splineLoopingChanged,
+                this,
+                &QQuickGraphsScatter::handleSplineChanged);
+        connect(series,
+                &QSpline3DSeries::splineColorChanged,
+                this,
+                &QQuickGraphsScatter::handleSplineChanged);
+        connect(series,
+                &QSpline3DSeries::splineResolutionChanged,
+                this,
+                &QQuickGraphsScatter::handleSplineChanged);
+    }
+}
+
+void QQuickGraphsScatter::handleSplineChanged()
+{
+    m_isDataDirty = true;
+}
+
 QQuick3DModel *QQuickGraphsScatter::selected() const
 {
     return m_selected;
@@ -1677,8 +1882,10 @@ void QQuickGraphsScatter::updateGraph()
             }
         }
 
-        if (seriesVisible && (isDataDirty() || isSeriesVisualsDirty()))
+        if (seriesVisible && (isDataDirty() || isSeriesVisualsDirty())) {
             updateScatterGraphItemPositions(graphModel);
+            updateSpline(graphModel);
+        }
 
         if (seriesVisible
             && (isSeriesVisualsDirty()
@@ -1731,7 +1938,6 @@ void QQuickGraphsScatter::synchData()
 
     updatePointScaleSize();
     QQuickGraphsItem::synchData();
-    setMinCameraYRotation(-90.0f);
 
     m_pointScale = calculatePointScaleSize();
 
diff -pruN 6.8.2-4/src/graphs3d/qml/qquickgraphsscatter_p.h 6.9.1-1/src/graphs3d/qml/qquickgraphsscatter_p.h
--- 6.8.2-4/src/graphs3d/qml/qquickgraphsscatter_p.h	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs3d/qml/qquickgraphsscatter_p.h	2025-05-29 02:19:47.000000000 +0000
@@ -14,6 +14,7 @@
 
 #include "qquickgraphsitem_p.h"
 #include "qscatter3dseries.h"
+#include "qspline3dseries.h"
 #include "qvalue3daxis.h"
 #include <private/scatterinstancing_p.h>
 
@@ -115,6 +116,7 @@ protected:
     void calculateSceneScalingFactors() override;
     void componentComplete() override;
     bool doPicking(QPointF position) override;
+    bool doRayPicking(QVector3D origin, QVector3D direction) override;
     void updateShadowQuality(QtGraphs3D::ShadowQuality quality) override;
     void updateLightStrength() override;
     void startRecordingRemovesAndInserts() override;
@@ -148,6 +150,12 @@ private:
     QList<InsertRemoveRecord> m_insertRemoveRecords;
     bool m_recordInsertsAndRemoves;
 
+    struct SplineVertex
+    {
+        QVector3D position;
+        QVector2D uv;
+    };
+
     struct ScatterModel
     {
         QList<QQuick3DModel *> dataItems;
@@ -162,6 +170,8 @@ private:
         ScatterInstancing *instancing = nullptr;
         QQuick3DModel *instancingRootItem = nullptr;
         QQuick3DModel *selectionIndicator = nullptr;
+
+        QQuick3DModel *splineModel = nullptr;
     };
 
     float m_maxItemSize = 0.0f;
@@ -235,6 +245,10 @@ private:
     void updatePointScaleSize();
     void calculatePolarXZ(const float posX, const float posZ, float &x, float &z) const;
 
+    void updateSpline(ScatterModel *model);
+    void createSplineModel(ScatterModel *model);
+    void handleSplineChanged();
+
     void generatePointsForScatterModel(ScatterModel *series);
     void updateScatterGraphItemPositions(ScatterModel *graphModel);
     void updateScatterGraphItemVisuals(ScatterModel *graphModel);
diff -pruN 6.8.2-4/src/graphs3d/qml/qquickgraphsscatterseries_p.h 6.9.1-1/src/graphs3d/qml/qquickgraphsscatterseries_p.h
--- 6.8.2-4/src/graphs3d/qml/qquickgraphsscatterseries_p.h	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs3d/qml/qquickgraphsscatterseries_p.h	2025-05-29 02:19:47.000000000 +0000
@@ -14,9 +14,9 @@
 #ifndef QQUICKGRAPHSSCATTERSERIES_P_H
 #define QQUICKGRAPHSSCATTERSERIES_P_H
 
-#include "common/theme/qquickgraphscolor_p.h"
 #include "gradientholder_p.h"
 #include "qscatter3dseries.h"
+#include "theme/qquickgraphscolor_p.h"
 
 #include <QtQml/qqml.h>
 #include <QtQuick/private/qquickrectangle_p.h>
diff -pruN 6.8.2-4/src/graphs3d/qml/qquickgraphssplineseries.cpp 6.9.1-1/src/graphs3d/qml/qquickgraphssplineseries.cpp
--- 6.8.2-4/src/graphs3d/qml/qquickgraphssplineseries.cpp	1970-01-01 00:00:00.000000000 +0000
+++ 6.9.1-1/src/graphs3d/qml/qquickgraphssplineseries.cpp	2025-05-29 02:19:47.000000000 +0000
@@ -0,0 +1,133 @@
+// Copyright (C) 2024 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#include <QtCore/QMetaMethod>
+#include "qquickgraphssplineseries_p.h"
+#include "utils_p.h"
+
+QT_BEGIN_NAMESPACE
+
+QQuickGraphsSpline3DSeries::QQuickGraphsSpline3DSeries(QObject *parent)
+    : QSpline3DSeries(parent)
+{}
+
+QQuickGraphsSpline3DSeries::~QQuickGraphsSpline3DSeries() {}
+
+QQmlListProperty<QObject> QQuickGraphsSpline3DSeries::seriesChildren()
+{
+    return QQmlListProperty<QObject>(this,
+                                     this,
+                                     &QQuickGraphsSpline3DSeries::appendSeriesChildren,
+                                     0,
+                                     0,
+                                     0);
+}
+
+void QQuickGraphsSpline3DSeries::appendSeriesChildren(QQmlListProperty<QObject> *list,
+                                                      QObject *element)
+{
+    QScatterDataProxy *proxy = qobject_cast<QScatterDataProxy *>(element);
+    if (proxy)
+        reinterpret_cast<QQuickGraphsSpline3DSeries *>(list->data)->setDataProxy(proxy);
+}
+
+void QQuickGraphsSpline3DSeries::setBaseGradient(QQuickGradient *gradient)
+{
+    if (m_baseGradient != gradient) {
+        setGradientHelper(gradient, m_baseGradient, GradientType::Base);
+        m_baseGradient = gradient;
+        Q_EMIT baseGradientChanged(m_baseGradient);
+    }
+}
+
+QQuickGradient *QQuickGraphsSpline3DSeries::baseGradient() const
+{
+    return m_baseGradient;
+}
+
+void QQuickGraphsSpline3DSeries::setSingleHighlightGradient(QQuickGradient *gradient)
+{
+    if (m_singleHighlightGradient != gradient) {
+        setGradientHelper(gradient, m_singleHighlightGradient, GradientType::Single);
+        m_singleHighlightGradient = gradient;
+        Q_EMIT singleHighlightGradientChanged(m_singleHighlightGradient);
+    }
+}
+
+QQuickGradient *QQuickGraphsSpline3DSeries::singleHighlightGradient() const
+{
+    return m_singleHighlightGradient;
+}
+
+void QQuickGraphsSpline3DSeries::setMultiHighlightGradient(QQuickGradient *gradient)
+{
+    if (m_multiHighlightGradient != gradient) {
+        setGradientHelper(gradient, m_multiHighlightGradient, GradientType::Multi);
+        m_multiHighlightGradient = gradient;
+        Q_EMIT multiHighlightGradientChanged(m_multiHighlightGradient);
+    }
+}
+
+QQuickGradient *QQuickGraphsSpline3DSeries::multiHighlightGradient() const
+{
+    return m_multiHighlightGradient;
+}
+
+int QQuickGraphsSpline3DSeries::invalidSelectionIndex() const
+{
+    return QSpline3DSeries::invalidSelectionIndex();
+}
+
+void QQuickGraphsSpline3DSeries::handleBaseGradientUpdate()
+{
+    if (!m_baseGradient)
+        Utils::setSeriesGradient(this, m_baseGradient, GradientType::Base);
+}
+
+void QQuickGraphsSpline3DSeries::handleSingleHighlightGradientUpdate()
+{
+    if (!m_singleHighlightGradient)
+        Utils::setSeriesGradient(this, m_singleHighlightGradient, GradientType::Single);
+}
+
+void QQuickGraphsSpline3DSeries::handleMultiHighlightGradientUpdate()
+{
+    if (!m_multiHighlightGradient)
+        Utils::setSeriesGradient(this, m_multiHighlightGradient, GradientType::Multi);
+}
+
+void QQuickGraphsSpline3DSeries::setGradientHelper(QQuickGradient *newGradient,
+                                                   QQuickGradient *memberGradient,
+                                                   GradientType type)
+{
+    if (memberGradient)
+        QObject::disconnect(memberGradient, 0, this, 0);
+    Utils::setSeriesGradient(this, newGradient, type);
+    memberGradient = newGradient;
+    if (memberGradient) {
+        switch (type) {
+        case GradientType::Base:
+            QObject::connect(memberGradient,
+                             &QQuickGradient::updated,
+                             this,
+                             &QQuickGraphsSpline3DSeries::handleBaseGradientUpdate);
+            break;
+        case GradientType::Single:
+            QObject::connect(memberGradient,
+                             &QQuickGradient::updated,
+                             this,
+                             &QQuickGraphsSpline3DSeries::handleSingleHighlightGradientUpdate);
+            break;
+        case GradientType::Multi:
+            QObject::connect(memberGradient,
+                             &QQuickGradient::updated,
+                             this,
+                             &QQuickGraphsSpline3DSeries::handleMultiHighlightGradientUpdate);
+            break;
+        default:
+            break;
+        }
+    }
+}
+
+QT_END_NAMESPACE
diff -pruN 6.8.2-4/src/graphs3d/qml/qquickgraphssplineseries_p.h 6.9.1-1/src/graphs3d/qml/qquickgraphssplineseries_p.h
--- 6.8.2-4/src/graphs3d/qml/qquickgraphssplineseries_p.h	1970-01-01 00:00:00.000000000 +0000
+++ 6.9.1-1/src/graphs3d/qml/qquickgraphssplineseries_p.h	2025-05-29 02:19:47.000000000 +0000
@@ -0,0 +1,81 @@
+// Copyright (C) 2024 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+//
+//  W A R N I N G
+//  -------------
+//
+// This file is not part of the QtGraphs API.  It exists purely as an
+// implementation detail.  This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+
+#ifndef QQUICKGRAPHSSPLINESERIES_P_H
+#define QQUICKGRAPHSSPLINESERIES_P_H
+
+#include "theme/qquickgraphscolor_p.h"
+#include <qspline3dseries.h>
+
+#include <QtQml/qqml.h>
+#include <QtQuick/private/qquickrectangle_p.h>
+#include <private/qgraphsglobal_p.h>
+
+QT_BEGIN_NAMESPACE
+
+class QQuickGraphsSpline3DSeries : public QSpline3DSeries
+{
+    Q_OBJECT
+    Q_PROPERTY(QQmlListProperty<QObject> seriesChildren READ seriesChildren CONSTANT)
+    Q_PROPERTY(QQuickGradient *baseGradient READ baseGradient WRITE setBaseGradient NOTIFY
+                   baseGradientChanged FINAL)
+    Q_PROPERTY(QQuickGradient *singleHighlightGradient READ singleHighlightGradient WRITE
+                   setSingleHighlightGradient NOTIFY singleHighlightGradientChanged FINAL)
+    Q_PROPERTY(QQuickGradient *multiHighlightGradient READ multiHighlightGradient WRITE
+                   setMultiHighlightGradient NOTIFY multiHighlightGradientChanged FINAL)
+    // This is static method in parent class, overload as constant property for qml.
+    Q_PROPERTY(int invalidSelectionIndex READ invalidSelectionIndex CONSTANT)
+    Q_CLASSINFO("DefaultProperty", "seriesChildren")
+
+    QML_ADDED_IN_VERSION(6, 9)
+    QML_NAMED_ELEMENT(Spline3DSeries)
+
+public:
+    QQuickGraphsSpline3DSeries(QObject *parent = 0);
+    ~QQuickGraphsSpline3DSeries() override;
+
+    QQmlListProperty<QObject> seriesChildren();
+    static void appendSeriesChildren(QQmlListProperty<QObject> *list, QObject *element);
+
+    void setBaseGradient(QQuickGradient *gradient);
+    QQuickGradient *baseGradient() const;
+    void setSingleHighlightGradient(QQuickGradient *gradient);
+    QQuickGradient *singleHighlightGradient() const;
+    void setMultiHighlightGradient(QQuickGradient *gradient);
+    QQuickGradient *multiHighlightGradient() const;
+
+    int invalidSelectionIndex() const;
+
+public Q_SLOTS:
+    void handleBaseGradientUpdate();
+    void handleSingleHighlightGradientUpdate();
+    void handleMultiHighlightGradientUpdate();
+
+Q_SIGNALS:
+    void baseGradientChanged(QQuickGradient *gradient);
+    void singleHighlightGradientChanged(QQuickGradient *gradient);
+    void multiHighlightGradientChanged(QQuickGradient *gradient);
+
+private:
+    QQuickGradient *m_baseGradient = nullptr;
+    QQuickGradient *m_singleHighlightGradient = nullptr;
+    QQuickGradient *m_multiHighlightGradient = nullptr;
+
+    void setGradientHelper(QQuickGradient *newGradient,
+                           QQuickGradient *memberGradient,
+                           GradientType type);
+};
+
+QT_END_NAMESPACE
+
+#endif
diff -pruN 6.8.2-4/src/graphs3d/qml/qquickgraphssurface.cpp 6.9.1-1/src/graphs3d/qml/qquickgraphssurface.cpp
--- 6.8.2-4/src/graphs3d/qml/qquickgraphssurface.cpp	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs3d/qml/qquickgraphssurface.cpp	2025-05-29 02:19:47.000000000 +0000
@@ -1421,6 +1421,10 @@ void QQuickGraphsSurface::updateModel(Su
         material->setProperty("vertCount", QVector2D(columnCount, rowCount));
         material->setProperty("flipU", !model->ascendingX);
         material->setProperty("flipV", !model->ascendingZ);
+        for (int i = 0; i < m_seriesList.size(); i++) {
+            if (m_seriesList.at(i) == model->series)
+                material->setProperty("order", i);
+        }
 
         model->vertices.clear();
         model->vertices.reserve(totalSize);
@@ -1697,6 +1701,7 @@ void QQuickGraphsSurface::updateMaterial
     }
 
     bool textured = !(model->series->texture().isNull() && model->series->textureFile().isEmpty());
+    bool hasTransparency = false;
 
     if (isSeriesVisualsDirty() || !textured) {
         float minY = model->boundsMin.y();
@@ -1735,6 +1740,11 @@ void QQuickGraphsSurface::updateMaterial
         material->setParentItem(model->model);
         material->setCullMode(QQuick3DMaterial::NoCulling);
         material->setProperty("flatShading", flatShading);
+
+        if (model->series->colorStyle() == QGraphsTheme::ColorStyle::Uniform)
+            hasTransparency = model->series->baseColor().alphaF() < 1.0;
+        else
+            hasTransparency = textureData->hasTransparency();
     }
 
     if (textured) {
@@ -1760,10 +1770,14 @@ void QQuickGraphsSurface::updateMaterial
             texInput->texture()->setTextureData(textureData);
             texInput->texture()->setVerticalTiling(QQuick3DTexture::ClampToEdge);
             texInput->texture()->setHorizontalTiling(QQuick3DTexture::ClampToEdge);
+
+            hasTransparency = textureData->hasTransparency();
         } else {
             texInput->texture()->setSource(QUrl());
         }
     }
+    material->setProperty("rootScale", rootNode()->scale().y());
+    material->setProperty("hasTransparency", hasTransparency);
     material->update();
 }
 
@@ -2001,7 +2015,7 @@ void QQuickGraphsSurface::createIndices(
     QVector<quint32> *indices = &model->indices;
 
     indices->clear();
-    indices->resize(indexCount);
+    indices->reserve(indexCount);
 
     qsizetype rowEnd = endY * columnCount;
     for (qsizetype row = 0; row < rowEnd; row += columnCount) {
@@ -2035,7 +2049,7 @@ void QQuickGraphsSurface::createGridline
 
     qsizetype gridIndexCount = 2 * nColumns * (nRows - 1) + 2 * nRows * (nColumns - 1);
     model->gridIndices.clear();
-    model->gridIndices.resize(gridIndexCount);
+    model->gridIndices.reserve(gridIndexCount);
 
     for (qsizetype i = y, row = columnCount * y; i <= endY; i++, row += columnCount) {
         for (qsizetype j = x; j < endX; j++) {
@@ -2099,6 +2113,90 @@ bool QQuickGraphsSurface::doPicking(QPoi
                 }
             }
 
+            bool inRange = qAbs(pickedPos.x()) < scaleWithBackground().x()
+                           && qAbs(pickedPos.z()) < scaleWithBackground().z();
+
+            if (!pickedPos.isNull() && inRange) {
+                float min = -1.0f;
+
+                for (auto model : m_model) {
+                    if (!model->series->isVisible()) {
+                        model->picked = false;
+                        continue;
+                    }
+
+                    model->picked = (model->model == pickedModel);
+
+                    SurfaceVertex selectedVertex;
+                    for (auto vertex : model->vertices) {
+                        QVector3D pos = vertex.position;
+                        float dist = pickedPos.distanceToPoint(pos);
+                        if (selectedVertex.position.isNull() || dist < min) {
+                            min = dist;
+                            selectedVertex = vertex;
+                        }
+                    }
+                    model->selectedVertex = selectedVertex;
+                    if (!selectedVertex.position.isNull() && model->picked) {
+                        model->series->setSelectedPoint(selectedVertex.coord);
+                        setSlicingActive(false);
+                        if (isSliceEnabled())
+                            setSliceActivatedChanged(true);
+                    }
+                }
+            }
+        } else {
+            clearSelection();
+            for (auto model : m_model)
+                model->picked = false;
+        }
+    }
+    return true;
+}
+
+bool QQuickGraphsSurface::doRayPicking(QVector3D origin, QVector3D direction)
+{
+    if (!m_pickThisFrame && m_proxyDirty) {
+        m_pickThisFrame = true;
+        QVector3D toScene = mapFrom3DScene(origin);
+        m_lastPick = QPointF(toScene.x(), toScene.y());
+        for (auto model : m_model)
+            updateProxyModel(model);
+        return false;
+    }
+    if (!QQuickGraphsItem::doRayPicking(origin, direction))
+        return false;
+
+    m_selectionDirty = true;
+    QList<QQuick3DPickResult> pickResult = rayPickAll(origin, direction);
+    QVector3D pickedPos(0.0f, 0.0f, 0.0f);
+    QQuick3DModel *pickedModel = nullptr;
+
+    if (!selectionMode().testFlag(QtGraphs3D::SelectionFlag::None)) {
+        if (!sliceView() && selectionMode().testFlag(QtGraphs3D::SelectionFlag::Slice))
+            createSliceView();
+
+        if (!pickResult.isEmpty()) {
+            for (auto picked : pickResult) {
+                bool inBounds = qAbs(picked.position().y()) < scaleWithBackground().y();
+                if (inBounds && picked.objectHit()
+                    && picked.objectHit()->objectName().contains(QStringLiteral("ProxyModel"))) {
+                    pickedPos = picked.position();
+                    pickedModel = qobject_cast<QQuick3DModel *>(picked.objectHit()->parentItem());
+                    bool visible = false;
+                    for (auto model : m_model) {
+                        if (model->model == pickedModel)
+                            visible = model->series->isVisible();
+                    }
+                    if (!pickedPos.isNull() && visible)
+                        break;
+                } else {
+                    clearSelection();
+                    for (auto model : m_model)
+                        model->picked = false;
+                }
+            }
+
             bool inRange = qAbs(pickedPos.x()) < scaleWithBackground().x()
                            && qAbs(pickedPos.z()) < scaleWithBackground().z();
 
diff -pruN 6.8.2-4/src/graphs3d/qml/qquickgraphssurface_p.h 6.9.1-1/src/graphs3d/qml/qquickgraphssurface_p.h
--- 6.8.2-4/src/graphs3d/qml/qquickgraphssurface_p.h	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs3d/qml/qquickgraphssurface_p.h	2025-05-29 02:19:47.000000000 +0000
@@ -154,6 +154,7 @@ protected:
     void updateLightStrength() override;
     void handleThemeTypeChange() override;
     bool doPicking(QPointF position) override;
+    bool doRayPicking(QVector3D origin, QVector3D direction) override;
 
     void createSliceView() override;
     void updateSliceItemLabel(const QString &label, QVector3D position) override;
diff -pruN 6.8.2-4/src/graphs3d/qml/qquickgraphssurfaceseries_p.h 6.9.1-1/src/graphs3d/qml/qquickgraphssurfaceseries_p.h
--- 6.8.2-4/src/graphs3d/qml/qquickgraphssurfaceseries_p.h	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs3d/qml/qquickgraphssurfaceseries_p.h	2025-05-29 02:19:47.000000000 +0000
@@ -14,9 +14,9 @@
 #ifndef QQUICKGRAPHSSURFACESERIES_P_H
 #define QQUICKGRAPHSSURFACESERIES_P_H
 
-#include "common/theme/qquickgraphscolor_p.h"
 #include "gradientholder_p.h"
 #include "qsurface3dseries.h"
+#include "theme/qquickgraphscolor_p.h"
 
 #include <QtQml/qqml.h>
 #include <QtQuick/private/qquickrectangle_p.h>
diff -pruN 6.8.2-4/src/graphs3d/qml/resources/BarsMaterial.qml 6.9.1-1/src/graphs3d/qml/resources/BarsMaterial.qml
--- 6.8.2-4/src/graphs3d/qml/resources/BarsMaterial.qml	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs3d/qml/resources/BarsMaterial.qml	2025-05-29 02:19:47.000000000 +0000
@@ -11,6 +11,10 @@ CustomMaterial {
     property bool isHighlight
     property bool transparency: false
 
+    property bool valueColoring
+    property real heightValue
+    property real rootScale
+
     property real specularBrightness: 0.25
     readonly property real shininess: (1.0 - specularBrightness) * 100
 
diff -pruN 6.8.2-4/src/graphs3d/qml/resources/BarsMaterialInstancing.qml 6.9.1-1/src/graphs3d/qml/resources/BarsMaterialInstancing.qml
--- 6.8.2-4/src/graphs3d/qml/resources/BarsMaterialInstancing.qml	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs3d/qml/resources/BarsMaterialInstancing.qml	2025-05-29 02:19:47.000000000 +0000
@@ -11,6 +11,9 @@ CustomMaterial {
     property bool isHighlight
     property bool instancing
     property bool transparency: false
+    property real rootScale
+
+    property bool valueColoring
 
     property real specularBrightness: 0.25
     readonly property real shininess: (1.0 - specularBrightness) * 100
diff -pruN 6.8.2-4/src/graphs3d/qml/resources/ScatterMaterial.qml 6.9.1-1/src/graphs3d/qml/resources/ScatterMaterial.qml
--- 6.8.2-4/src/graphs3d/qml/resources/ScatterMaterial.qml	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs3d/qml/resources/ScatterMaterial.qml	2025-05-29 02:19:47.000000000 +0000
@@ -11,6 +11,7 @@ CustomMaterial {
     property color uColor
     property bool usePoint
     property bool transparency: false
+    property real rootScale
 
     property real specularBrightness: 0.25
     readonly property real shininess: (1.0 - specularBrightness) * 100
diff -pruN 6.8.2-4/src/graphs3d/qml/resources/ScatterMaterialInstancing.qml 6.9.1-1/src/graphs3d/qml/resources/ScatterMaterialInstancing.qml
--- 6.8.2-4/src/graphs3d/qml/resources/ScatterMaterialInstancing.qml	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs3d/qml/resources/ScatterMaterialInstancing.qml	2025-05-29 02:19:47.000000000 +0000
@@ -11,6 +11,7 @@ CustomMaterial {
     property color uColor
     property bool usePoint
     property bool transparency: false
+    property real rootScale
 
     property real specularBrightness: 0.25
     readonly property real shininess: (1.0 - specularBrightness) * 100
diff -pruN 6.8.2-4/src/graphs3d/qml/resources/SplineMaterial.qml 6.9.1-1/src/graphs3d/qml/resources/SplineMaterial.qml
--- 6.8.2-4/src/graphs3d/qml/resources/SplineMaterial.qml	1970-01-01 00:00:00.000000000 +0000
+++ 6.9.1-1/src/graphs3d/qml/resources/SplineMaterial.qml	2025-05-29 02:19:47.000000000 +0000
@@ -0,0 +1,20 @@
+// Copyright (C) 2024 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+import QtQuick3D
+import QtQuick
+
+CustomMaterial {
+    property TextureInput controlPoints: TextureInput {}
+    property int points
+
+    property real tension
+    property real knotting
+    property bool loop
+    property color color
+
+    shadingMode: CustomMaterial.Shaded
+
+    vertexShader: "qrc:/shaders/splinevert"
+    fragmentShader: "qrc:/shaders/splinefrag"
+}
diff -pruN 6.8.2-4/src/graphs3d/qml/resources/SurfaceMaterial.qml 6.9.1-1/src/graphs3d/qml/resources/SurfaceMaterial.qml
--- 6.8.2-4/src/graphs3d/qml/resources/SurfaceMaterial.qml	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs3d/qml/resources/SurfaceMaterial.qml	2025-05-29 02:19:47.000000000 +0000
@@ -15,6 +15,7 @@ CustomMaterial {
     property vector2d uvOffset
     property vector2d size
     property vector2d vertCount
+    property real rootScale
 
     property real gradientMin
     property real gradientHeight
@@ -25,10 +26,15 @@ CustomMaterial {
     property bool flipU: false
     property bool flipV: false
 
+    property bool hasTransparency
+    property real order: 0
+
     property real specularBrightness: 0.25
     readonly property real shininess: (1.0 - specularBrightness) * 100
 
     shadingMode: CustomMaterial.Shaded
     vertexShader: "qrc:/shaders/surfacevert"
     fragmentShader: "qrc:/shaders/surfacefrag"
+    sourceBlend: hasTransparency? CustomMaterial.SrcAlpha : CustomMaterial.NoBlend;
+    destinationBlend: hasTransparency? CustomMaterial.OneMinusSrcAlpha : CustomMaterial.NoBlend;
 }
diff -pruN 6.8.2-4/src/graphs3d/qml/resources/TitleLabel.qml 6.9.1-1/src/graphs3d/qml/resources/TitleLabel.qml
--- 6.8.2-4/src/graphs3d/qml/resources/TitleLabel.qml	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs3d/qml/resources/TitleLabel.qml	2025-05-29 02:19:47.000000000 +0000
@@ -21,6 +21,7 @@ Model {
 
     materials: PrincipledMaterial {
         lighting: PrincipledMaterial.NoLighting
+        alphaMode: PrincipledMaterial.Blend
         baseColorMap: Texture {
             sourceItem: Item {
                 id: labelItem
diff -pruN 6.8.2-4/src/graphs3d/utils/qgraphs3dnamespace.cpp 6.9.1-1/src/graphs3d/utils/qgraphs3dnamespace.cpp
--- 6.8.2-4/src/graphs3d/utils/qgraphs3dnamespace.cpp	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs3d/utils/qgraphs3dnamespace.cpp	2025-05-29 02:19:47.000000000 +0000
@@ -196,4 +196,32 @@ QT_BEGIN_NAMESPACE
     expense of performance.
  */
 
+/*!
+    \enum QtGraphs3D::TransparencyTechnique
+    \since 6.9
+
+    \brief Specifies which transparency technique to use. The Default value is \c{Default}.
+           When rendering transparent surface graphs, use \c{Approximate} or \c{Accurate}.
+
+    \value Default
+           Indicates that order-independent transparency techniques are not used.
+           Offers the best performance. Use when graphs don't contain
+           transparency or when a bar or scatter graph is also using instancing,
+           that is \l optimizationHint is {QtGraphs3D::OptimizationHint::Default}.
+
+    \value Approximate
+           Indicates that a graph attempts an approximation of order-independent
+           transparency. This method is faster than \c Accurate and works on older
+           hardware but may yield inaccurate results. Use when the order-independent
+           transparency is needed, but the performance cost has to be lower than
+           when using accurate order-independent transparency.
+
+    \value Accurate
+           Indicates that accurate order-independent transparency is used.
+           Use when perfect transparency rendering is needed.
+           \note Accurate transparency is not yet implemented
+                and will be enabled when the required functionality
+                is added to QtQuick3D.
+ */
+
 QT_END_NAMESPACE
diff -pruN 6.8.2-4/src/graphs3d/utils/qgraphs3dnamespace.h 6.9.1-1/src/graphs3d/utils/qgraphs3dnamespace.h
--- 6.8.2-4/src/graphs3d/utils/qgraphs3dnamespace.h	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs3d/utils/qgraphs3dnamespace.h	2025-05-29 02:19:47.000000000 +0000
@@ -1,7 +1,7 @@
 // Copyright (C) 2024 The Qt Company Ltd.
 // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
-#ifndef QGRAPHS3DNAMESPACE_H
-#define QGRAPHS3DNAMESPACE_H
+#ifndef QTGRAPHS_QGRAPHS3DNAMESPACE_H
+#define QTGRAPHS_QGRAPHS3DNAMESPACE_H
 #include <QtCore/qobjectdefs.h>
 #include <QtGraphs/qtgraphsexports.h>
 #include <QtQmlIntegration/qqmlintegration.h>
@@ -93,9 +93,16 @@ Q_ENUM_NS(CameraPreset)
 enum class GridLineType { Shader, Geometry };
 Q_ENUM_NS(GridLineType)
 
+enum class TransparencyTechnique {
+    Default,
+    Approximate,
+    Accurate,
+};
+Q_ENUM_NS(TransparencyTechnique)
+
 } // namespace QtGraphs3D
 Q_DECLARE_OPERATORS_FOR_FLAGS(QtGraphs3D::SelectionFlags)
 
 QT_END_NAMESPACE
 
-#endif // QGRAPHS3DNAMESPACE_H
+#endif // QTGRAPHS_QGRAPHS3DNAMESPACE_H
diff -pruN 6.8.2-4/src/graphs3d/utils/qutils.h 6.9.1-1/src/graphs3d/utils/qutils.h
--- 6.8.2-4/src/graphs3d/utils/qutils.h	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs3d/utils/qutils.h	2025-05-29 02:19:47.000000000 +0000
@@ -1,13 +1,15 @@
 // Copyright (C) 2023 The Qt Company Ltd.
 // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
 
-#ifndef QUTILS_H
-#define QUTILS_H
+#ifndef QTGRAPHS_QUTILS_H
+#define QTGRAPHS_QUTILS_H
 
+#include <QtGraphs/qgraphsglobal.h>
 #include <QtCore/qcoreapplication.h>
 #include <QtGui/qsurfaceformat.h>
 #include <QtQuick3D/qquick3d.h>
 
+
 QT_BEGIN_NAMESPACE
 
 [[maybe_unused]] static inline QSurfaceFormat qDefaultSurfaceFormat(bool antialias)
diff -pruN 6.8.2-4/src/graphs3d/widget/q3dbarswidgetitem.h 6.9.1-1/src/graphs3d/widget/q3dbarswidgetitem.h
--- 6.8.2-4/src/graphs3d/widget/q3dbarswidgetitem.h	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs3d/widget/q3dbarswidgetitem.h	2025-05-29 02:19:47.000000000 +0000
@@ -1,8 +1,8 @@
 // Copyright (C) 2024 The Qt Company Ltd.
 // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
 
-#ifndef Q3DBARSWIDGETITEM_H
-#define Q3DBARSWIDGETITEM_H
+#ifndef QTGRAPHS_Q3DBARSWIDGETITEM_H
+#define QTGRAPHS_Q3DBARSWIDGETITEM_H
 
 #include <QtGraphs/qbar3dseries.h>
 #include <QtGraphs/qcategory3daxis.h>
diff -pruN 6.8.2-4/src/graphs3d/widget/q3dgraphswidgetitem.cpp 6.9.1-1/src/graphs3d/widget/q3dgraphswidgetitem.cpp
--- 6.8.2-4/src/graphs3d/widget/q3dgraphswidgetitem.cpp	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs3d/widget/q3dgraphswidgetitem.cpp	2025-05-29 02:19:47.000000000 +0000
@@ -119,6 +119,46 @@ QList<QGraphsTheme *> Q3DGraphsWidgetIte
 }
 
 /*!
+ * \property Q3DGraphsWidgetItem::transparencyTechnique
+ * \since 6.9
+ *
+ * \brief Specifies which transparency technique to use. The Default value is \c{Default}.
+ * When rendering transparent surface graphs, use \c{Approximate} or \c{Accurate}.
+ *
+ * \value Default
+ *        Indicates that order-independent transparency techniques are not used.
+ *        Offers the best performance. Use when graphs don't contain
+ *        transparency or when a bar or scatter graph is also using instancing,
+ *        that is \l optimizationHint is {QtGraphs3D::OptimizationHint::Default}.
+ *
+ * \value Approximate
+ *        Indicates that a graph attempts an approximation of order-independent
+ *        transparency. This method is faster than \c Accurate and works on older
+ *        hardware but may yield inaccurate results. Use when the order-independent
+ *        transparency is needed, but the performance cost has to be lower than
+ *        when using accurate order-independent transparency.
+ *
+ * \value Accurate
+ *        Indicates that accurate order-independent transparency is used.
+ *        Use when perfect transparency rendering is needed.
+ *        \note Accurate transparency is not yet implemented
+ *              and will be enabled when the required functionality
+ *              is added to QtQuick3D.
+ *
+ * \sa QtGraphs3D::TransparencyTechnique
+ */
+QtGraphs3D::TransparencyTechnique Q3DGraphsWidgetItem::transparencyTechnique() const
+{
+    Q_D(const Q3DGraphsWidgetItem);
+    return d->m_graphsItem->transparencyTechnique();
+}
+void Q3DGraphsWidgetItem::setTransparencyTechnique(QtGraphs3D::TransparencyTechnique technique)
+{
+    Q_D(const Q3DGraphsWidgetItem);
+    d->m_graphsItem->setTransparencyTechnique(technique);
+}
+
+/*!
  * \property Q3DGraphsWidgetItem::selectionMode
  *
  * \brief Item selection mode.
@@ -424,6 +464,7 @@ void Q3DGraphsWidgetItem::setCameraYRota
  * \property Q3DGraphsWidgetItem::minCameraXRotation
  *
  * \brief The minimum X-rotation angle of the camera around the target point in degrees.
+ * The default value is \c{-180.0}
  */
 float Q3DGraphsWidgetItem::minCameraXRotation() const
 {
@@ -441,6 +482,7 @@ void Q3DGraphsWidgetItem::setMinCameraXR
  * \property Q3DGraphsWidgetItem::maxCameraXRotation
  *
  * \brief The maximum X-rotation angle of the camera around the target point in degrees.
+ * The default value is \c{180.0}
  */
 float Q3DGraphsWidgetItem::maxCameraXRotation() const
 {
@@ -458,6 +500,7 @@ void Q3DGraphsWidgetItem::setMaxCameraXR
  * \property Q3DGraphsWidgetItem::minCameraYRotation
  *
  * \brief The minimum Y-rotation angle of the camera around the target point in degrees.
+ * The default value is \c{0.0}
  */
 float Q3DGraphsWidgetItem::minCameraYRotation() const
 {
@@ -475,6 +518,7 @@ void Q3DGraphsWidgetItem::setMinCameraYR
  * \property Q3DGraphsWidgetItem::maxCameraYRotation
  *
  * \brief The maximum Y-rotation angle of the camera around the target point in degrees.
+ * The default value is \c{90.0}
  */
 float Q3DGraphsWidgetItem::maxCameraYRotation() const
 {
@@ -940,6 +984,13 @@ void Q3DGraphsWidgetItem::setMsaaSamples
     d->m_graphsItem->setMsaaSamples(samples);
 }
 
+/*!
+ * Performs picking using view coordinates from \a point
+ * on the elements of the graph, selecting the first item hit.
+ * Default input handling performs this upon receiving the onTapped event.
+ *
+ * \sa selectedElement
+ */
 void Q3DGraphsWidgetItem::doPicking(QPoint point)
 {
     Q_D(Q3DGraphsWidgetItem);
@@ -947,6 +998,18 @@ void Q3DGraphsWidgetItem::doPicking(QPoi
 }
 
 /*!
+ * Performs picking starting from \a origin and in \a direction
+ * on the elements of the graph, selecting the first item hit.
+ *
+ * \sa selectedElement
+ */
+void Q3DGraphsWidgetItem::doRayPicking(QVector3D origin, QVector3D direction)
+{
+    Q_D(Q3DGraphsWidgetItem);
+    d->m_graphsItem->doRayPicking(origin, direction);
+}
+
+/*!
  * \property Q3DGraphsWidgetItem::measureFps
  *
  * \brief Whether rendering is done continuously instead of on demand.
@@ -1435,6 +1498,10 @@ void Q3DGraphsWidgetItemPrivate::createG
                      q,
                      &Q3DGraphsWidgetItem::activeThemeChanged);
     QObject::connect(m_graphsItem.get(),
+                     &QQuickGraphsItem::transparencyTechniqueChanged,
+                     q,
+                     &Q3DGraphsWidgetItem::transparencyTechniqueChanged);
+    QObject::connect(m_graphsItem.get(),
                      &QQuickGraphsItem::selectionModeChanged,
                      q,
                      &Q3DGraphsWidgetItem::selectionModeChanged);
diff -pruN 6.8.2-4/src/graphs3d/widget/q3dgraphswidgetitem.h 6.9.1-1/src/graphs3d/widget/q3dgraphswidgetitem.h
--- 6.8.2-4/src/graphs3d/widget/q3dgraphswidgetitem.h	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs3d/widget/q3dgraphswidgetitem.h	2025-05-29 02:19:47.000000000 +0000
@@ -1,8 +1,8 @@
 // Copyright (C) 2024 The Qt Company Ltd.
 // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
 
-#ifndef Q3DGRAPHSWIDGETITEM_H
-#define Q3DGRAPHSWIDGETITEM_H
+#ifndef QTGRAPHS_Q3DGRAPHSWIDGETITEM_H
+#define QTGRAPHS_Q3DGRAPHSWIDGETITEM_H
 
 #include <QtCore/qlocale.h>
 #include <QtGraphs/q3dscene.h>
@@ -31,6 +31,8 @@ class Q_GRAPHSWIDGETS_EXPORT Q3DGraphsWi
                    NOTIFY selectionModeChanged)
     Q_PROPERTY(QtGraphs3D::ShadowQuality shadowQuality READ shadowQuality WRITE setShadowQuality
                    NOTIFY shadowQualityChanged)
+    Q_PROPERTY(QtGraphs3D::TransparencyTechnique transparencyTechnique READ transparencyTechnique
+                   WRITE setTransparencyTechnique NOTIFY transparencyTechniqueChanged REVISION(6, 9))
     Q_PROPERTY(Q3DScene *scene READ scene CONSTANT)
     Q_PROPERTY(bool measureFps READ measureFps WRITE setMeasureFps NOTIFY measureFpsChanged)
     Q_PROPERTY(int currentFps READ currentFps NOTIFY currentFpsChanged)
@@ -104,6 +106,9 @@ public:
     void setActiveTheme(QGraphsTheme *activeTheme);
     QList<QGraphsTheme *> themes() const;
 
+    void setTransparencyTechnique(QtGraphs3D::TransparencyTechnique technique);
+    QtGraphs3D::TransparencyTechnique transparencyTechnique() const;
+
     QtGraphs3D::ShadowQuality shadowQuality() const;
     void setShadowQuality(const QtGraphs3D::ShadowQuality &shadowQuality);
 
@@ -225,6 +230,7 @@ public:
     void setMsaaSamples(int samples);
 
     void doPicking(QPoint point);
+    void doRayPicking(QVector3D origin, QVector3D direction);
 
     float ambientLightStrength() const;
     void setAmbientLightStrength(float newAmbientLightStrength);
@@ -251,6 +257,7 @@ protected:
 Q_SIGNALS:
     void activeThemeChanged(QGraphsTheme *activeTheme);
     void shadowQualityChanged(QtGraphs3D::ShadowQuality quality);
+    Q_REVISION(6, 9) void transparencyTechniqueChanged(QtGraphs3D::TransparencyTechnique technique);
     void selectionModeChanged(const QtGraphs3D::SelectionFlags selectionMode);
     void selectedElementChanged(QtGraphs3D::ElementType type);
     void measureFpsChanged(bool enabled);
diff -pruN 6.8.2-4/src/graphs3d/widget/q3dscatterwidgetitem.h 6.9.1-1/src/graphs3d/widget/q3dscatterwidgetitem.h
--- 6.8.2-4/src/graphs3d/widget/q3dscatterwidgetitem.h	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs3d/widget/q3dscatterwidgetitem.h	2025-05-29 02:19:47.000000000 +0000
@@ -1,8 +1,8 @@
 // Copyright (C) 2024 The Qt Company Ltd.
 // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
 
-#ifndef Q3DSCATTERWIDGETITEM_H
-#define Q3DSCATTERWIDGETITEM_H
+#ifndef QTGRAPHS_Q3DSCATTERWIDGETITEM_H
+#define QTGRAPHS_Q3DSCATTERWIDGETITEM_H
 
 #include <QtGraphs/qscatter3dseries.h>
 #include <QtGraphs/qvalue3daxis.h>
diff -pruN 6.8.2-4/src/graphs3d/widget/q3dsurfacewidgetitem.h 6.9.1-1/src/graphs3d/widget/q3dsurfacewidgetitem.h
--- 6.8.2-4/src/graphs3d/widget/q3dsurfacewidgetitem.h	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs3d/widget/q3dsurfacewidgetitem.h	2025-05-29 02:19:47.000000000 +0000
@@ -1,8 +1,8 @@
 // Copyright (C) 2024 The Qt Company Ltd.
 // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
 
-#ifndef Q3DSURFACEWIDGETITEM_H
-#define Q3DSURFACEWIDGETITEM_H
+#ifndef QTGRAPHS_Q3DSURFACEWIDGETITEM_H
+#define QTGRAPHS_Q3DSURFACEWIDGETITEM_H
 
 #include <QtGraphs/qsurface3dseries.h>
 #include <QtGraphs/qvalue3daxis.h>
diff -pruN 6.8.2-4/src/graphs3d/widget/qgraphswidgetsglobal.h 6.9.1-1/src/graphs3d/widget/qgraphswidgetsglobal.h
--- 6.8.2-4/src/graphs3d/widget/qgraphswidgetsglobal.h	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/src/graphs3d/widget/qgraphswidgetsglobal.h	2025-05-29 02:19:47.000000000 +0000
@@ -10,9 +10,9 @@
 // version without notice, or even be removed.
 //
 // We mean it.
-#ifndef QGRAPHSWIDGETGLOBAL_H
-#define QGRAPHSWIDGETGLOBAL_H
+#ifndef QTGRAPHS_QGRAPHSWIDGETGLOBAL_H
+#define QTGRAPHS_QGRAPHSWIDGETGLOBAL_H
 #include <QtCore/qglobal.h>
 #include <QtGraphsWidgets/qtgraphswidgetsexports.h>
 
-#endif // QGRAPHSWIDGETGLOBAL_H
+#endif // QTGRAPHS_QGRAPHSWIDGETGLOBAL_H
diff -pruN 6.8.2-4/tests/auto/CMakeLists.txt 6.9.1-1/tests/auto/CMakeLists.txt
--- 6.8.2-4/tests/auto/CMakeLists.txt	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/tests/auto/CMakeLists.txt	2025-05-29 02:19:47.000000000 +0000
@@ -14,7 +14,7 @@ if(TARGET Qt::Quick AND NOT boot2qt)
     if(QT_FEATURE_graphs_3d AND QT_FEATURE_graphs_3d_bars3d AND QT_FEATURE_graphs_3d_scatter3d AND QT_FEATURE_graphs_3d_surface3d)
         add_subdirectory(qmltest)
     endif()
-    if(QT_FEATURE_graphs_2d)
+    if(QT_FEATURE_graphs_2d AND QT_FEATURE_graphs_2d_area AND QT_FEATURE_graphs_2d_bar AND QT_FEATURE_graphs_2d_donut_pie AND QT_FEATURE_graphs_2d_line AND QT_FEATURE_graphs_2d_scatter AND QT_FEATURE_graphs_2d_spline)
         add_subdirectory(qml2dtest)
     endif()
 endif()
diff -pruN 6.8.2-4/tests/auto/cpp2dtest/CMakeLists.txt 6.9.1-1/tests/auto/cpp2dtest/CMakeLists.txt
--- 6.8.2-4/tests/auto/cpp2dtest/CMakeLists.txt	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/tests/auto/cpp2dtest/CMakeLists.txt	2025-05-29 02:19:47.000000000 +0000
@@ -1,21 +1,36 @@
 # Copyright (C) 2024 The Qt Company Ltd.
 # SPDX-License-Identifier: BSD-3-Clause
 
-add_subdirectory(qgaxis-abstract)
-add_subdirectory(qgaxis-barcategory)
 add_subdirectory(qgaxis-value)
 if (QT_FEATURE_timezone)
     add_subdirectory(qgaxis-datetime)
 endif()
-add_subdirectory(qgbars)
-add_subdirectory(qgbars-set)
-add_subdirectory(qglines)
-add_subdirectory(qgpieslice)
-add_subdirectory(qgpieseries)
-add_subdirectory(qgscatter)
-add_subdirectory(qgxychart)
-add_subdirectory(qgsplines)
-add_subdirectory(qgarea)
-add_subdirectory(qgbarmodelmapper)
-add_subdirectory(qgpiemodelmapper)
-add_subdirectory(qgxymodelmapper)
+if(QT_FEATURE_graphs_2d_area)
+    if(QT_FEATURE_graphs_2d_spline)
+        add_definitions(-DUSE_SPLINEGRAPH) # for testing QSplineSeries as upper and lower series
+    endif()
+    add_subdirectory(qgarea)
+endif()
+if(QT_FEATURE_graphs_2d_bar)
+    add_subdirectory(qgaxis-abstract)
+    add_subdirectory(qgaxis-barcategory)
+    add_subdirectory(qgbarmodelmapper)
+    add_subdirectory(qgbars)
+    add_subdirectory(qgbars-set)
+endif()
+if(QT_FEATURE_graphs_2d_donut_pie)
+    add_subdirectory(qgpieslice)
+    add_subdirectory(qgpieseries)
+    add_subdirectory(qgpiemodelmapper)
+endif()
+if(QT_FEATURE_graphs_2d_line)
+    add_subdirectory(qglines)
+    add_subdirectory(qgxymodelmapper) # uses QLineSeries for testing
+endif()
+if(QT_FEATURE_graphs_2d_scatter)
+    add_subdirectory(qgscatter)
+    add_subdirectory(qgxychart) # uses QScatterSeries for testing
+endif()
+if(QT_FEATURE_graphs_2d_spline)
+    add_subdirectory(qgsplines)
+endif()
diff -pruN 6.8.2-4/tests/auto/cpp2dtest/qgarea/tst_area.cpp 6.9.1-1/tests/auto/cpp2dtest/qgarea/tst_area.cpp
--- 6.8.2-4/tests/auto/cpp2dtest/qgarea/tst_area.cpp	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/tests/auto/cpp2dtest/qgarea/tst_area.cpp	2025-05-29 02:19:47.000000000 +0000
@@ -3,6 +3,9 @@
 
 #include <QtGraphs/QAreaSeries>
 #include <QtGraphs/QLineSeries>
+#ifdef USE_SPLINEGRAPH
+#include <QtGraphs/QSplineSeries>
+#endif
 #include <QtGraphs/QValueAxis>
 #include <QtQml/QQmlComponent>
 #include <QtTest/QtTest>
@@ -21,6 +24,9 @@ private slots:
 
     void initialProperties();
     void initializeProperties();
+#ifdef USE_SPLINEGRAPH
+    void initializePropertiesWithSpline();
+#endif
     void invalidProperties();
 
 private:
@@ -144,6 +150,81 @@ void tst_area::initializeProperties()
     QCOMPARE(spy13.size(), 1);
 }
 
+#ifdef USE_SPLINEGRAPH
+void tst_area::initializePropertiesWithSpline()
+{
+    QVERIFY(m_series);
+
+    // Signals from QAreasSeries
+    QSignalSpy spy0(m_series, &QAreaSeries::colorChanged);
+    QSignalSpy spy1(m_series, &QAreaSeries::selectedColorChanged);
+    QSignalSpy spy2(m_series, &QAreaSeries::borderColorChanged);
+    QSignalSpy spy3(m_series, &QAreaSeries::selectedBorderColorChanged);
+    QSignalSpy spy4(m_series, &QAreaSeries::borderWidthChanged);
+    QSignalSpy spy5(m_series, &QAreaSeries::selectedChanged);
+    QSignalSpy spy6(m_series, &QAreaSeries::upperSeriesChanged);
+    QSignalSpy spy7(m_series, &QAreaSeries::lowerSeriesChanged);
+
+    // Signals from QAbstractSeries
+    QSignalSpy spy8(m_series, &QAbstractSeries::nameChanged);
+    QSignalSpy spy9(m_series, &QAbstractSeries::visibleChanged);
+    QSignalSpy spy10(m_series, &QAbstractSeries::selectableChanged);
+    QSignalSpy spy11(m_series, &QAbstractSeries::hoverableChanged);
+    QSignalSpy spy12(m_series, &QAbstractSeries::opacityChanged);
+    QSignalSpy spy13(m_series, &QAbstractSeries::valuesMultiplierChanged);
+
+    auto upperSeries = new QSplineSeries(this);
+    auto lowerSeries = new QSplineSeries(this);
+
+    m_series->setColor("#ff0000");
+    m_series->setSelectedColor("#0000ff");
+    m_series->setBorderColor("#ff0000");
+    m_series->setSelectedBorderColor("#0000ff");
+    m_series->setBorderWidth(2.0);
+    m_series->setSelected(true);
+    m_series->setUpperSeries(upperSeries);
+    m_series->setLowerSeries(lowerSeries);
+
+    m_series->setName("AreaSeries");
+    m_series->setVisible(false);
+    m_series->setSelectable(true);
+    m_series->setHoverable(true);
+    m_series->setOpacity(0.5);
+    m_series->setValuesMultiplier(0.5);
+
+    QCOMPARE(m_series->color(), "#ff0000");
+    QCOMPARE(m_series->selectedColor(), "#0000ff");
+    QCOMPARE(m_series->borderColor(), "#ff0000");
+    QCOMPARE(m_series->selectedBorderColor(), "#0000ff");
+    QCOMPARE(m_series->borderWidth(), 2.0);
+    QCOMPARE(m_series->isSelected(), true);
+    QCOMPARE(m_series->upperSeries(), upperSeries);
+    QCOMPARE(m_series->lowerSeries(), lowerSeries);
+
+    QCOMPARE(m_series->name(), "AreaSeries");
+    QCOMPARE(m_series->isVisible(), false);
+    QCOMPARE(m_series->isSelectable(), true);
+    QCOMPARE(m_series->isHoverable(), true);
+    QCOMPARE(m_series->opacity(), 0.5);
+    QCOMPARE(m_series->valuesMultiplier(), 0.5);
+
+    QCOMPARE(spy0.size(), 1);
+    QCOMPARE(spy1.size(), 1);
+    QCOMPARE(spy2.size(), 1);
+    QCOMPARE(spy3.size(), 1);
+    QCOMPARE(spy4.size(), 1);
+    QCOMPARE(spy5.size(), 1);
+    QCOMPARE(spy6.size(), 1);
+    QCOMPARE(spy7.size(), 1);
+    QCOMPARE(spy8.size(), 1);
+    QCOMPARE(spy9.size(), 1);
+    QCOMPARE(spy10.size(), 1);
+    QCOMPARE(spy11.size(), 1);
+    QCOMPARE(spy12.size(), 1);
+    QCOMPARE(spy13.size(), 1);
+}
+#endif
+
 void tst_area::invalidProperties()
 {
     QVERIFY(m_series);
diff -pruN 6.8.2-4/tests/auto/cpp2dtest/qgaxis-abstract/tst_abstractaxis.cpp 6.9.1-1/tests/auto/cpp2dtest/qgaxis-abstract/tst_abstractaxis.cpp
--- 6.8.2-4/tests/auto/cpp2dtest/qgaxis-abstract/tst_abstractaxis.cpp	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/tests/auto/cpp2dtest/qgaxis-abstract/tst_abstractaxis.cpp	2025-05-29 02:19:47.000000000 +0000
@@ -54,6 +54,7 @@ void tst_abstractaxis::initialProperties
     QCOMPARE(m_axis->titleColor(), QColor());
     QCOMPARE(m_axis->isTitleVisible(), true);
     QCOMPARE(m_axis->titleFont(), QFont());
+    QCOMPARE(m_axis->alignment(), Qt::AlignBottom);
 }
 
 void tst_abstractaxis::initializeProperties()
@@ -71,6 +72,7 @@ void tst_abstractaxis::initializePropert
     QSignalSpy spy8(m_axis, &QAbstractAxis::titleColorChanged);
     QSignalSpy spy9(m_axis, &QAbstractAxis::titleVisibleChanged);
     QSignalSpy spy10(m_axis, &QAbstractAxis::titleFontChanged);
+    QSignalSpy spy11(m_axis, &QAbstractAxis::alignmentChanged);
 
     auto font = QFont("Arial", 20, 2, true);
     auto labelDelegate = new QQmlComponent(this);
@@ -86,6 +88,7 @@ void tst_abstractaxis::initializePropert
     m_axis->setTitleColor("#ff0000");
     m_axis->setTitleVisible(false);
     m_axis->setTitleFont(font);
+    m_axis->setAlignment(Qt::AlignTop);
 
     QCOMPARE(m_axis->isVisible(), false);
     QCOMPARE(m_axis->isLineVisible(), false);
@@ -98,6 +101,7 @@ void tst_abstractaxis::initializePropert
     QCOMPARE(m_axis->titleColor(), "#ff0000");
     QCOMPARE(m_axis->isTitleVisible(), false);
     QCOMPARE(m_axis->titleFont(), font);
+    QCOMPARE(m_axis->alignment(), Qt::AlignTop);
 
     QCOMPARE(spy0.size(), 1);
     QCOMPARE(spy1.size(), 1);
@@ -110,6 +114,7 @@ void tst_abstractaxis::initializePropert
     QCOMPARE(spy8.size(), 1);
     QCOMPARE(spy9.size(), 1);
     QCOMPARE(spy10.size(), 1);
+    QCOMPARE(spy11.size(), 1);
 }
 
 void tst_abstractaxis::showHide()
diff -pruN 6.8.2-4/tests/auto/cpp2dtest/qgaxis-value/tst_valueaxis.cpp 6.9.1-1/tests/auto/cpp2dtest/qgaxis-value/tst_valueaxis.cpp
--- 6.8.2-4/tests/auto/cpp2dtest/qgaxis-value/tst_valueaxis.cpp	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/tests/auto/cpp2dtest/qgaxis-value/tst_valueaxis.cpp	2025-05-29 02:19:47.000000000 +0000
@@ -60,6 +60,8 @@ void tst_valueaxis::initialProperties()
     QCOMPARE(m_axis->subTickCount(), 0);
     QCOMPARE(m_axis->tickAnchor(), 0.0);
     QCOMPARE(m_axis->tickInterval(), 0.0);
+    QCOMPARE(m_axis->zoom(), 1.0);
+    QCOMPARE(m_axis->pan(), 0.0);
 }
 
 void tst_valueaxis::initializeProperties()
@@ -81,6 +83,8 @@ void tst_valueaxis::initializeProperties
     m_axis->setSubTickCount(2);
     m_axis->setTickAnchor(0.5);
     m_axis->setTickInterval(0.5);
+    m_axis->setZoom(2.0);
+    m_axis->setPan(1.0);
 
     QCOMPARE(m_axis->min(), 5);
     QCOMPARE(m_axis->max(), 100);
@@ -89,10 +93,21 @@ void tst_valueaxis::initializeProperties
     QCOMPARE(m_axis->subTickCount(), 2);
     QCOMPARE(m_axis->tickAnchor(), 0.5);
     QCOMPARE(m_axis->tickInterval(), 0.5);
+    QCOMPARE(m_axis->zoom(), 2.0);
+    QCOMPARE(m_axis->pan(), 1.0);
+
+    m_axis->setLabelFormat("%.2f cakes");
+    QCOMPARE(m_axis->labelFormat(), "%.2f cakes");
+
+    //Constuct a string same way we do in axisRenderer.
+    QByteArray format = m_axis->labelFormat().toLatin1();
+    QString formatTest = QString::asprintf(format.constData(), m_axis->min());
+
+    QCOMPARE(formatTest, "5.00 cakes");
 
     QCOMPARE(spy0.size(), 1);
     QCOMPARE(spy1.size(), 1);
-    QCOMPARE(spy2.size(), 1);
+    QCOMPARE(spy2.size(), 2);
     QCOMPARE(spy3.size(), 1);
     QCOMPARE(spy4.size(), 1);
     QCOMPARE(spy5.size(), 1);
diff -pruN 6.8.2-4/tests/auto/cpp2dtest/qgxychart/tst_xyseries.cpp 6.9.1-1/tests/auto/cpp2dtest/qgxychart/tst_xyseries.cpp
--- 6.8.2-4/tests/auto/cpp2dtest/qgxychart/tst_xyseries.cpp	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/tests/auto/cpp2dtest/qgxychart/tst_xyseries.cpp	2025-05-29 02:19:47.000000000 +0000
@@ -101,6 +101,7 @@ void tst_xyseries::appendInsertRemove()
     QVERIFY(m_series);
     QSignalSpy updateSpy(m_series, &QXYSeries::update);
     QSignalSpy pointAddedSpy(m_series, &QXYSeries::pointAdded);
+    QSignalSpy pointsAddedSpy(m_series, &QXYSeries::pointsAdded);
     QSignalSpy pointRemovedSpy(m_series, &QXYSeries::pointRemoved);
     QSignalSpy pointsRemovedSpy(m_series, &QXYSeries::pointsRemoved);
 
@@ -122,15 +123,15 @@ void tst_xyseries::appendInsertRemove()
     // Append 3 more
     m_series->append(morepoints);
 
-    QCOMPARE(updateSpy.count(), 6);
+    QCOMPARE(updateSpy.count(), 4);
     QCOMPARE(m_series->points(), allpoints);
-    QCOMPARE(pointAddedSpy.size(), 6);
+    QCOMPARE(pointsAddedSpy.size(), 1);
 
     // Remove the first 3 one by one
     for (int i = 2; i >= 0; --i)
         m_series->remove(i);
 
-    QCOMPARE(updateSpy.count(), 9);
+    QCOMPARE(updateSpy.count(), 7);
     QCOMPARE(m_series->points(), morepoints);
     QCOMPARE(pointRemovedSpy.size(), 3);
 
@@ -139,14 +140,14 @@ void tst_xyseries::appendInsertRemove()
     m_series->insert(2, points[1]);
     m_series->insert(4, points[2]);
 
-    QCOMPARE(updateSpy.count(), 12);
+    QCOMPARE(updateSpy.count(), 10);
     QCOMPARE(m_series->points(), mixedpoints);
-    QCOMPARE(pointAddedSpy.size(), 9);
+    QCOMPARE(pointAddedSpy.size(), 6);
 
     // Remove first 3
     m_series->removeMultiple(0, 3);
 
-    QCOMPARE(updateSpy.count(), 13);
+    QCOMPARE(updateSpy.count(), 11);
     QCOMPARE(m_series->count(), 3);
     QCOMPARE(pointsRemovedSpy.size(), 1);
 
@@ -154,15 +155,15 @@ void tst_xyseries::appendInsertRemove()
     for (int i = 10; i < 13; ++i)
         m_series->append(i, i);
 
-    QCOMPARE(updateSpy.count(), 16);
+    QCOMPARE(updateSpy.count(), 14);
     QCOMPARE(m_series->count(), 6);
-    QCOMPARE(pointAddedSpy.size(), 12);
+    QCOMPARE(pointAddedSpy.size(), 9);
 
     // Remove 3 by qreals
     for (int i = 10; i < 13; ++i)
         m_series->remove(i, i);
 
-    QCOMPARE(updateSpy.count(), 19);
+    QCOMPARE(updateSpy.count(), 17);
     QCOMPARE(m_series->count(), 3);
     QCOMPARE(pointRemovedSpy.size(), 6);
 }
diff -pruN 6.8.2-4/tests/auto/cpptest/CMakeLists.txt 6.9.1-1/tests/auto/cpptest/CMakeLists.txt
--- 6.8.2-4/tests/auto/cpptest/CMakeLists.txt	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/tests/auto/cpptest/CMakeLists.txt	2025-05-29 02:19:47.000000000 +0000
@@ -14,6 +14,7 @@ if(QT_FEATURE_graphs_3d_scatter3d)
     add_subdirectory(qgscatter-proxy)
     add_subdirectory(qgscatter-modelproxy)
     add_subdirectory(qgscatter-series)
+    add_subdirectory(qgspline-series)
 endif()
 if(QT_FEATURE_graphs_3d_surface3d)
     add_subdirectory(qgsurface)
diff -pruN 6.8.2-4/tests/auto/cpptest/qgaxis-category/tst_axis.cpp 6.9.1-1/tests/auto/cpptest/qgaxis-category/tst_axis.cpp
--- 6.8.2-4/tests/auto/cpptest/qgaxis-category/tst_axis.cpp	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/tests/auto/cpptest/qgaxis-category/tst_axis.cpp	2025-05-29 02:19:47.000000000 +0000
@@ -65,6 +65,8 @@ void tst_axis::initialProperties()
     QCOMPARE(m_axis->title(), QString(""));
     QCOMPARE(m_axis->isTitleFixed(), true);
     QCOMPARE(m_axis->isTitleVisible(), false);
+    QCOMPARE(m_axis->isScaleLabelsByCount(), false);
+    QCOMPARE(m_axis->labelSize(), 1.0f);
     QCOMPARE(m_axis->type(), QAbstract3DAxis::AxisType::Category);
 }
 
@@ -100,6 +102,8 @@ void tst_axis::initializeProperties()
     m_axis->setTitle("title");
     m_axis->setTitleFixed(false);
     m_axis->setTitleVisible(true);
+    m_axis->setScaleLabelsByCount(true);
+    m_axis->setLabelSize(2.0f);
 
     QCOMPARE(m_axis->isAutoAdjustRange(), false);
     QCOMPARE(m_axis->labelAutoAngle(), 15.0f);
@@ -108,6 +112,8 @@ void tst_axis::initializeProperties()
     QCOMPARE(m_axis->title(), QString("title"));
     QCOMPARE(m_axis->isTitleFixed(), false);
     QCOMPARE(m_axis->isTitleVisible(), true);
+    QCOMPARE(m_axis->isScaleLabelsByCount(), true);
+    QCOMPARE(m_axis->labelSize(), 2.0f);
 
     QCOMPARE(autoAdjustSpy.size(), 1);
     QCOMPARE(labelAutoAngleSpy.size(), 1);
diff -pruN 6.8.2-4/tests/auto/cpptest/qgbars-series/tst_series.cpp 6.9.1-1/tests/auto/cpptest/qgbars-series/tst_series.cpp
--- 6.8.2-4/tests/auto/cpptest/qgbars-series/tst_series.cpp	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/tests/auto/cpptest/qgbars-series/tst_series.cpp	2025-05-29 02:19:47.000000000 +0000
@@ -84,6 +84,7 @@ void tst_series::initialProperties()
     QCOMPARE(m_series->type(), QAbstract3DSeries::SeriesType::Bar);
     QCOMPARE(m_series->userDefinedMesh(), QString(""));
     QCOMPARE(m_series->isVisible(), true);
+    QCOMPARE(m_series->isValueColoringEnabled(), false);
 }
 
 void tst_series::initializeProperties()
@@ -161,6 +162,7 @@ void tst_series::initializeProperties()
     m_series->setSingleHighlightGradient(gradient3);
     m_series->setUserDefinedMesh(":/customitem.mesh");
     m_series->setVisible(false);
+    m_series->setValueColoringEnabled(true);
     m_series->setRowLabels(rowLabels);
     m_series->setColumnLabels(columnLabels);
 
@@ -181,6 +183,7 @@ void tst_series::initializeProperties()
     QCOMPARE(m_series->singleHighlightGradient().stops().at(0).second, QColor(Qt::white));
     QCOMPARE(m_series->userDefinedMesh(), QString(":/customitem.mesh"));
     QCOMPARE(m_series->isVisible(), false);
+    QCOMPARE(m_series->isValueColoringEnabled(), true);
     QCOMPARE(m_series->rowLabels(), rowLabels);
     QCOMPARE(m_series->columnLabels(), columnLabels);
 
diff -pruN 6.8.2-4/tests/auto/cpptest/qgspline-series/CMakeLists.txt 6.9.1-1/tests/auto/cpptest/qgspline-series/CMakeLists.txt
--- 6.8.2-4/tests/auto/cpptest/qgspline-series/CMakeLists.txt	1970-01-01 00:00:00.000000000 +0000
+++ 6.9.1-1/tests/auto/cpptest/qgspline-series/CMakeLists.txt	2025-05-29 02:19:47.000000000 +0000
@@ -0,0 +1,14 @@
+# Copyright (C) 2024 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
+qt_internal_add_test(tst_qgspline_series
+    SOURCES
+    tst_series.cpp
+    INCLUDE_DIRECTORIES
+        ../common
+    LIBRARIES
+        Qt::Gui
+        Qt::GuiPrivate
+        Qt::Graphs
+        Qt::GraphsWidgets
+)
diff -pruN 6.8.2-4/tests/auto/cpptest/qgspline-series/tst_series.cpp 6.9.1-1/tests/auto/cpptest/qgspline-series/tst_series.cpp
--- 6.8.2-4/tests/auto/cpptest/qgspline-series/tst_series.cpp	1970-01-01 00:00:00.000000000 +0000
+++ 6.9.1-1/tests/auto/cpptest/qgspline-series/tst_series.cpp	2025-05-29 02:19:47.000000000 +0000
@@ -0,0 +1,114 @@
+// Copyright (C) 2024 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#include <QtTest/QtTest>
+
+#include <QtGraphs/QSpline3DSeries>
+
+class tst_series : public QObject
+{
+    Q_OBJECT
+
+private slots:
+    void initTestCase();
+    void cleanupTestCase();
+    void init();
+    void cleanup();
+
+    void construct();
+
+    void initialProperties();
+    void initializeProperties();
+
+private:
+    QSpline3DSeries *m_series;
+};
+
+void tst_series::initTestCase() {}
+
+void tst_series::cleanupTestCase() {}
+
+void tst_series::init()
+{
+    m_series = new QSpline3DSeries();
+}
+
+void tst_series::cleanup()
+{
+    delete m_series;
+}
+
+void tst_series::construct()
+{
+    QSpline3DSeries *series = new QSpline3DSeries();
+    QVERIFY(series);
+    delete series;
+
+    QScatterDataProxy *proxy = new QScatterDataProxy();
+
+    series = new QSpline3DSeries(proxy);
+    QVERIFY(series);
+    QCOMPARE(series->dataProxy(), proxy);
+    delete series;
+}
+
+void tst_series::initialProperties()
+{
+    QVERIFY(m_series);
+
+    //Scatter properties
+    QVERIFY(m_series->dataProxy());
+    QCOMPARE(m_series->itemSize(), 0.0f);
+    QCOMPARE(m_series->selectedItem(), m_series->invalidSelectionIndex());
+
+    // Common properties. The ones identical between different series are tested in QBar3DSeries tests
+    QCOMPARE(m_series->itemLabelFormat(), QString("@xLabel, @yLabel, @zLabel"));
+    QCOMPARE(m_series->mesh(), QAbstract3DSeries::Mesh::Sphere);
+    QCOMPARE(m_series->type(), QAbstract3DSeries::SeriesType::Scatter);
+
+    //Spline properties
+    QCOMPARE(m_series->isSplineVisible(), true);
+    QCOMPARE(m_series->isSplineLooping(), false);
+    QCOMPARE(m_series->splineTension(), 0.0f);
+    QCOMPARE(m_series->splineKnotting(), 0.5f);
+    QCOMPARE(m_series->splineColor(), QColor(255, 0, 0));
+    QCOMPARE(m_series->splineResolution(), 10);
+}
+
+void tst_series::initializeProperties()
+{
+    QVERIFY(m_series);
+
+    //Scatter properties
+    m_series->setDataProxy(new QScatterDataProxy());
+    m_series->setItemSize(0.5f);
+    m_series->setSelectedItem(0);
+
+    QCOMPARE(m_series->itemSize(), 0.5f);
+    QCOMPARE(m_series->selectedItem(), 0);
+
+    // Common properties. The ones identical between different series are tested in QBar3DSeries tests
+    m_series->setMesh(QAbstract3DSeries::Mesh::Point);
+    m_series->setMeshRotation(QQuaternion(1, 1, 10, 20));
+
+    QCOMPARE(m_series->mesh(), QAbstract3DSeries::Mesh::Point);
+    QCOMPARE(m_series->meshRotation(), QQuaternion(1, 1, 10, 20));
+
+    //spline properties
+    m_series->setSplineVisible(false);
+    m_series->setSplineLooping(true);
+    m_series->setSplineTension(1.0f);
+    m_series->setSplineKnotting(1.0f);
+    m_series->setSplineColor(QColor(0, 255, 0));
+    m_series->setSplineResolution(5);
+
+    QCOMPARE(m_series->isSplineVisible(), false);
+    QCOMPARE(m_series->isSplineLooping(), true);
+    QCOMPARE(m_series->splineTension(), 1.0f);
+    QCOMPARE(m_series->splineKnotting(), 1.0f);
+    QCOMPARE(m_series->splineColor(), QColor(0, 255, 0));
+    QCOMPARE(m_series->splineResolution(), 5);
+}
+
+QTEST_MAIN(tst_series)
+#include "tst_series.moc"
diff -pruN 6.8.2-4/tests/auto/cpptest/qgsurface/tst_surface.cpp 6.9.1-1/tests/auto/cpptest/qgsurface/tst_surface.cpp
--- 6.8.2-4/tests/auto/cpptest/qgsurface/tst_surface.cpp	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/tests/auto/cpptest/qgsurface/tst_surface.cpp	2025-05-29 02:19:47.000000000 +0000
@@ -107,6 +107,7 @@ void tst_surface::initialProperties()
     QCOMPARE(m_graph->margin(), -1.0);
     QCOMPARE(m_graph->labelMargin(), 0.1f);
     QCOMPARE(m_graph->cameraTargetPosition(), QVector3D(.0f, .0f, .0f));
+    QCOMPARE(m_graph->transparencyTechnique(), QtGraphs3D::TransparencyTechnique::Default);
 }
 
 void tst_surface::initializeProperties()
@@ -134,6 +135,7 @@ void tst_surface::initializeProperties()
     m_graph->setMargin(1.0);
     m_graph->setLabelMargin(1.0f);
     m_graph->setCameraTargetPosition(QVector3D(1.f, 1.f, 1.f));
+    m_graph->setTransparencyTechnique(QtGraphs3D::TransparencyTechnique::Accurate);
 
     QCOMPARE(m_graph->activeTheme()->theme(), QGraphsTheme::Theme::QtGreenNeon);
     QCOMPARE(m_graph->selectionMode(),
@@ -152,6 +154,7 @@ void tst_surface::initializeProperties()
     QCOMPARE(m_graph->margin(), 1.0);
     QCOMPARE(m_graph->labelMargin(), 1.0f);
     QCOMPARE(m_graph->cameraTargetPosition(), QVector3D(1.f, 1.f, 1.f));
+    QCOMPARE(m_graph->transparencyTechnique(), QtGraphs3D::TransparencyTechnique::Accurate);
 }
 
 void tst_surface::invalidProperties()
diff -pruN 6.8.2-4/tests/auto/qml2dtest/axes/tst_valueaxis.qml 6.9.1-1/tests/auto/qml2dtest/axes/tst_valueaxis.qml
--- 6.8.2-4/tests/auto/qml2dtest/axes/tst_valueaxis.qml	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/tests/auto/qml2dtest/axes/tst_valueaxis.qml	2025-05-29 02:19:47.000000000 +0000
@@ -44,6 +44,7 @@ Item {
         titleText: "Initialized"
         titleVisible: false
         visible: false
+        alignment: Qt.AlignLeft
     }
 
     TestCase {
@@ -75,6 +76,7 @@ Item {
             compare(initial.titleText, "")
             compare(initial.titleVisible, true)
             compare(initial.visible, true)
+            compare(initial.alignment, Qt.AlignBottom)
         }
 
         function test_3_initial_change() {
@@ -100,6 +102,7 @@ Item {
             initial.titleText = "Dummy"
             initial.titleVisible = false
             initial.visible = false
+            initial.alignment = Qt.AlignTop
 
             // Properties from ValueAxis
             compare(initial.labelDecimals, 1)
@@ -121,6 +124,7 @@ Item {
             compare(initial.titleText, "Dummy")
             compare(initial.titleVisible, false)
             compare(initial.visible, false)
+            compare(initial.alignment, Qt.AlignTop)
         }
     }
 
@@ -149,6 +153,7 @@ Item {
             compare(initialized.titleText, "Initialized")
             compare(initialized.titleVisible, false)
             compare(initialized.visible, false)
+            compare(initialized.alignment, Qt.AlignLeft)
         }
 
         function test_2_initialized_change() {
@@ -173,6 +178,7 @@ Item {
             initialized.titleText = "Dummy"
             initialized.titleVisible = true
             initialized.visible = true
+            initialized.alignment = Qt.AlignRight
 
             // Properties from ValueAxis
             compare(initialized.labelDecimals, 1)
@@ -183,6 +189,9 @@ Item {
             compare(initialized.tickAnchor, 2)
             compare(initialized.tickInterval, 3.0)
 
+            initialized.labelFormat = "%.1f test"
+            compare(initialized.labelFormat, "%.1f test")
+
             // Common properties from AbstractAxis
             compare(initialized.gridVisible, true)
             compare(initialized.labelsAngle, 45)
@@ -195,11 +204,12 @@ Item {
             compare(initialized.titleText, "Dummy")
             compare(initialized.titleVisible, true)
             compare(initialized.visible, true)
+            compare(initialized.alignment, Qt.AlignRight)
 
             // Signals
             compare(minSpy.count, 1)
             compare(maxSpy.count, 1)
-            compare(labelFormatSpy.count, 1)
+            compare(labelFormatSpy.count, 2)
             compare(labelDecimalsSpy.count, 1)
             compare(tickSpy.count, 1)
             compare(subTickSpy.count, 1)
@@ -217,6 +227,7 @@ Item {
             compare(titleColorSpy.count, 1)
             compare(titleVisibleSpy.count, 1)
             compare(titleFontSpy.count, 2)
+            compare(alignmentSpy.count, 1)
         }
 
         function test_3_initialized_change_to_invalid() {
@@ -337,5 +348,11 @@ Item {
             target: initialized
             signalName: "titleFontChanged"
         }
+
+        SignalSpy {
+            id: alignmentSpy
+            target: initialized
+            signalName: "alignmentChanged"
+        }
     }
 }
diff -pruN 6.8.2-4/tests/auto/qml2dtest/graphsview/tst_graphsview.qml 6.9.1-1/tests/auto/qml2dtest/graphsview/tst_graphsview.qml
--- 6.8.2-4/tests/auto/qml2dtest/graphsview/tst_graphsview.qml	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/tests/auto/qml2dtest/graphsview/tst_graphsview.qml	2025-05-29 02:19:47.000000000 +0000
@@ -84,9 +84,15 @@ Item {
             compare(initial.marginBottom, 20)
             compare(initial.marginLeft, 20)
             compare(initial.marginRight, 20)
+            compare(initial.plotArea.x, 0)
+            compare(initial.plotArea.y, 0)
+            compare(initial.plotArea.width, 0)
+            compare(initial.plotArea.height, 0)
             compare(initial.seriesList, [])
             compare(initial.axisX, null)
             compare(initial.axisY, null)
+            compare(initial.panStyle, GraphsView.PanStyle.None)
+            compare(initial.zoomStyle, GraphsView.ZoomStyle.None)
             // compare some of the contents of the initial theme, as theme itself cannot be
             compare(initial.theme.theme, GraphsTheme.Theme.QtGreen)
             compare(initial.theme.colorScheme, GraphsTheme.ColorScheme.Automatic)
@@ -103,6 +109,8 @@ Item {
             initial.theme = myTheme
             initial.axisX = axisX
             initial.axisY = axisY
+            initial.panStyle = GraphsView.PanStyle.Drag
+            initial.zoomStyle = GraphsView.ZoomStyle.Center
             initial.addSeries(barInitial)
 
             waitForRendering(top)
@@ -113,8 +121,14 @@ Item {
             compare(initial.marginBottom, 11)
             compare(initial.marginLeft, 12)
             compare(initial.marginRight, 13)
+            verify(initial.plotArea.x !== 0)
+            verify(initial.plotArea.y !== 0)
+            verify(initial.plotArea.width !== 0)
+            verify(initial.plotArea.height !== 0)
             compare(initial.axisX, axisX)
             compare(initial.axisY, axisY)
+            compare(initial.panStyle, GraphsView.PanStyle.Drag)
+            compare(initial.zoomStyle, GraphsView.ZoomStyle.Center)
             compare(initial.seriesList, [barInitial])
             compare(initial.theme, myTheme)
             compare(initial.theme.theme, GraphsTheme.Theme.QtGreenNeon)
diff -pruN 6.8.2-4/tests/auto/qmltest/axis3d/tst_category.qml 6.9.1-1/tests/auto/qmltest/axis3d/tst_category.qml
--- 6.8.2-4/tests/auto/qmltest/axis3d/tst_category.qml	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/tests/auto/qmltest/axis3d/tst_category.qml	2025-05-29 02:19:47.000000000 +0000
@@ -27,6 +27,8 @@ Item {
         titleVisible: true
         labelsVisible: false
         titleOffset: 1
+        scaleLabelsByCount: true
+        labelSize: 2
     }
 
     Category3DAxis {
@@ -53,6 +55,8 @@ Item {
             compare(initial.titleVisible, false)
             compare(initial.labelsVisible, true)
             compare(initial.titleOffset, 0)
+            compare(initial.scaleLabelsByCount, false)
+            compare(initial.labelSize, 1)
             compare(initial.type, Abstract3DAxis.AxisType.Category)
         }
     }
@@ -74,6 +78,8 @@ Item {
             compare(initialized.titleVisible, true)
             compare(change.labelsVisible, false)
             compare(initialized.titleOffset, 1)
+            compare(initialized.scaleLabelsByCount, true)
+            compare(initialized.labelSize, 2)
         }
     }
 
@@ -100,6 +106,8 @@ Item {
             change.titleVisible = true
             change.labelsVisible = false
             change.titleOffset = -1
+            change.scaleLabelsByCount = true
+            change.labelSize = 2
 
             compare(change.autoAdjustRange, false)
             compare(change.labelAutoAngle, 10.0)
@@ -110,6 +118,8 @@ Item {
             compare(change.titleVisible, true)
             compare(change.labelsVisible, false)
             compare(change.titleOffset, -1)
+            compare(change.scaleLabelsByCount, true)
+            compare(change.labelSize, 2)
         }
     }
 
diff -pruN 6.8.2-4/tests/auto/qmltest/bars3d/tst_barseries.qml 6.9.1-1/tests/auto/qmltest/bars3d/tst_barseries.qml
--- 6.8.2-4/tests/auto/qmltest/bars3d/tst_barseries.qml	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/tests/auto/qmltest/bars3d/tst_barseries.qml	2025-05-29 02:19:47.000000000 +0000
@@ -106,6 +106,7 @@ Item {
         userDefinedMesh: ":/customitem.mesh"
         visible: false
         rowColors: [rowColor1, rowColor2, rowColor3]
+        valueColoringEnabled: true
     }
 
     ItemModelBarDataProxy {
@@ -167,6 +168,7 @@ Item {
             compare(initial.type, Abstract3DSeries.SeriesType.Bar)
             compare(initial.userDefinedMesh, "")
             compare(initial.visible, true)
+            compare(initial.valueColoringEnabled, false)
         }
     }
 
@@ -197,6 +199,7 @@ Item {
             compare(initialized.singleHighlightGradient, gradient3)
             compare(initialized.userDefinedMesh, ":/customitem.mesh")
             compare(initialized.visible, false)
+            compare(initialized.valueColoringEnabled, true)
         }
     }
 
@@ -240,6 +243,7 @@ Item {
             change.singleHighlightGradient = gradient3
             change.userDefinedMesh = ":/customitem.mesh"
             change.visible = false
+            change.valueColoringEnabled = true
 
             compare(change.baseColor, "#0000ff")
             compare(change.baseGradient, gradient1)
@@ -255,6 +259,7 @@ Item {
             compare(change.singleHighlightGradient, gradient3)
             compare(change.userDefinedMesh, ":/customitem.mesh")
             compare(change.visible, false)
+            compare(change.valueColoringEnabled, true)
 
             compare(baseColorSpy.count, 1)
             compare(baseGradientSpy.count, 1)
diff -pruN 6.8.2-4/tests/auto/qmltest/bars3d/tst_basic.qml 6.9.1-1/tests/auto/qmltest/bars3d/tst_basic.qml
--- 6.8.2-4/tests/auto/qmltest/bars3d/tst_basic.qml	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/tests/auto/qmltest/bars3d/tst_basic.qml	2025-05-29 02:19:47.000000000 +0000
@@ -75,6 +75,10 @@ Item {
                                          ambientLightStrength: 0.5
                                          lightStrength: 10.0
                                          shadowStrength: 50.0
+                                         minCameraXRotation: 0.0
+                                         maxCameraXRotation: 90.0
+                                         minCameraYRotation: -90.0
+                                         maxCameraYRotation: 0.0
                                          }`, top)
         common_init.anchors.fill = top
     }
@@ -185,6 +189,10 @@ Item {
             compare(top.common.ambientLightStrength, 0.25, "ambientLightStrength")
             compare(top.common.lightStrength, 5.0, "lightStrength")
             compare(top.common.shadowStrength, 25.0, "shadowStrength")
+            compare(top.common.minCameraXRotation, -180.0, "minCameraXRotation")
+            compare(top.common.maxCameraXRotation, 180.0, "maxCameraXRotation")
+            compare(top.common.minCameraYRotation, 0.0, "minCameraYRotation")
+            compare(top.common.maxCameraYRotation, 90.0, "maxCameraYRotation")
             compare(top.common.cameraTargetPosition, Qt.vector3d(0, 0, 0),
                     "cameraTargetPosition")
         }
@@ -213,6 +221,10 @@ Item {
             top.common.ambientLightStrength = 0.5
             top.common.lightStrength = 10.0
             top.common.shadowStrength = 50.0
+            top.common.minCameraXRotation = 0
+            top.common.maxCameraXRotation = 90
+            top.common.minCameraYRotation = -90
+            top.common.maxCameraYRotation = 0
             top.common.cameraTargetPosition = Qt.vector3d(1.0, 0.0, -1.0)
             compare(top.common.selectionMode,
                     Graphs3D.SelectionFlag.Item | Graphs3D.SelectionFlag.Row
@@ -238,6 +250,10 @@ Item {
             compare(top.common.ambientLightStrength, 0.5, "ambientLightStrength")
             compare(top.common.lightStrength, 10.0, "lightStrength")
             compare(top.common.shadowStrength, 50.0, "shadowStrength")
+            compare(top.common.minCameraXRotation, 0.0, "minCameraXRotation")
+            compare(top.common.maxCameraXRotation, 90.0, "maxCameraXRotation")
+            compare(top.common.minCameraYRotation, -90.0, "minCameraYRotation")
+            compare(top.common.maxCameraYRotation, 0.0, "maxCameraYRotation")
             compare(top.common.cameraTargetPosition, Qt.vector3d(1.0, 0.0, -1.0),
                     "cameraTargetPosition")
         }
@@ -309,6 +325,10 @@ Item {
                     "ambientLightStrength")
             compare(top.common_init.lightStrength, 10.0, "lightStrength")
             compare(top.common_init.shadowStrength, 50.0, "shadowStrength")
+            compare(top.common_init.minCameraXRotation, 0.0, "minCameraXRotation")
+            compare(top.common_init.maxCameraXRotation, 90.0, "maxCameraXRotation")
+            compare(top.common_init.minCameraYRotation, -90.0, "minCameraYRotation")
+            compare(top.common_init.maxCameraYRotation, 0.0, "maxCameraYRotation")
         }
     }
 }
diff -pruN 6.8.2-4/tests/auto/qmltest/scatter3d/tst_basic.qml 6.9.1-1/tests/auto/qmltest/scatter3d/tst_basic.qml
--- 6.8.2-4/tests/auto/qmltest/scatter3d/tst_basic.qml	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/tests/auto/qmltest/scatter3d/tst_basic.qml	2025-05-29 02:19:47.000000000 +0000
@@ -227,6 +227,7 @@ Item {
             compare(top.common.shadowStrength, 25.0, "shadowStrength")
             top.common.shadowStrength = -1.0
             compare(top.common.shadowStrength, 25.0, "shadowStrength")
+
             top.common.cameraTargetPosition = Qt.vector3d(2.0, 2.0, -2.0)
             compare(top.common.cameraTargetPosition, Qt.vector3d(1.0, 1.0, -1.0),
                     "cameraTargetPosition")
diff -pruN 6.8.2-4/tests/auto/qmltest/scatter3d/tst_scatterseries.qml 6.9.1-1/tests/auto/qmltest/scatter3d/tst_scatterseries.qml
--- 6.8.2-4/tests/auto/qmltest/scatter3d/tst_scatterseries.qml	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/tests/auto/qmltest/scatter3d/tst_scatterseries.qml	2025-05-29 02:19:47.000000000 +0000
@@ -167,7 +167,7 @@ Item {
 
             // Signals
             compare(itemSizeSpy.count, 1)
-            compare(selectedItemSpy.count, 1)
+            compare(selectedItemSpy.count, 0)
             compare(dataProxySpy.count, 1)
         }
 
@@ -247,7 +247,7 @@ Item {
     SignalSpy {
         id: selectedItemSpy
         target: change
-        signalName: "selectedItemChanged"
+        signalName: "selectedItemsChanged"
     }
 
     SignalSpy {
diff -pruN 6.8.2-4/tests/auto/qmltest/scatter3d/tst_splineseries.qml 6.9.1-1/tests/auto/qmltest/scatter3d/tst_splineseries.qml
--- 6.8.2-4/tests/auto/qmltest/scatter3d/tst_splineseries.qml	1970-01-01 00:00:00.000000000 +0000
+++ 6.9.1-1/tests/auto/qmltest/scatter3d/tst_splineseries.qml	2025-05-29 02:19:47.000000000 +0000
@@ -0,0 +1,265 @@
+// Copyright (C) 2024 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+import QtQuick 2.0
+import QtGraphs
+import QtTest 1.0
+
+Item {
+    id: top
+    height: 150
+    width: 150
+
+    Spline3DSeries {
+        id: initial
+    }
+
+    Gradient {
+        id: gradient1;
+        stops: [
+            GradientStop { color: "red"; position: 0 },
+            GradientStop { color: "blue"; position: 1 }
+        ]
+    }
+
+    Gradient {
+        id: gradient2;
+        stops: [
+            GradientStop { color: "green"; position: 0 },
+            GradientStop { color: "red"; position: 1 }
+        ]
+    }
+
+    Gradient {
+        id: gradient3;
+        stops: [
+            GradientStop { color: "gray"; position: 0 },
+            GradientStop { color: "darkgray"; position: 1 }
+        ]
+    }
+
+    Spline3DSeries {
+        id: initialized
+        dataProxy: ItemModelScatterDataProxy {
+            itemModel: ListModel {
+                ListElement{ xPos: "2.754"; yPos: "1.455"; zPos: "3.362"; }
+                ListElement{ xPos: "3.164"; yPos: "2.022"; zPos: "4.348"; }
+            }
+            xPosRole: "xPos"
+            yPosRole: "yPos"
+            zPosRole: "zPos"
+        }
+        itemSize: 0.5
+        selectedItem: 0
+
+        baseColor: "blue"
+        baseGradient: gradient1
+        colorStyle: GraphsTheme.ColorStyle.ObjectGradient
+        itemLabelFormat: "%f"
+        itemLabelVisible: false
+        mesh: Abstract3DSeries.Mesh.Minimal
+        meshRotation: Qt.quaternion(1, 1, 1, 1)
+        meshSmooth: true
+        multiHighlightColor: "green"
+        multiHighlightGradient: gradient2
+        name: "series1"
+        singleHighlightColor: "red"
+        singleHighlightGradient: gradient3
+        userDefinedMesh: ":/customitem.obj"
+        visible: false
+
+        //spline properties
+        splineVisible: false
+        splineLooping: true
+        splineTension: 1.0
+        splineKnotting: 1.0
+        splineColor: "blue"
+        splineResolution: 5
+    }
+
+    ItemModelScatterDataProxy {
+        id: proxy1
+        itemModel: ListModel {
+            ListElement{ xPos: "2.754"; yPos: "1.455"; zPos: "3.362"; }
+            ListElement{ xPos: "3.164"; yPos: "2.022"; zPos: "4.348"; }
+            ListElement{ xPos: "4.564"; yPos: "1.865"; zPos: "1.346"; }
+        }
+        xPosRole: "xPos"
+        yPosRole: "yPos"
+        zPosRole: "zPos"
+    }
+
+    Spline3DSeries {
+        id: change
+        dataProxy: proxy1
+    }
+
+    Spline3DSeries {
+        id: invalid
+    }
+
+    TestCase {
+        name: "Spline3DSeries Initial"
+
+        function test_1_initial() {
+            compare(initial.dataProxy.itemCount, 0)
+            compare(initial.invalidSelectionIndex, -1)
+            compare(initial.itemSize, 0.0)
+            compare(initial.selectedItem, -1)
+
+            //Spline properties
+            compare(initial.splineVisible, true)
+            compare(initial.splineLooping, false)
+            compare(initial.splineTension, 0.0)
+            compare(initial.splineKnotting, 0.5)
+            compare(initial.splineColor, "#ff0000")
+            compare(initial.splineResolution, 10)
+        }
+
+        function test_2_initial_common() {
+            // Common properties
+            compare(initial.baseColor, "#000000")
+            verify(!initial.baseGradient)
+            compare(initial.colorStyle, GraphsTheme.ColorStyle.Uniform)
+            compare(initial.itemLabel, "")
+            compare(initial.itemLabelFormat, "@xLabel, @yLabel, @zLabel")
+            compare(initial.itemLabelVisible, true)
+            compare(initial.mesh, Abstract3DSeries.Mesh.Sphere)
+            compare(initial.meshRotation, Qt.quaternion(1, 0, 0, 0))
+            compare(initial.meshSmooth, false)
+            compare(initial.multiHighlightColor, "#000000")
+            verify(!initial.multiHighlightGradient)
+            compare(initial.name, "")
+            compare(initial.singleHighlightColor, "#000000")
+            verify(!initial.singleHighlightGradient)
+            compare(initial.type, Abstract3DSeries.SeriesType.Scatter)
+            compare(initial.userDefinedMesh, "")
+            compare(initial.visible, true)
+        }
+    }
+
+    TestCase {
+        name: "Spline3DSeries Initialized"
+
+        function test_1_initialized() {
+            compare(initialized.dataProxy.itemCount, 2)
+            compare(initialized.itemSize, 0.5)
+            compare(initialized.selectedItem, 0)
+
+            //spline properties
+            compare(initialized.splineVisible, false)
+            compare(initialized.splineLooping, true)
+            compare(initialized.splineTension, 1.0)
+            compare(initialized.splineKnotting, 1.0)
+            compare(initialized.splineColor, "#0000ff")
+            compare(initialized.splineResolution, 5)
+        }
+
+        function test_2_initialized_common() {
+            // Common properties
+            compare(initialized.baseColor, "#0000ff")
+            compare(initialized.baseGradient, gradient1)
+            compare(initialized.colorStyle, GraphsTheme.ColorStyle.ObjectGradient)
+            compare(initialized.itemLabelFormat, "%f")
+            compare(initialized.itemLabelVisible, false)
+            compare(initialized.mesh, Abstract3DSeries.Mesh.Minimal)
+            compare(initialized.meshRotation, Qt.quaternion(1, 1, 1, 1))
+            compare(initialized.meshSmooth, true)
+            compare(initialized.multiHighlightColor, "#008000")
+            compare(initialized.multiHighlightGradient, gradient2)
+            compare(initialized.name, "series1")
+            compare(initialized.singleHighlightColor, "#ff0000")
+            compare(initialized.singleHighlightGradient, gradient3)
+            compare(initialized.userDefinedMesh, ":/customitem.obj")
+            compare(initialized.visible, false)
+        }
+    }
+
+    TestCase {
+        name: "Spline3DSeries Change"
+
+        function test_1_change() {
+            change.itemSize = 0.5
+            change.selectedItem = 0
+
+            //spline properties
+            change.splineVisible = false
+            change.splineLooping = true
+            change.splineTension = 1.0
+            change.splineKnotting = 1.0
+            change.splineColor = "green"
+            change.splineResolution = 15
+        }
+
+        function test_2_test_change() {
+            // This test has a dependency to the previous one due to asynchronous item model resolving
+            compare(change.dataProxy.itemCount, 3)
+            compare(change.itemSize, 0.5)
+            compare(change.selectedItem, 0)
+
+            //spline properties
+            compare(change.splineVisible, false)
+            compare(change.splineLooping, true)
+            compare(change.splineTension, 1.0)
+            compare(change.splineKnotting, 1.0)
+            compare(change.splineColor, "#008000")
+            compare(change.splineResolution, 15)
+        }
+
+        function test_3_change_common() {
+            change.baseColor = "blue"
+            change.baseGradient = gradient1
+            change.colorStyle = GraphsTheme.ColorStyle.ObjectGradient
+            change.itemLabelFormat = "%f"
+            change.itemLabelVisible = false
+            change.mesh = Abstract3DSeries.Mesh.Minimal
+            change.meshRotation = Qt.quaternion(1, 1, 1, 1)
+            change.meshSmooth = true
+            change.multiHighlightColor = "green"
+            change.multiHighlightGradient = gradient2
+            change.name = "series1"
+            change.singleHighlightColor = "red"
+            change.singleHighlightGradient = gradient3
+            change.userDefinedMesh = ":/customitem.obj"
+            change.visible = false
+
+            compare(change.baseColor, "#0000ff")
+            compare(change.baseGradient, gradient1)
+            compare(change.colorStyle, GraphsTheme.ColorStyle.ObjectGradient)
+            compare(change.itemLabelFormat, "%f")
+            compare(change.itemLabelVisible, false)
+            compare(change.mesh, Abstract3DSeries.Mesh.Minimal)
+            compare(change.meshRotation, Qt.quaternion(1, 1, 1, 1))
+            compare(change.meshSmooth, true)
+            compare(change.multiHighlightColor, "#008000")
+            compare(change.multiHighlightGradient, gradient2)
+            compare(change.name, "series1")
+            compare(change.singleHighlightColor, "#ff0000")
+            compare(change.singleHighlightGradient, gradient3)
+            compare(change.userDefinedMesh, ":/customitem.obj")
+            compare(change.visible, false)
+        }
+
+        function test_4_change_gradient_stop() {
+            gradient1.stops[0].color = "yellow"
+            compare(change.baseGradient.stops[0].color, "#ffff00")
+        }
+    }
+    TestCase {
+        name: "Spline3DSeries Invalid"
+
+        function test_invalid() {
+            invalid.itemSize = -1.0
+            compare(invalid.itemSize, 0.0)
+            invalid.itemSize = 1.1
+            compare(invalid.itemSize, 0.0)
+
+            invalid.splineTension = -1.0
+            compare(invalid.splineTension, 0.0)
+            invalid.splineKnotting = -1.0
+            compare(invalid.splineKnotting, 0.5)
+            invalid.splineResolution = 1
+            compare(invalid.splineResolution, 10)
+        }
+    }
+}
diff -pruN 6.8.2-4/tests/auto/qmltest/surface3d/tst_basic.qml 6.9.1-1/tests/auto/qmltest/surface3d/tst_basic.qml
--- 6.8.2-4/tests/auto/qmltest/surface3d/tst_basic.qml	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/tests/auto/qmltest/surface3d/tst_basic.qml	2025-05-29 02:19:47.000000000 +0000
@@ -68,6 +68,7 @@ Item {
                                          ambientLightStrength: 0.5
                                          lightStrength: 10.0
                                          shadowStrength: 50.0
+                                         transparencyTechnique: Graphs3D.TransparencyTechnique.Accurate
                                          }`, top)
         top.common_init.anchors.fill = top
     }
@@ -145,6 +146,8 @@ Item {
             compare(top.common.ambientLightStrength, 0.25, "ambientLightStrength")
             compare(top.common.lightStrength, 5.0, "lightStrength")
             compare(top.common.shadowStrength, 25.0, "shadowStrength")
+            compare(top.common.transparencyTechnique, Graphs3D.TransparencyTechnique.Default,
+                    "transparencyTechnique")
         }
 
         function test_2_change_common() {
@@ -172,6 +175,7 @@ Item {
             top.common.ambientLightStrength = 0.5
             top.common.lightStrength = 10.0
             top.common.shadowStrength = 50.0
+            top.common.transparencyTechnique = Graphs3D.TransparencyTechnique.Accurate
             compare(top.common.selectionMode,
                     Graphs3D.SelectionFlag.Item | Graphs3D.SelectionFlag.Row
                     | Graphs3D.SelectionFlag.Slice, "selectionMode")
@@ -195,6 +199,8 @@ Item {
             compare(top.common.ambientLightStrength, 0.5, "ambientLightStrength")
             compare(top.common.lightStrength, 10.0, "lightStrength")
             compare(top.common.shadowStrength, 50.0, "shadowStrength")
+            compare(top.common.transparencyTechnique, Graphs3D.TransparencyTechnique.Accurate,
+                    "transparencyTechnique")
         }
 
         function test_3_change_invalid_common() {
@@ -260,6 +266,8 @@ Item {
                     "ambientLightStrength")
             compare(top.common_init.lightStrength, 10.0, "lightStrength")
             compare(top.common_init.shadowStrength, 50.0, "shadowStrength")
+            compare(top.common_init.transparencyTechnique, Graphs3D.TransparencyTechnique.Accurate,
+                    "transparencyTechnique")
         }
     }
 }
diff -pruN 6.8.2-4/tests/baseline/CMakeLists.txt 6.9.1-1/tests/baseline/CMakeLists.txt
--- 6.8.2-4/tests/baseline/CMakeLists.txt	1970-01-01 00:00:00.000000000 +0000
+++ 6.9.1-1/tests/baseline/CMakeLists.txt	2025-05-29 02:19:47.000000000 +0000
@@ -0,0 +1,16 @@
+# Copyright (C) 2024 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
+if(NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT)
+    cmake_minimum_required(VERSION 3.16)
+    project(tst_qgraphs LANGUAGES CXX)
+    find_package(Qt6BuildInternals REQUIRED COMPONENTS STANDALONE_TEST)
+endif()
+
+# Special case: test includes the QBaselineTest module sources from qtbase directly
+if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/../../../qtbase/tests/baseline/shared")
+    add_subdirectory(scenegrabber)
+    if (QT_FEATURE_process)
+        add_subdirectory(graphs)
+    endif()
+endif()
diff -pruN 6.8.2-4/tests/baseline/data/graphs/2d/MultiGraph.qml 6.9.1-1/tests/baseline/data/graphs/2d/MultiGraph.qml
--- 6.8.2-4/tests/baseline/data/graphs/2d/MultiGraph.qml	1970-01-01 00:00:00.000000000 +0000
+++ 6.9.1-1/tests/baseline/data/graphs/2d/MultiGraph.qml	2025-05-29 02:19:47.000000000 +0000
@@ -0,0 +1,67 @@
+import QtQuick
+import QtGraphs
+
+Rectangle {
+    width: 800
+    height: 600
+
+    GraphsView {
+        theme: GraphsTheme {
+            colorScheme: GraphsTheme.ColorScheme.Dark
+            theme: GraphsTheme.Theme.MixSeries
+        }
+
+        anchors.fill: parent
+        axisX: BarCategoryAxis { categories: ["2023", "2024", "2025", "2026"] }
+        axisY: ValueAxis { max: 8 }
+
+        BarSeries {
+            seriesColors: ["#d0d040", "#d04040"]
+            borderColors: ["#808020", "#802020"]
+            BarSet { id: set1; label: "Axel"; values: [1, 2, 3, 4] }
+            BarSet { id: set2; label: "Bob"; values: [4, 3, 2, 1] }
+        }
+
+        LineSeries {
+            XYPoint { x: 0; y: 6.6 }
+            XYPoint { x: 0.6; y: 4.1 }
+            XYPoint { x: 1.5; y: 5.3 }
+            XYPoint { x: 2.2; y: 7.1 }
+            XYPoint { x: 3.3; y: 6.9 }
+            XYPoint { x: 3.6; y: 5.0 }
+            XYPoint { x: 4.0; y: 5.3 }
+        }
+
+        ScatterSeries {
+            XYPoint { x: 0; y: 2.6 }
+            XYPoint { x: 0.2; y: 3.1 }
+            XYPoint { x: 1.3; y: 6.3 }
+            XYPoint { x: 2.4; y: 5.1 }
+            XYPoint { x: 3.5; y: 6.9 }
+            XYPoint { x: 3.6; y: 5.2 }
+            XYPoint { x: 4.0; y: 3.3 }
+        }
+
+        AreaSeries {
+            upperSeries: LineSeries {
+                XYPoint { x: 1; y: 5 }
+                XYPoint { x: 1.25; y: 6 }
+                XYPoint { x: 1.75; y: 5.5 }
+                XYPoint { x: 2; y: 6 }
+                XYPoint { x: 2.375; y: 5.5 }
+                XYPoint { x: 2.875; y: 6 }
+                XYPoint { x: 3.375; y: 5 }
+            }
+
+            lowerSeries: LineSeries {
+                XYPoint { x: 1; y: 4 }
+                XYPoint { x: 1.25; y: 4.5 }
+                XYPoint { x: 1.75; y: 4 }
+                XYPoint { x: 1.875; y: 3.5 }
+                XYPoint { x: 2.375; y: 4 }
+                XYPoint { x: 3; y: 4.5 }
+                XYPoint { x: 3.375; y: 4 }
+            }
+        }
+    }
+}
diff -pruN 6.8.2-4/tests/baseline/data/graphs/3d/DefaultBars3D.qml 6.9.1-1/tests/baseline/data/graphs/3d/DefaultBars3D.qml
--- 6.8.2-4/tests/baseline/data/graphs/3d/DefaultBars3D.qml	1970-01-01 00:00:00.000000000 +0000
+++ 6.9.1-1/tests/baseline/data/graphs/3d/DefaultBars3D.qml	2025-05-29 02:19:47.000000000 +0000
@@ -0,0 +1,76 @@
+import QtGraphs
+import QtQuick
+import QtQuick3D
+
+Rectangle {
+    width: 800
+    height: 480
+    color: Qt.rgba(0, 0, 0, 1)
+
+    ListModel {
+        id: dataModel
+        ListElement{ timestamp: "2020-01"; expenses: "-14"; income: "22"  }
+        ListElement{ timestamp: "2020-02"; expenses: "-5";  income: "7"  }
+        ListElement{ timestamp: "2020-03"; expenses: "-1";  income: "9"  }
+        ListElement{ timestamp: "2020-04"; expenses: "-1";  income: "12"  }
+        ListElement{ timestamp: "2020-05"; expenses: "-5";  income: "9"  }
+        ListElement{ timestamp: "2020-06"; expenses: "-5";  income: "8"  }
+        ListElement{ timestamp: "2020-07"; expenses: "-3";  income: "7"  }
+        ListElement{ timestamp: "2020-08"; expenses: "-1";  income: "5"  }
+        ListElement{ timestamp: "2020-09"; expenses: "-2";  income: "4"  }
+        ListElement{ timestamp: "2020-10"; expenses: "-10"; income: "13"  }
+        ListElement{ timestamp: "2020-11"; expenses: "-12"; income: "17"  }
+        ListElement{ timestamp: "2020-12"; expenses: "-6";  income: "9"  }
+
+        ListElement{ timestamp: "2021-01"; expenses: "-2";  income: "6"  }
+        ListElement{ timestamp: "2021-02"; expenses: "-4";  income: "8"  }
+        ListElement{ timestamp: "2021-03"; expenses: "-7";  income: "12"  }
+        ListElement{ timestamp: "2021-04"; expenses: "-9";  income: "15"  }
+        ListElement{ timestamp: "2021-05"; expenses: "-7";  income: "19"  }
+        ListElement{ timestamp: "2021-06"; expenses: "-9";  income: "18"  }
+        ListElement{ timestamp: "2021-07"; expenses: "-13"; income: "17"  }
+        ListElement{ timestamp: "2021-08"; expenses: "-5";  income: "9"  }
+        ListElement{ timestamp: "2021-09"; expenses: "-3";  income: "8"  }
+        ListElement{ timestamp: "2021-10"; expenses: "-13"; income: "15"  }
+        ListElement{ timestamp: "2021-11"; expenses: "-8";  income: "17"  }
+        ListElement{ timestamp: "2021-12"; expenses: "-7";  income: "10"  }
+
+        ListElement{ timestamp: "2022-01"; expenses: "-12";  income: "16"  }
+        ListElement{ timestamp: "2022-02"; expenses: "-24";  income: "28"  }
+        ListElement{ timestamp: "2022-03"; expenses: "-27";  income: "22"  }
+        ListElement{ timestamp: "2022-04"; expenses: "-29";  income: "25"  }
+        ListElement{ timestamp: "2022-05"; expenses: "-27";  income: "29"  }
+        ListElement{ timestamp: "2022-06"; expenses: "-19";  income: "18"  }
+        ListElement{ timestamp: "2022-07"; expenses: "-13";  income: "17"  }
+        ListElement{ timestamp: "2022-08"; expenses: "-15";  income: "19"  }
+        ListElement{ timestamp: "2022-09"; expenses: "-3";   income: "8"  }
+        ListElement{ timestamp: "2022-10"; expenses: "-3";   income: "6"  }
+        ListElement{ timestamp: "2022-11"; expenses: "-4";   income: "8"  }
+        ListElement{ timestamp: "2022-12"; expenses: "-5";   income: "9"  }
+    }
+
+    Bars3D {
+        theme: GraphsTheme {
+            colorScheme: GraphsTheme.ColorScheme.Dark
+            theme: GraphsTheme.Theme.MixSeries
+        }
+
+        anchors.fill: parent
+        cameraPreset: Graphs3D.CameraPreset.Front
+        environment: SceneEnvironment {}
+
+        Bar3DSeries {
+            ItemModelBarDataProxy {
+                itemModel: dataModel
+                rowRole: "timestamp"
+                columnRole: "timestamp"
+                valueRole: "income"
+                rowRolePattern: /^(\d\d\d\d).*$/
+                columnRolePattern: /^.*-(\d\d)$/
+                rowRoleReplace: "\\1"
+                columnRoleReplace: "\\1"
+                multiMatchBehavior: ItemModelBarDataProxy.MultiMatchBehavior.Cumulative
+            }
+        }
+    }
+}
diff -pruN 6.8.2-4/tests/baseline/data/graphs/3d/DefaultScatter3D.qml 6.9.1-1/tests/baseline/data/graphs/3d/DefaultScatter3D.qml
--- 6.8.2-4/tests/baseline/data/graphs/3d/DefaultScatter3D.qml	1970-01-01 00:00:00.000000000 +0000
+++ 6.9.1-1/tests/baseline/data/graphs/3d/DefaultScatter3D.qml	2025-05-29 02:19:47.000000000 +0000
@@ -0,0 +1,56 @@
+import QtGraphs
+import QtQuick
+import QtQuick3D
+
+Rectangle {
+    width: 800
+    height: 480
+    color: Qt.rgba(0, 0, 0, 1)
+
+    ListModel {
+        id: dataModel
+        ListElement{ xPos: -10.0; yPos: 5.0; zPos: -5.0 }
+        ListElement{ xPos: -9.0; yPos: 3.0; zPos: -4.5 }
+        ListElement{ xPos: -8.5; yPos: 4.1; zPos: -4.0 }
+        ListElement{ xPos: -8.0; yPos: 4.75; zPos: -3.9 }
+        ListElement{ xPos: -9.5; yPos: 4.9; zPos: -4.2 }
+        ListElement{ xPos: -9.9; yPos: 3.42; zPos: -3.5 }
+        ListElement{ xPos: -7.8; yPos: 3.1; zPos: -4.9 }
+        ListElement{ xPos: -7.3; yPos: 2.91; zPos: -4.1 }
+        ListElement{ xPos: -7.1 ; yPos: 3.68 ; zPos: -4.52 }
+        ListElement{ xPos: -8.8 ; yPos: 2.96 ; zPos: -3.6 }
+        ListElement{ xPos: -6.94 ; yPos: 2.4 ; zPos: -2.92 }
+        ListElement{ xPos: -9.02 ; yPos: 4.74 ; zPos: -4.18 }
+        ListElement{ xPos: -9.54 ; yPos: 3.1 ; zPos: -3.8 }
+        ListElement{ xPos: -6.86 ; yPos: 3.66 ; zPos: -3.58 }
+        ListElement{ xPos: -8.16 ; yPos: 1.82 ; zPos: -4.64 }
+        ListElement{ xPos: -7.4 ; yPos: 3.18 ; zPos: -4.22 }
+        ListElement{ xPos: -7.9 ; yPos: 3.06 ; zPos: -4.3 }
+        ListElement{ xPos: -8.98 ; yPos: 2.64 ; zPos: -4.44 }
+        ListElement{ xPos: -6.36 ; yPos: 3.96 ; zPos: -4.38 }
+        ListElement{ xPos: -7.18 ; yPos: 3.32 ; zPos: -4.04 }
+        ListElement{ xPos: -7.9 ; yPos: 3.4 ; zPos: -2.78 }
+        ListElement{ xPos: -7.4 ; yPos: 3.12 ; zPos: -3.1 }
+        ListElement{ xPos: -7.54 ; yPos: 2.8 ; zPos: -3.68 }
+    }
+
+    Scatter3D {
+        theme: GraphsTheme {
+            colorScheme: GraphsTheme.ColorScheme.Dark
+            theme: GraphsTheme.Theme.MixSeries
+        }
+
+        anchors.fill: parent
+        cameraPreset: Graphs3D.CameraPreset.Front
+        environment: SceneEnvironment {}
+
+        Scatter3DSeries {
+            ItemModelScatterDataProxy {
+                itemModel: dataModel
+                xPosRole: "xPos"
+                yPosRole: "yPos"
+                zPosRole: "zPos"
+            }
+        }
+    }
+}
diff -pruN 6.8.2-4/tests/baseline/data/graphs/3d/DefaultSurface3D.qml 6.9.1-1/tests/baseline/data/graphs/3d/DefaultSurface3D.qml
--- 6.8.2-4/tests/baseline/data/graphs/3d/DefaultSurface3D.qml	1970-01-01 00:00:00.000000000 +0000
+++ 6.9.1-1/tests/baseline/data/graphs/3d/DefaultSurface3D.qml	2025-05-29 02:19:47.000000000 +0000
@@ -0,0 +1,49 @@
+import QtGraphs
+import QtQuick
+import QtQuick3D
+
+Rectangle {
+    width: 800
+    height: 480
+    color: Qt.rgba(0, 0, 0, 1)
+
+    ListModel {
+        id: dataModel
+        ListElement{ xPos: 0; yPos: 0; zPos: 0 }
+        ListElement{ xPos: 1; yPos: -1; zPos: 0 }
+        ListElement{ xPos: 2; yPos: 0.2; zPos: 0 }
+        ListElement{ xPos: 3; yPos: -0.2; zPos: 0 }
+        ListElement{ xPos: 0; yPos: 0.1; zPos: 1 }
+        ListElement{ xPos: 1; yPos: -0.2; zPos: 1 }
+        ListElement{ xPos: 2; yPos: -0.1; zPos: 1 }
+        ListElement{ xPos: 3; yPos: 0; zPos: 1 }
+        ListElement{ xPos: 0; yPos: 0.2; zPos: 2 }
+        ListElement{ xPos: 1; yPos: 0.1; zPos: 2 }
+        ListElement{ xPos: 2; yPos: 0; zPos: 2 }
+        ListElement{ xPos: 3; yPos: 0.1; zPos: 2 }
+        ListElement{ xPos: 0; yPos: -0.1; zPos: 3 }
+        ListElement{ xPos: 1; yPos: -0.2; zPos: 3 }
+        ListElement{ xPos: 2; yPos: -0.1; zPos: 3 }
+        ListElement{ xPos: 3; yPos: 0.1; zPos: 3 }
+    }
+
+    Surface3D {
+        theme: GraphsTheme {
+            colorScheme: GraphsTheme.ColorScheme.Dark
+            theme: GraphsTheme.Theme.MixSeries
+        }
+
+        anchors.fill: parent
+        cameraPreset: Graphs3D.CameraPreset.IsometricLeftHigh
+        environment: SceneEnvironment {}
+
+        Surface3DSeries {
+            ItemModelSurfaceDataProxy {
+                itemModel: dataModel
+                columnRole: "xPos"
+                yPosRole: "yPos"
+                rowRole: "zPos"
+            }
+        }
+    }
+}
diff -pruN 6.8.2-4/tests/baseline/graphs/CMakeLists.txt 6.9.1-1/tests/baseline/graphs/CMakeLists.txt
--- 6.8.2-4/tests/baseline/graphs/CMakeLists.txt	1970-01-01 00:00:00.000000000 +0000
+++ 6.9.1-1/tests/baseline/graphs/CMakeLists.txt	2025-05-29 02:19:47.000000000 +0000
@@ -0,0 +1,28 @@
+# Copyright (C) 2024 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
+# Collect test data
+list(APPEND test_data "../data")
+set(BASELINE_DIR "../../../../qtbase/tests/baseline/shared")
+
+qt_internal_add_test(tst_baseline_graphs
+    OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/.." # special case
+    SOURCES
+        ${BASELINE_DIR}/baselineprotocol.cpp
+        ${BASELINE_DIR}/baselineprotocol.h
+        ${BASELINE_DIR}/lookup3.cpp
+        ${BASELINE_DIR}/qbaselinetest.cpp
+        ${BASELINE_DIR}/qbaselinetest.h
+        tst_baseline_graphs.cpp
+    DEFINES
+        QMAKESPEC=""
+    INCLUDE_DIRECTORIES
+        ${BASELINE_DIR}
+    LIBRARIES
+        Qt::Gui
+        Qt::Network
+    TESTDATA ${test_data}
+)
+
+add_dependencies(tst_baseline_graphs Qt6::Quick3D)
+add_dependencies(tst_baseline_graphs qgraphs_qmlscenegrabber)
diff -pruN 6.8.2-4/tests/baseline/graphs/tst_baseline_graphs.cpp 6.9.1-1/tests/baseline/graphs/tst_baseline_graphs.cpp
--- 6.8.2-4/tests/baseline/graphs/tst_baseline_graphs.cpp	1970-01-01 00:00:00.000000000 +0000
+++ 6.9.1-1/tests/baseline/graphs/tst_baseline_graphs.cpp	2025-05-29 02:19:47.000000000 +0000
@@ -0,0 +1,236 @@
+// Copyright (C) 2024 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#include <qbaselinetest.h>
+
+#include <QtCore/QCoreApplication>
+#include <QtCore/QDirIterator>
+#include <QtCore/QDebug>
+#include <QtCore/QProcess>
+#include <QtGui/QImage>
+
+#include <algorithm>
+
+// qmlscenegrabber's default timeout, in ms
+#define SCENE_TIMEOUT 6000
+
+class tst_Graphs : public QObject
+{
+    Q_OBJECT
+
+public:
+    tst_Graphs();
+
+private Q_SLOTS:
+    void initTestCase();
+    void cleanup();
+    void cleanupTestCase();
+    void testRendering_data();
+    void testRendering();
+
+private:
+    void setupTestSuite(const QByteArray& filter = QByteArray());
+    void runTest(const QStringList& extraArgs = QStringList());
+    bool renderAndGrab(const QString& qmlFile, const QStringList& extraArgs, QImage *screenshot, QString *errMsg);
+    quint16 checksumFileOrDir(const QString &path);
+
+    QString testSuitePath;
+    int grabberTimeout;
+    int consecutiveErrors;   // Not test failures (image mismatches), but system failures (so no image at all)
+    bool aborted;            // This run given up because of too many system failures
+};
+
+tst_Graphs::tst_Graphs()
+    : consecutiveErrors(0)
+    , aborted(false)
+{
+    int sceneTimeout = qEnvironmentVariableIntValue("LANCELOT_SCENE_TIMEOUT");
+    if (!sceneTimeout)
+        sceneTimeout = SCENE_TIMEOUT;
+    grabberTimeout = (sceneTimeout * 4) / 3; // Include some slack
+}
+
+void tst_Graphs::initTestCase()
+{
+    QString dataDir = QFINDTESTDATA("../data/.");
+    if (dataDir.isEmpty())
+        dataDir = QStringLiteral("data");
+    QFileInfo fi(dataDir);
+    if (!fi.exists() || !fi.isDir() || !fi.isReadable())
+        QSKIP("Test suite data directory missing or unreadable: " + fi.canonicalFilePath().toLatin1());
+    testSuitePath = fi.canonicalFilePath();
+
+#if defined(Q_OS_WIN)
+    const char *defaultRhiBackend = "d3d11";
+#elif defined(Q_OS_DARWIN)
+    const char *defaultRhiBackend = "metal";
+#else
+    const char *defaultRhiBackend = "opengl";
+#endif
+    const QString rhiBackend = qEnvironmentVariable("QSG_RHI_BACKEND", QString::fromLatin1(defaultRhiBackend));
+    const QString stack = QString::fromLatin1("RHI_%1").arg(rhiBackend);
+    QBaselineTest::addClientProperty(QString::fromLatin1("GraphicsStack"), stack);
+
+    QByteArray msg;
+    if (!QBaselineTest::connectToBaselineServer(&msg))
+        QSKIP(msg);
+}
+
+void tst_Graphs::cleanup()
+{
+    // Allow subsystems time to settle
+    if (!aborted)
+        QTest::qWait(grabberTimeout / 100);
+}
+
+void tst_Graphs::cleanupTestCase()
+{
+    QBaselineTest::finalizeAndDisconnect();
+}
+
+void tst_Graphs::testRendering_data()
+{
+    setupTestSuite();
+    consecutiveErrors = 0;
+    aborted = false;
+}
+
+void tst_Graphs::testRendering()
+{
+    runTest();
+}
+
+void tst_Graphs::setupTestSuite(const QByteArray &filter)
+{
+    QTest::addColumn<QString>("qmlFile");
+    int numItems = 0;
+
+    QStringList ignoreItems;
+    QFile ignoreFile(testSuitePath + "/Ignore");
+    if (ignoreFile.open(QIODevice::ReadOnly)) {
+        while (!ignoreFile.atEnd()) {
+            QByteArray line = ignoreFile.readLine().trimmed();
+            if (!line.isEmpty() && !line.startsWith('#'))
+                ignoreItems += line;
+        }
+    }
+
+    QStringList itemFiles;
+    QDirIterator it(testSuitePath, QDirIterator::Subdirectories);
+    while (it.hasNext()) {
+        QString fp = it.next();
+        if (fp.endsWith(".qml")) {
+            QString itemName = fp.mid(testSuitePath.length() + 1);
+            if (!ignoreItems.contains(itemName) && (filter.isEmpty() || !itemName.startsWith(filter)))
+                itemFiles.append(it.filePath());
+        }
+    }
+
+    std::sort(itemFiles.begin(), itemFiles.end());
+    for (const QString &filePath : std::as_const(itemFiles)) {
+        QByteArray itemName = filePath.mid(testSuitePath.length() + 1).toLatin1();
+        QBaselineTest::newRow(itemName, checksumFileOrDir(filePath)) << filePath;
+        numItems++;
+    }
+
+    if (!numItems)
+        QSKIP("No .qml test files found in " + testSuitePath.toLatin1());
+}
+
+void tst_Graphs::runTest(const QStringList &extraArgs)
+{
+    // qDebug() << "Rendering" << QTest::currentDataTag();
+
+    if (aborted)
+        QSKIP("System too unstable.");
+
+    QFETCH(QString, qmlFile);
+
+    QImage screenShot;
+    QString errorMessage;
+    if (renderAndGrab(qmlFile, extraArgs, &screenShot, &errorMessage)) {
+        consecutiveErrors = 0;
+    }
+    else {
+        if (++consecutiveErrors >= 3 && QBaselineTest::shouldAbortIfUnstable())
+            aborted = true;                   // Just give up if screen grabbing fails 3 times in a row
+        QFAIL(qPrintable("QuickView grabbing failed: " + errorMessage));
+    }
+
+    QBASELINE_TEST(screenShot);
+}
+
+bool tst_Graphs::renderAndGrab(const QString &qmlFile,
+                               const QStringList &extraArgs,
+                               QImage *screenshot,
+                               QString *errMsg)
+{
+    bool usePipe = true;  // Whether to transport the grabbed image using temp. file or pipe. TBD: cmdline option
+#if defined(Q_OS_WIN)
+    usePipe = false;
+#endif
+    QProcess grabber;
+    grabber.setProcessChannelMode(QProcess::ForwardedErrorChannel);
+    QString cmd = QCoreApplication::applicationDirPath() + "/qgraphs_qmlscenegrabber";
+    QStringList args = extraArgs;
+#if defined(Q_OS_WIN)
+    args << "-platform" << "windows:fontengine=freetype";
+#elif defined(Q_OS_DARWIN)
+    args << "-platform" << "cocoa:fontengine=freetype";
+#endif
+
+    QString tmpfile = usePipe ? QString("-") : QString("%1/qmlscenegrabber-%2-out.ppm")
+                                .arg(QDir::tempPath()).arg(QCoreApplication::applicationPid());
+    args << qmlFile << "-o" << tmpfile;
+    grabber.start(cmd, args, QIODevice::ReadOnly);
+    grabber.waitForFinished(grabberTimeout);
+    if (grabber.state() != QProcess::NotRunning) {
+        grabber.terminate();
+        grabber.waitForFinished(grabberTimeout / 4);
+    }
+    QImage img;
+    bool res = usePipe ? img.load(&grabber, "ppm") : img.load(tmpfile);
+    if (!res || img.isNull()) {
+        if (errMsg) {
+            QString s("Failed to grab screen. qmlscenegrabber exitcode: %1. Process error: %2.");
+            *errMsg = s.arg(grabber.exitCode()).arg(grabber.errorString());
+        }
+        if (!usePipe)
+            QFile::remove(tmpfile);
+        return false;
+    }
+    if (screenshot)
+        *screenshot = img;
+    if (!usePipe)
+        QFile::remove(tmpfile);
+    return true;
+}
+
+quint16 tst_Graphs::checksumFileOrDir(const QString &path)
+{
+    QFileInfo fi(path);
+    if (!fi.exists() || !fi.isReadable())
+        return 0;
+    if (fi.isFile()) {
+        QFile f(path);
+        bool isBinary = path.endsWith(".png") || path.endsWith(".jpg");
+        if (!f.open(isBinary ? QIODevice::ReadOnly : QIODevice::ReadOnly | QIODevice::Text))
+            qFatal("Could not open file %s", qPrintable(path));
+        QByteArray contents = f.readAll();
+        return qChecksum(contents);
+    }
+    if (fi.isDir()) {
+        static const QStringList nameFilters = QStringList() << "*.qml" << "*.cpp" << "*.png" << "*.jpg";
+        quint16 cs = 0;
+        const auto entryList = QDir(fi.filePath()).entryList(nameFilters,
+                                                             QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot);
+        for (const QString &item : entryList)
+            cs ^= checksumFileOrDir(path + QLatin1Char('/') + item);
+        return cs;
+    }
+    return 0;
+}
+
+QBASELINETEST_MAIN(tst_Graphs)
+
+#include "tst_baseline_graphs.moc"
diff -pruN 6.8.2-4/tests/baseline/scenegrabber/CMakeLists.txt 6.9.1-1/tests/baseline/scenegrabber/CMakeLists.txt
--- 6.8.2-4/tests/baseline/scenegrabber/CMakeLists.txt	1970-01-01 00:00:00.000000000 +0000
+++ 6.9.1-1/tests/baseline/scenegrabber/CMakeLists.txt	2025-05-29 02:19:47.000000000 +0000
@@ -0,0 +1,29 @@
+# Copyright (C) 2024 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
+qt_internal_add_executable(qgraphs_qmlscenegrabber
+    OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/.." # special case
+    SOURCES
+        main.cpp
+    LIBRARIES
+        Qt::Gui
+        Qt::Quick
+        Qt::Quick3D
+        Qt::CorePrivate
+)
+
+# Resources:
+qt_internal_add_resource(qgraphs_qmlscenegrabber "scenegrabber"
+    PREFIX
+        "/"
+    FILES
+        ${scenegrabber_resource_files}
+)
+
+# Turn it into a QML module which has no plugin (i.e. just a backing target)
+qt6_add_qml_module(qgraphs_qmlscenegrabber
+    URI "QtGraphs.Lancelot"
+    VERSION "${PROJECT_VERSION}"
+    NO_GENERATE_PLUGIN_SOURCE
+    RESOURCE_PREFIX "/"
+)
diff -pruN 6.8.2-4/tests/baseline/scenegrabber/main.cpp 6.9.1-1/tests/baseline/scenegrabber/main.cpp
--- 6.8.2-4/tests/baseline/scenegrabber/main.cpp	1970-01-01 00:00:00.000000000 +0000
+++ 6.9.1-1/tests/baseline/scenegrabber/main.cpp	2025-05-29 02:19:47.000000000 +0000
@@ -0,0 +1,220 @@
+// Copyright (C) 2024 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#include <QtCore/QTimer>
+#include <QtCore/QDebug>
+#include <QtCore/QFileInfo>
+#include <QtCore/QHashFunctions>
+#include <QtCore/private/qabstractanimation_p.h>
+#include <QtGui/QGuiApplication>
+#include <QtGui/QImage>
+#include <QtGui/QFontDatabase>
+
+#include <QtQuick/QQuickItem>
+#include <QtQuick/QQuickView>
+
+#include <QtQuick3D/qquick3d.h>
+
+#ifdef Q_OS_WIN
+#  include <fcntl.h>
+#  include <io.h>
+#endif // Q_OS_WIN
+
+// Timeout values:
+
+// A valid screen grab requires the scene to not change
+// for SCENE_STABLE_TIME ms
+#define SCENE_STABLE_TIME 200
+
+// Give up after SCENE_TIMEOUT ms
+#define SCENE_TIMEOUT     6000
+
+//#define GRABBERDEBUG
+
+static const QSize DefaultGrabSize(400, 400);
+
+class GrabbingView : public QQuickView
+{
+    Q_OBJECT
+
+public:
+    GrabbingView(const QString &outputFile)
+        : ofile(outputFile), grabNo(0), isGrabbing(false), initDone(false), justShow(outputFile.isEmpty())
+    {
+        if (justShow)
+            return;
+        grabTimer = new QTimer(this);
+        grabTimer->setSingleShot(true);
+        grabTimer->setInterval(SCENE_STABLE_TIME);
+        connect(grabTimer, SIGNAL(timeout()), SLOT(grab()));
+
+        connect(this, SIGNAL(afterRendering()), SLOT(startGrabbing()));
+
+        int sceneTimeout = qEnvironmentVariableIntValue("LANCELOT_SCENE_TIMEOUT");
+        if (!sceneTimeout)
+            sceneTimeout = SCENE_TIMEOUT;
+        QTimer::singleShot(sceneTimeout, this, SLOT(timedOut()));
+    }
+
+private slots:
+    void startGrabbing()
+    {
+        if (!initDone) {
+            initDone = true;
+            grabTimer->start();
+        }
+    }
+
+    void grab()
+    {
+        if (isGrabbing)
+            return;
+        isGrabbing = true;
+        grabNo++;
+#ifdef GRABBERDEBUG
+        printf("grab no. %i\n", grabNo);
+#endif
+        QImage img = grabWindow();
+        if (!img.isNull() && img == lastGrab) {
+            sceneStabilized();
+        } else {
+            lastGrab = img;
+            grabTimer->start();
+        }
+
+        isGrabbing = false;
+    }
+
+    void sceneStabilized()
+    {
+#ifdef GRABBERDEBUG
+        printf("...sceneStabilized IN\n");
+#endif
+        if (QGuiApplication::platformName() == QLatin1String("eglfs")) {
+            QSize grabSize = initialSize().isEmpty() ? DefaultGrabSize : initialSize();
+            lastGrab = lastGrab.copy(QRect(QPoint(0, 0), grabSize));
+        }
+
+        if (ofile == "-") {   // Write to stdout
+            QFile of;
+#ifdef Q_OS_WIN
+            // Make sure write to stdout doesn't do LF->CRLF
+            _setmode(_fileno(stdout), _O_BINARY);
+#endif // Q_OS_WIN
+            if (!of.open(1, QIODevice::WriteOnly) || !lastGrab.save(&of, "ppm")) {
+                qWarning() << "Error: failed to write grabbed image to stdout.";
+                QGuiApplication::exit(2);
+                return;
+            }
+        } else {
+            if (!lastGrab.save(ofile)) {
+                qWarning() << "Error: failed to store grabbed image to" << ofile;
+                QGuiApplication::exit(2);
+                return;
+            }
+        }
+        QGuiApplication::exit(0);
+#ifdef GRABBERDEBUG
+        printf("...sceneStabilized OUT\n");
+#endif
+    }
+
+    void timedOut()
+    {
+        qWarning() << "Error: timed out waiting for scene to stabilize." << grabNo << "grab(s) done. Last grab was" << (lastGrab.isNull() ? "invalid." : "valid.");
+        QGuiApplication::exit(3);
+    }
+
+private:
+    QImage lastGrab;
+    QTimer *grabTimer = nullptr;
+    QString ofile;
+    int grabNo;
+    bool isGrabbing;
+    bool initDone;
+    bool justShow;
+};
+
+
+int main(int argc, char *argv[])
+{
+    QHashSeed::setDeterministicGlobalSeed();
+
+    QGuiApplication a(argc, argv);
+    QFontDatabase::addApplicationFont(":/trim.ttf");
+    QFont commonFont("Trim");
+    commonFont.setHintingPreference(QFont::PreferNoHinting);
+    a.setFont(commonFont);
+
+    QUnifiedTimer::instance()->setConsistentTiming(true);
+
+    QSurfaceFormat::setDefaultFormat(QQuick3D::idealSurfaceFormat(4));
+
+    // Parse command line
+    QString ifile, ofile;
+    bool noText = false;
+    bool justShow = false;
+    QStringList args = a.arguments();
+    int i = 0;
+    bool argError = false;
+    while (++i < args.size()) {
+        QString arg = args.at(i);
+        if ((arg == "-o") && (i < args.size()-1)) {
+            ofile = args.at(++i);
+        }
+        else if (arg == "-notext") {
+            noText = true;
+        }
+        else if (arg == "--cache-distance-fields") {
+            ;
+        }
+        else if (arg == "-viewonly") {
+            justShow = true;
+        }
+        else if (ifile.isEmpty()) {
+            ifile = arg;
+        }
+        else {
+            argError = true;
+            break;
+        }
+    }
+    if (argError || ifile.isEmpty() || (ofile.isEmpty() && !justShow)) {
+        qWarning() << "Usage:" << args.at(0).toLatin1().constData() << "[-notext] <qml-infile> {-o <outfile or - for ppm on stdout>|-viewonly}";
+        return 1;
+    }
+
+    QFileInfo ifi(ifile);
+    if (!ifi.exists() || !ifi.isReadable() || !ifi.isFile()) {
+        qWarning() << args.at(0).toLatin1().constData() << " error: unreadable input file" << ifile;
+        return 1;
+    }
+    // End parsing
+
+    GrabbingView v(ofile);
+    v.setTextRenderType(QQuickWindow::QtTextRendering);
+
+    v.setSource(QUrl::fromLocalFile(ifile));
+
+    if (noText) {
+        const QList<QQuickItem*> items = v.rootObject()->findChildren<QQuickItem*>();
+        for (QQuickItem *item : items) {
+            if (QByteArray(item->metaObject()->className()).contains("Text"))
+                item->setVisible(false);
+        }
+    }
+
+    if (v.initialSize().isEmpty())
+        v.resize(DefaultGrabSize);
+
+    v.show();
+
+    int retVal = a.exec();
+#ifdef GRABBERDEBUG
+    printf("...retVal=%i\n", retVal);
+#endif
+
+    return retVal;
+}
+
+#include "main.moc"
diff -pruN 6.8.2-4/tests/manual/CMakeLists.txt 6.9.1-1/tests/manual/CMakeLists.txt
--- 6.8.2-4/tests/manual/CMakeLists.txt	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/tests/manual/CMakeLists.txt	2025-05-29 02:19:47.000000000 +0000
@@ -4,10 +4,15 @@
 # Graphs2D Tests
 if(QT_FEATURE_graphs_2d)
     if(TARGET Qt::Quick)
-        if(WIN32)
+        if(WIN32 AND QT_FEATURE_graphs_2d_bar AND QT_FEATURE_graphs_2d_scatter)
             add_subdirectory(qmlbarscatter)
         endif()
-        add_subdirectory(qmltestbed)
+        if(QT_FEATURE_graphs_2d_area AND QT_FEATURE_graphs_2d_bar AND QT_FEATURE_graphs_2d_donut_pie AND QT_FEATURE_graphs_2d_line AND QT_FEATURE_graphs_2d_scatter AND QT_FEATURE_graphs_2d_spline)
+            add_subdirectory(qmltestbed)
+        endif()
+        if(QT_FEATURE_graphs_2d_area AND QT_FEATURE_graphs_2d_bar AND QT_FEATURE_graphs_2d_line)
+            add_subdirectory(qmlbenchmark2d)
+        endif()
     endif()
 endif()
 
@@ -24,6 +29,7 @@ if(QT_FEATURE_graphs_3d)
         if(QT_FEATURE_graphs_3d_scatter3d)
             add_subdirectory(qmlcustominput)
             add_subdirectory(qmldynamicdata)
+            add_subdirectory(qmlspline)
         endif()
         if(QT_FEATURE_graphs_3d_surface3d)
             add_subdirectory(qmlgradient)
@@ -37,6 +43,7 @@ if(QT_FEATURE_graphs_3d)
         if(QT_FEATURE_graphs_3d_bars3d AND QT_FEATURE_graphs_3d_scatter3d AND QT_FEATURE_graphs_3d_surface3d)
             add_subdirectory(qmlmultitest)
             add_subdirectory(qmlperf)
+            add_subdirectory(qmlinjection)
         endif()
     endif()
     if(NOT ANDROID AND NOT IOS AND NOT WINRT)
diff -pruN 6.8.2-4/tests/manual/barstest/CMakeLists.txt 6.9.1-1/tests/manual/barstest/CMakeLists.txt
--- 6.8.2-4/tests/manual/barstest/CMakeLists.txt	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/tests/manual/barstest/CMakeLists.txt	2025-05-29 02:19:47.000000000 +0000
@@ -4,7 +4,7 @@
 cmake_minimum_required(VERSION 3.16)
 
 if (NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT)
-    project(tst_barstest LANGUAGES C CXX ASM)
+    project(tst_barstest LANGUAGES C CXX)
     find_package(Qt6BuildInternals COMPONENTS STANDALONE_TEST)
 endif()
 
diff -pruN 6.8.2-4/tests/manual/barstest/chart.cpp 6.9.1-1/tests/manual/barstest/chart.cpp
--- 6.8.2-4/tests/manual/barstest/chart.cpp	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/tests/manual/barstest/chart.cpp	2025-05-29 02:19:47.000000000 +0000
@@ -1537,6 +1537,18 @@ void GraphModifier::setFloorLevel(int va
 {
     m_graph->setFloorLevel(float(value));
     qDebug() << "Floor level:" << value;
+
+    //adjust camera min max
+    if (value == 0) {
+        m_graph->setMinCameraYRotation(-90);
+        m_graph->setMaxCameraYRotation(90);
+    } else if (value > 0) {
+        m_graph->setMinCameraYRotation(-90);
+        m_graph->setMaxCameraYRotation(0);
+    } else {
+        m_graph->setMinCameraYRotation(0);
+        m_graph->setMaxCameraYRotation(90);
+    }
 }
 
 void GraphModifier::setGraphMargin(int value)
diff -pruN 6.8.2-4/tests/manual/custominput/CMakeLists.txt 6.9.1-1/tests/manual/custominput/CMakeLists.txt
--- 6.8.2-4/tests/manual/custominput/CMakeLists.txt	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/tests/manual/custominput/CMakeLists.txt	2025-05-29 02:19:47.000000000 +0000
@@ -4,7 +4,7 @@
 cmake_minimum_required(VERSION 3.16)
 
 if (NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT)
-    project(tst_custominput LANGUAGES C CXX ASM)
+    project(tst_custominput LANGUAGES C CXX)
     find_package(Qt6BuildInternals COMPONENTS STANDALONE_TEST)
 endif()
 
diff -pruN 6.8.2-4/tests/manual/directional/CMakeLists.txt 6.9.1-1/tests/manual/directional/CMakeLists.txt
--- 6.8.2-4/tests/manual/directional/CMakeLists.txt	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/tests/manual/directional/CMakeLists.txt	2025-05-29 02:19:47.000000000 +0000
@@ -4,7 +4,7 @@
 cmake_minimum_required(VERSION 3.16)
 
 if (NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT)
-    project(tst_directional LANGUAGES C CXX ASM)
+    project(tst_directional LANGUAGES C CXX)
     find_package(Qt6BuildInternals COMPONENTS STANDALONE_TEST)
 endif()
 
diff -pruN 6.8.2-4/tests/manual/itemmodel/CMakeLists.txt 6.9.1-1/tests/manual/itemmodel/CMakeLists.txt
--- 6.8.2-4/tests/manual/itemmodel/CMakeLists.txt	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/tests/manual/itemmodel/CMakeLists.txt	2025-05-29 02:19:47.000000000 +0000
@@ -4,7 +4,7 @@
 cmake_minimum_required(VERSION 3.16)
 
 if (NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT)
-    project(tst_itemmodel LANGUAGES C CXX ASM)
+    project(tst_itemmodel LANGUAGES C CXX)
     find_package(Qt6BuildInternals COMPONENTS STANDALONE_TEST)
 endif()
 
diff -pruN 6.8.2-4/tests/manual/itemmodeltest/CMakeLists.txt 6.9.1-1/tests/manual/itemmodeltest/CMakeLists.txt
--- 6.8.2-4/tests/manual/itemmodeltest/CMakeLists.txt	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/tests/manual/itemmodeltest/CMakeLists.txt	2025-05-29 02:19:47.000000000 +0000
@@ -4,7 +4,7 @@
 cmake_minimum_required(VERSION 3.16)
 
 if (NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT)
-    project(tst_itemmodeltest LANGUAGES C CXX ASM)
+    project(tst_itemmodeltest LANGUAGES C CXX)
     find_package(Qt6BuildInternals COMPONENTS STANDALONE_TEST)
 endif()
 
diff -pruN 6.8.2-4/tests/manual/minimalbars/CMakeLists.txt 6.9.1-1/tests/manual/minimalbars/CMakeLists.txt
--- 6.8.2-4/tests/manual/minimalbars/CMakeLists.txt	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/tests/manual/minimalbars/CMakeLists.txt	2025-05-29 02:19:47.000000000 +0000
@@ -4,7 +4,7 @@
 cmake_minimum_required(VERSION 3.16)
 
 if (NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT)
-    project(tst_minimalbars LANGUAGES C CXX ASM)
+    project(tst_minimalbars LANGUAGES C CXX)
     find_package(Qt6BuildInternals COMPONENTS STANDALONE_TEST)
 endif()
 
diff -pruN 6.8.2-4/tests/manual/minimalscatter/CMakeLists.txt 6.9.1-1/tests/manual/minimalscatter/CMakeLists.txt
--- 6.8.2-4/tests/manual/minimalscatter/CMakeLists.txt	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/tests/manual/minimalscatter/CMakeLists.txt	2025-05-29 02:19:47.000000000 +0000
@@ -4,7 +4,7 @@
 cmake_minimum_required(VERSION 3.16)
 
 if (NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT)
-    project(tst_minimalscatter LANGUAGES C CXX ASM)
+    project(tst_minimalscatter LANGUAGES C CXX)
     find_package(Qt6BuildInternals COMPONENTS STANDALONE_TEST)
 endif()
 
diff -pruN 6.8.2-4/tests/manual/minimalsurface/CMakeLists.txt 6.9.1-1/tests/manual/minimalsurface/CMakeLists.txt
--- 6.8.2-4/tests/manual/minimalsurface/CMakeLists.txt	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/tests/manual/minimalsurface/CMakeLists.txt	2025-05-29 02:19:47.000000000 +0000
@@ -4,7 +4,7 @@
 cmake_minimum_required(VERSION 3.16)
 
 if (NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT)
-    project(tst_minimalsurface LANGUAGES C CXX ASM)
+    project(tst_minimalsurface LANGUAGES C CXX)
     find_package(Qt6BuildInternals COMPONENTS STANDALONE_TEST)
 endif()
 
diff -pruN 6.8.2-4/tests/manual/multigraphs/CMakeLists.txt 6.9.1-1/tests/manual/multigraphs/CMakeLists.txt
--- 6.8.2-4/tests/manual/multigraphs/CMakeLists.txt	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/tests/manual/multigraphs/CMakeLists.txt	2025-05-29 02:19:47.000000000 +0000
@@ -4,7 +4,7 @@
 cmake_minimum_required(VERSION 3.16)
 
 if (NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT)
-    project(tst_multigraphs LANGUAGES C CXX ASM)
+    project(tst_multigraphs LANGUAGES C CXX)
     find_package(Qt6BuildInternals COMPONENTS STANDALONE_TEST)
 endif()
 
diff -pruN 6.8.2-4/tests/manual/qmlbarscatter/CMakeLists.txt 6.9.1-1/tests/manual/qmlbarscatter/CMakeLists.txt
--- 6.8.2-4/tests/manual/qmlbarscatter/CMakeLists.txt	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/tests/manual/qmlbarscatter/CMakeLists.txt	2025-05-29 02:19:47.000000000 +0000
@@ -4,7 +4,7 @@
 cmake_minimum_required(VERSION 3.16)
 
 if (NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT)
-    project(tst_qmlbarscatter LANGUAGES C CXX ASM)
+    project(tst_qmlbarscatter LANGUAGES C CXX)
     find_package(Qt6BuildInternals COMPONENTS STANDALONE_TEST)
 endif()
 
diff -pruN 6.8.2-4/tests/manual/qmlbarsrowcolors/CMakeLists.txt 6.9.1-1/tests/manual/qmlbarsrowcolors/CMakeLists.txt
--- 6.8.2-4/tests/manual/qmlbarsrowcolors/CMakeLists.txt	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/tests/manual/qmlbarsrowcolors/CMakeLists.txt	2025-05-29 02:19:47.000000000 +0000
@@ -4,7 +4,7 @@
 cmake_minimum_required(VERSION 3.16)
 
 if (NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT)
-    project(tst_qmlbarsrowcolors LANGUAGES C CXX ASM)
+    project(tst_qmlbarsrowcolors LANGUAGES C CXX)
     find_package(Qt6BuildInternals COMPONENTS STANDALONE_TEST)
 endif()
 
diff -pruN 6.8.2-4/tests/manual/qmlbarsrowcolors/qml/qmlbarsrowcolors/Axes.qml 6.9.1-1/tests/manual/qmlbarsrowcolors/qml/qmlbarsrowcolors/Axes.qml
--- 6.8.2-4/tests/manual/qmlbarsrowcolors/qml/qmlbarsrowcolors/Axes.qml	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/tests/manual/qmlbarsrowcolors/qml/qmlbarsrowcolors/Axes.qml	2025-05-29 02:19:47.000000000 +0000
@@ -9,6 +9,8 @@ Item {
     property alias row: rowAxis
     property alias value: valueAxis
     property alias total: totalAxis
+    property real maxAxisSegmentCount: 10
+    property real minAxisSegmentCount: 1
 
     // Custom labels for columns, since the data contains abbreviated month names.
     //! [0]
@@ -40,5 +42,6 @@ Item {
         title: "Monthly income"
         labelAutoAngle: 90
         titleVisible: true
+        segmentCount: 6
     }
 }
diff -pruN 6.8.2-4/tests/manual/qmlbarsrowcolors/qml/qmlbarsrowcolors/main.qml 6.9.1-1/tests/manual/qmlbarsrowcolors/qml/qmlbarsrowcolors/main.qml
--- 6.8.2-4/tests/manual/qmlbarsrowcolors/qml/qmlbarsrowcolors/main.qml	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/tests/manual/qmlbarsrowcolors/qml/qmlbarsrowcolors/main.qml	2025-05-29 02:19:47.000000000 +0000
@@ -303,6 +303,36 @@ Item {
 
         Column {
             Label {
+                text: "ValueAxis Segments"
+            }
+        }
+
+        Slider {
+            id: valueAxisSegmentSliders
+            Layout.fillWidth: true
+            Layout.fillHeight: true
+            clip: true
+            from: graphAxes.minAxisSegmentCount
+            to: graphAxes.maxAxisSegmentCount
+            value: 5
+
+            onValueChanged: barGraph.valueAxis.segmentCount = value
+        }
+
+        Slider {
+            id: valueAxisSubSegmentSliders
+            Layout.fillWidth: true
+            Layout.fillHeight: true
+            clip: true
+            from: graphAxes.minAxisSegmentCount
+            to: graphAxes.maxAxisSegmentCount
+            value: 5
+
+            onValueChanged: barGraph.valueAxis.subSegmentCount = value
+        }
+
+        Column {
+            Label {
                 text: "Rotate bars"
             }
         }
diff -pruN 6.8.2-4/tests/manual/qmlbenchmark2d/CMakeLists.txt 6.9.1-1/tests/manual/qmlbenchmark2d/CMakeLists.txt
--- 6.8.2-4/tests/manual/qmlbenchmark2d/CMakeLists.txt	1970-01-01 00:00:00.000000000 +0000
+++ 6.9.1-1/tests/manual/qmlbenchmark2d/CMakeLists.txt	2025-05-29 02:19:47.000000000 +0000
@@ -0,0 +1,74 @@
+# Copyright (C) 2024 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
+cmake_minimum_required(VERSION 3.16)
+
+set(CMAKE_INCLUDE_CURRENT_DIR ON)
+
+set(USE_CHARTS false)
+
+if (USE_CHARTS)
+    project(tst_qmlbenchmark2d LANGUAGES C CXX)
+    find_package(Qt6 REQUIRED COMPONENTS Charts Core Gui Qml Quick)
+
+    add_compile_definitions(USE_CHARTS)
+
+    qt_standard_project_setup()
+
+    qt_add_executable(tst_qmlbenchmark2d
+        main.cpp
+        chartsdatasource.h chartsdatasource.cpp
+        resultsio.h resultsio.cpp
+    )
+
+    target_link_libraries(tst_qmlbenchmark2d PUBLIC
+        Qt::Charts
+        Qt::Widgets
+        Qt::Core
+        Qt::Gui
+        Qt::Qml
+        Qt::Quick
+    )
+else()
+    if (NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT)
+        project(tst_qmlbenchmark2d LANGUAGES C CXX)
+        find_package(Qt6BuildInternals COMPONENTS STANDALONE_TEST)
+    endif()
+
+    qt_internal_add_manual_test(tst_qmlbenchmark2d
+        GUI
+        SOURCES
+            main.cpp
+            datasource.h datasource.cpp
+            resultsio.h resultsio.cpp
+    )
+
+    target_link_libraries(tst_qmlbenchmark2d PUBLIC
+        Qt::Graphs
+        Qt::Widgets
+        Qt::Core
+        Qt::Gui
+        Qt::Qml
+        Qt::Quick
+    )
+endif()
+
+# Resources:
+set(qmlbenchmark2d_resource_files
+    "Main.qml"
+    "Results.qml"
+    "ChartsLineTest.qml"
+    "ChartsAreaTest.qml"
+    "ChartsBarTest.qml"
+    "ChartsOpenGLLineTest.qml"
+    "GraphsLineTest.qml"
+    "GraphsAreaTest.qml"
+    "GraphsBarTest.qml"
+)
+
+qt_internal_add_resource(tst_qmlbenchmark2d "qmlbenchmark2d"
+    PREFIX
+        "/"
+    FILES
+        ${qmlbenchmark2d_resource_files}
+)
diff -pruN 6.8.2-4/tests/manual/qmlbenchmark2d/ChartsAreaTest.qml 6.9.1-1/tests/manual/qmlbenchmark2d/ChartsAreaTest.qml
--- 6.8.2-4/tests/manual/qmlbenchmark2d/ChartsAreaTest.qml	1970-01-01 00:00:00.000000000 +0000
+++ 6.9.1-1/tests/manual/qmlbenchmark2d/ChartsAreaTest.qml	2025-05-29 02:19:47.000000000 +0000
@@ -0,0 +1,56 @@
+// Copyright (C) 2024 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+import QtQuick
+import QtCharts
+
+Rectangle {
+    signal measure(int count)
+    width: 800
+    height: 600
+    color: "#404040"
+
+    ChartView {
+        anchors.fill: parent
+        antialiasing: false
+
+        Component.onCompleted: {
+            chartsDataSource.reset(100);
+        }
+
+        AreaSeries {
+            id: area
+
+            axisX: ValueAxis {
+                id: xAxis
+                min: 0
+                max: series.count
+            }
+
+            axisY: ValueAxis {
+                min: 0
+                max: 10
+            }
+
+            upperSeries: LineSeries {
+                id: series
+            }
+        }
+    }
+
+    FrameAnimation {
+        running: true
+        onTriggered: {
+            if (xAxis.max !== series.count)
+                xAxis.max = series.count
+            chartsDataSource.update(series);
+        }
+    }
+
+    Timer {
+        interval: 400; running: true; repeat: true
+        onTriggered: {
+            parent.measure(series.count)
+        }
+    }
+}
diff -pruN 6.8.2-4/tests/manual/qmlbenchmark2d/ChartsBarTest.qml 6.9.1-1/tests/manual/qmlbenchmark2d/ChartsBarTest.qml
--- 6.8.2-4/tests/manual/qmlbenchmark2d/ChartsBarTest.qml	1970-01-01 00:00:00.000000000 +0000
+++ 6.9.1-1/tests/manual/qmlbenchmark2d/ChartsBarTest.qml	2025-05-29 02:19:47.000000000 +0000
@@ -0,0 +1,57 @@
+// Copyright (C) 2024 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+import QtQuick
+import QtCharts
+
+Rectangle {
+    signal measure(int count)
+    width: 800
+    height: 600
+    color: "#404040"
+
+    ChartView {
+        anchors.fill: parent
+        antialiasing: true
+
+        Component.onCompleted: {
+            chartsDataSource.reset(10);
+        }
+
+        BarSeries {
+            id: series
+
+            axisX: BarCategoryAxis {
+                id: xAxis
+            }
+
+            axisY: ValueAxis {
+                min: 0
+                max: 10
+            }
+
+            BarSet {
+            }
+        }
+    }
+
+    FrameAnimation {
+        id: fA
+        running: true
+        onTriggered: {
+            chartsDataSource.update(series);
+            if (series.at(0)) {
+                while (xAxis.categories.length < series.at(0).count)
+                    xAxis.categories.push(xAxis.categories.length.toString());
+            }
+        }
+    }
+
+    Timer {
+        interval: 400; running: true; repeat: true
+        onTriggered: {
+            if (series.at(0))
+                parent.measure(series.at(0).count)
+        }
+    }
+}
diff -pruN 6.8.2-4/tests/manual/qmlbenchmark2d/ChartsLineTest.qml 6.9.1-1/tests/manual/qmlbenchmark2d/ChartsLineTest.qml
--- 6.8.2-4/tests/manual/qmlbenchmark2d/ChartsLineTest.qml	1970-01-01 00:00:00.000000000 +0000
+++ 6.9.1-1/tests/manual/qmlbenchmark2d/ChartsLineTest.qml	2025-05-29 02:19:47.000000000 +0000
@@ -0,0 +1,52 @@
+// Copyright (C) 2024 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+import QtQuick
+import QtCharts
+
+Rectangle {
+    signal measure(int count)
+    width: 800
+    height: 600
+    color: "#404040"
+
+    ChartView {
+        anchors.fill: parent
+        antialiasing: true
+
+        Component.onCompleted: {
+            chartsDataSource.reset(1000);
+        }
+
+        LineSeries {
+            id: series
+
+            axisX: ValueAxis {
+                id: xAxis
+                min: 0
+                max: series.count
+            }
+
+            axisY: ValueAxis {
+                min: 0
+                max: 10
+            }
+        }
+    }
+
+    FrameAnimation {
+        running: true
+        onTriggered: {
+            if (xAxis.max !== series.count)
+                xAxis.max = series.count
+            chartsDataSource.update(series);
+        }
+    }
+
+    Timer {
+        interval: 400; running: true; repeat: true
+        onTriggered: {
+            parent.measure(series.count)
+        }
+    }
+}
diff -pruN 6.8.2-4/tests/manual/qmlbenchmark2d/ChartsOpenGLLineTest.qml 6.9.1-1/tests/manual/qmlbenchmark2d/ChartsOpenGLLineTest.qml
--- 6.8.2-4/tests/manual/qmlbenchmark2d/ChartsOpenGLLineTest.qml	1970-01-01 00:00:00.000000000 +0000
+++ 6.9.1-1/tests/manual/qmlbenchmark2d/ChartsOpenGLLineTest.qml	2025-05-29 02:19:47.000000000 +0000
@@ -0,0 +1,53 @@
+// Copyright (C) 2024 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+import QtQuick
+import QtCharts
+
+Rectangle {
+    signal measure(int count)
+    width: 800
+    height: 600
+    color: "#404040"
+
+    ChartView {
+        anchors.fill: parent
+        antialiasing: true
+
+        Component.onCompleted: {
+            chartsDataSource.reset(1000);
+        }
+
+        LineSeries {
+            id: series
+            useOpenGL: true
+
+            axisX: ValueAxis {
+                id: xAxis
+                min: 0
+                max: series.count
+            }
+
+            axisY: ValueAxis {
+                min: 0
+                max: 10
+            }
+        }
+    }
+
+    FrameAnimation {
+        running: true
+        onTriggered: {
+            if (xAxis.max !== series.count)
+                xAxis.max = series.count
+            chartsDataSource.update(series);
+        }
+    }
+
+    Timer {
+        interval: 400; running: true; repeat: true
+        onTriggered: {
+            parent.measure(series.count)
+        }
+    }
+}
diff -pruN 6.8.2-4/tests/manual/qmlbenchmark2d/GraphsAreaTest.qml 6.9.1-1/tests/manual/qmlbenchmark2d/GraphsAreaTest.qml
--- 6.8.2-4/tests/manual/qmlbenchmark2d/GraphsAreaTest.qml	1970-01-01 00:00:00.000000000 +0000
+++ 6.9.1-1/tests/manual/qmlbenchmark2d/GraphsAreaTest.qml	2025-05-29 02:19:47.000000000 +0000
@@ -0,0 +1,58 @@
+// Copyright (C) 2024 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+import QtQuick
+import QtGraphs
+
+Rectangle {
+    signal measure(int count)
+    width: 800
+    height: 600
+    color: "#404040"
+
+    GraphsView {
+        id: graph
+        anchors.fill: parent
+        antialiasing: false
+
+        Component.onCompleted: {
+            dataSource.reset(100);
+        }
+
+        axisX: ValueAxis {
+            min: 0
+            max: {
+                if (series.count > 0)
+                    return series.count
+                else
+                    return 100
+            }
+        }
+
+        axisY: ValueAxis {
+            min: 0
+            max: 10
+        }
+
+        AreaSeries {
+            id: area
+            upperSeries: LineSeries {
+                id: series
+            }
+        }
+    }
+
+    FrameAnimation {
+        running: true
+        onTriggered: {
+            dataSource.update(series);
+        }
+    }
+
+    Timer {
+        interval: 400; running: true; repeat: true
+        onTriggered: {
+            parent.measure(series.count)
+        }
+    }
+}
diff -pruN 6.8.2-4/tests/manual/qmlbenchmark2d/GraphsBarTest.qml 6.9.1-1/tests/manual/qmlbenchmark2d/GraphsBarTest.qml
--- 6.8.2-4/tests/manual/qmlbenchmark2d/GraphsBarTest.qml	1970-01-01 00:00:00.000000000 +0000
+++ 6.9.1-1/tests/manual/qmlbenchmark2d/GraphsBarTest.qml	2025-05-29 02:19:47.000000000 +0000
@@ -0,0 +1,54 @@
+// Copyright (C) 2024 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+import QtQuick
+import QtGraphs
+
+Rectangle {
+    signal measure(int count)
+    width: 800
+    height: 600
+    color: "#404040"
+
+    GraphsView {
+        id: graph
+        anchors.fill: parent
+        antialiasing: true
+
+        Component.onCompleted: {
+            dataSource.reset(10);
+        }
+
+        axisX: BarCategoryAxis {
+            id: xAxis
+        }
+
+        axisY: ValueAxis {
+            min: 0
+            max: 10
+        }
+
+        BarSeries {
+            id: series
+        }
+    }
+
+    FrameAnimation {
+        id: fA
+        running: true
+        onTriggered: {
+            dataSource.update(series);
+            if (series.barSets[0]) {
+                while (xAxis.categories.length < series.barSets[0].count)
+                    xAxis.categories.push(xAxis.categories.length.toString());
+            }
+        }
+    }
+
+    Timer {
+        interval: 400; running: true; repeat: true
+        onTriggered: {
+            parent.measure(series.barSets[0].count)
+        }
+    }
+}
diff -pruN 6.8.2-4/tests/manual/qmlbenchmark2d/GraphsLineTest.qml 6.9.1-1/tests/manual/qmlbenchmark2d/GraphsLineTest.qml
--- 6.8.2-4/tests/manual/qmlbenchmark2d/GraphsLineTest.qml	1970-01-01 00:00:00.000000000 +0000
+++ 6.9.1-1/tests/manual/qmlbenchmark2d/GraphsLineTest.qml	2025-05-29 02:19:47.000000000 +0000
@@ -0,0 +1,55 @@
+// Copyright (C) 2024 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+import QtQuick
+import QtGraphs
+
+Rectangle {
+    signal measure(int count)
+    width: 800
+    height: 600
+    color: "#404040"
+
+    GraphsView {
+        id: graph
+        anchors.fill: parent
+        antialiasing: true
+
+        Component.onCompleted: {
+            dataSource.reset(1000);
+        }
+
+        axisX: ValueAxis {
+            min: 0
+            max: {
+                if (series.count > 0)
+                    return series.count
+                else
+                    return 1000
+            }
+        }
+
+        axisY: ValueAxis {
+            min: 0
+            max: 10
+        }
+
+        LineSeries {
+            id: series
+        }
+    }
+
+    FrameAnimation {
+        running: true
+        onTriggered: {
+            dataSource.update(series);
+        }
+    }
+
+    Timer {
+        interval: 400; running: true; repeat: true
+        onTriggered: {
+            parent.measure(series.count)
+        }
+    }
+}
diff -pruN 6.8.2-4/tests/manual/qmlbenchmark2d/Main.qml 6.9.1-1/tests/manual/qmlbenchmark2d/Main.qml
--- 6.8.2-4/tests/manual/qmlbenchmark2d/Main.qml	1970-01-01 00:00:00.000000000 +0000
+++ 6.9.1-1/tests/manual/qmlbenchmark2d/Main.qml	2025-05-29 02:19:47.000000000 +0000
@@ -0,0 +1,112 @@
+// Copyright (C) 2024 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+import QtQuick
+import QtQuick.Controls
+
+Item {
+    id: base
+    width: 800
+    height: 600
+    property list<string> graphsTests: ["GraphsLineTest.qml", "GraphsAreaTest.qml", "GraphsBarTest.qml"]
+    property list<string> chartsTests: ["ChartsLineTest.qml", "ChartsAreaTest.qml", "ChartsBarTest.qml", "ChartsOpenGLLineTest.qml"]
+    property list<string> tests: []
+    property int testIndex: 0
+    property int fps: 0
+    property var results: ({})
+    property string resultType: ""
+
+    Component.onCompleted: {
+        if (resultsIO.useCharts())
+            tests = chartsTests;
+        else
+            tests = graphsTests;
+        for (var i = 0; i < tests.length; i++) {
+            results[tests[i]] = {};
+            results[tests[i]].fps = [];
+            results[tests[i]].counts = [];
+        }
+    }
+
+    Column {
+        anchors.horizontalCenter: base.horizontalCenter
+        spacing: 2
+
+        Button {
+            text: "Run Benchmark"
+            onClicked: {
+                timer.running = true;
+                loader.source = base.tests[base.testIndex];
+            }
+        }
+
+        Button {
+            text: "Show Results"
+            onClicked: {
+                base.resultType = ""
+                loader.source = "Results.qml"
+            }
+        }
+
+        Button {
+            text: "Show Line Results"
+            onClicked: {
+                base.resultType = "Line"
+                loader.source = "Results.qml"
+            }
+        }
+
+        Button {
+            text: "Show Area Results"
+            onClicked: {
+                base.resultType = "Area"
+                loader.source = "Results.qml"
+            }
+        }
+
+        Button {
+            text: "Show Bar Results"
+            onClicked: {
+                base.resultType = "Bar"
+                loader.source = "Results.qml"
+            }
+        }
+    }
+
+    Loader {
+        id: loader
+        anchors.fill: parent
+    }
+
+    Connections {
+        target: loader.item
+
+        function onMeasure(count) {
+            var test = base.tests[base.testIndex];
+            base.results[test].fps.push(base.fps);
+            base.results[test].counts.push(count);
+        }
+    }
+
+    /*Text {
+        text: parent.fps
+        font.family: "Helvetica"
+        font.pointSize: 24
+        color: "red"
+    }*/
+
+    Timer {
+        id: timer
+        interval: 32000; running: false; repeat: true
+        onTriggered: {
+            parent.testIndex++;
+            if (parent.testIndex < parent.tests.length) {
+                loader.source = parent.tests[parent.testIndex];
+            } else {
+                running = false;
+                resultsIO.saveResults(JSON.stringify(base.results));
+                loader.source = "Results.qml";
+            }
+        }
+    }
+}
diff -pruN 6.8.2-4/tests/manual/qmlbenchmark2d/Results.qml 6.9.1-1/tests/manual/qmlbenchmark2d/Results.qml
--- 6.8.2-4/tests/manual/qmlbenchmark2d/Results.qml	1970-01-01 00:00:00.000000000 +0000
+++ 6.9.1-1/tests/manual/qmlbenchmark2d/Results.qml	2025-05-29 02:19:47.000000000 +0000
@@ -0,0 +1,161 @@
+// Copyright (C) 2024 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+import QtQuick
+import QtGraphs
+
+Rectangle {
+    signal measure(int count)
+    id: base
+    width: 800
+    height: 600
+    color: myTheme.backgroundColor
+
+    property list<string> categories
+
+    Component {
+        id: lineComponent
+        LineSeries {
+        }
+    }
+
+    GraphsView {
+        id: graph
+        antialiasing: true
+        anchors.fill: parent
+        anchors.leftMargin: 20
+        marginLeft: 0
+
+        theme: GraphsTheme {
+            id: myTheme
+            colorScheme: GraphsTheme.ColorScheme.Dark
+            seriesColors: ["#ffaaaa", "#aaffaa", "#aaaaff", "#ff0000", "#ffffaa", "#aaffff", "#ffaaff"]
+        }
+
+        axisX: BarCategoryAxis {
+            id: xAxis
+            categories: base.categories
+            titleText: "Data Count"
+            titleColor: "white"
+        }
+
+        axisY: ValueAxis {
+            min: 0
+            max: 80
+            tickInterval: 10
+            titleText: "FPS"
+            titleColor: "white"
+        }
+
+        Component.onCompleted: {
+            var chartsString = resultsIO.loadChartsResults();
+            var graphsString = resultsIO.loadGraphsResults();
+
+            var resultsCharts = {};
+            var resultsGraphs = {};
+
+            if (chartsString.length > 0)
+                resultsCharts = JSON.parse(chartsString);
+
+            if (graphsString.length > 0)
+                resultsGraphs = JSON.parse(graphsString);
+
+            var results = Object.assign(resultsCharts, resultsGraphs);
+
+            var resultType = base.parent.parent.resultType;
+            if (resultType !== "") {
+                Object.keys(results).forEach((key) => key.includes(resultType) || delete results[key]);
+            }
+
+            for (var test in results) {
+                if (Object.prototype.hasOwnProperty.call(results, test)) {
+                    var counts = results[test].counts;
+
+                    for (var i = 0; i < counts.length; i++) {
+                        var countString = counts[i].toString();
+
+                        if (base.categories.indexOf(countString) === -1)
+                            base.categories.push(countString);
+                    }
+                }
+            }
+
+            base.categories.sort((a, b) => { return +a - +b; });
+
+            for (var test in results) {
+                if (Object.prototype.hasOwnProperty.call(results, test)) {
+                    var counts = results[test].counts;
+
+                    if (counts.length > 0) {
+                        var countOfCounts = {};
+                        for (var i = 0; i < counts.length; i++) {
+                            var countString = counts[i].toString();
+                            if (!(countString in countOfCounts))
+                                countOfCounts[countString] = 0;
+
+                            countOfCounts[countString]++;
+                        }
+
+                        let series = lineComponent.createObject(graph);
+                        series.name = test;
+
+                        var fps = results[test].fps;
+
+                        var countIndex = 0;
+                        var lastCount = counts[0].toString();
+                        for (var i = 0; i < counts.length; i++) {
+                            var countString = counts[i].toString();
+
+                            if (lastCount !== countString) {
+                                countIndex = 0;
+                                lastCount = countString;
+                            }
+
+                            var maxIndex = countOfCounts[countString];
+                            var x = base.categories.indexOf(countString) + (countIndex / maxIndex);
+                            var y = fps[i];
+
+                            if (x > 0)
+                                series.append(x, y);
+
+                            countIndex++;
+                        }
+
+                        addSeries(series);
+
+                        repeater.model = graph.seriesList.length
+                    }
+                }
+            }
+        }
+    }
+
+    Column {
+        anchors.right: graph.right
+        anchors.top: graph.top
+        spacing: 2
+        Repeater {
+            id: repeater
+            model: 0
+            Rectangle {
+                required property int index
+                height: 20
+                width: text.width
+                color: {
+                    if (graph.seriesList[index].legendData.length > 0)
+                        return graph.seriesList[index].legendData[0].color;
+                    else
+                        return "black";
+                }
+                Text {
+                    id: text
+                    text:
+                        if (graph.seriesList[index].legendData.length > 0)
+                            return graph.seriesList[index].legendData[0].label;
+                        else
+                            return "";
+                }
+            }
+        }
+    }
+}
diff -pruN 6.8.2-4/tests/manual/qmlbenchmark2d/chartsdatasource.cpp 6.9.1-1/tests/manual/qmlbenchmark2d/chartsdatasource.cpp
--- 6.8.2-4/tests/manual/qmlbenchmark2d/chartsdatasource.cpp	1970-01-01 00:00:00.000000000 +0000
+++ 6.9.1-1/tests/manual/qmlbenchmark2d/chartsdatasource.cpp	2025-05-29 02:19:47.000000000 +0000
@@ -0,0 +1,96 @@
+// Copyright (C) 2024 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#include "chartsdatasource.h"
+
+#include <QQuickItem>
+#include <QQuickView>
+#include <QRandomGenerator>
+#include <QtCharts/QBarSeries>
+#include <QtCharts/QBarSet>
+#include <QtCharts/QXYSeries>
+#include <QtMath>
+
+ChartsDataSource::ChartsDataSource(QObject *parent)
+    : QObject(parent)
+{}
+
+void ChartsDataSource::reset(int dataScale)
+{
+    m_dataScale = dataScale;
+    m_testIndex = 0;
+    m_timer = QDateTime::currentMSecsSinceEpoch();
+
+    generateData();
+}
+
+void ChartsDataSource::update(QObject *series)
+{
+    if (QDateTime::currentMSecsSinceEpoch() - m_timer >= 4000 && m_testIndex + 1 < m_data.size()) {
+        m_timer = QDateTime::currentMSecsSinceEpoch();
+        m_testIndex++;
+    }
+
+    if (series) {
+        m_index++;
+        if (m_index > m_data.at(m_testIndex).count() - 1)
+            m_index = 0;
+
+        QList<QPointF> points = m_data.at(m_testIndex).at(m_index);
+        if (auto xySeries = qobject_cast<QXYSeries *>(series)) {
+            xySeries->replace(points);
+        } else if (auto barSeries = qobject_cast<QBarSeries *>(series)) {
+            QBarSet *set = barSeries->barSets()[0];
+            for (qsizetype i = 0; i < points.size(); i++) {
+                if (set->count() <= i)
+                    set->append(points[i].y());
+                else
+                    set->replace(i, points[i].y());
+            }
+        }
+    }
+}
+
+void ChartsDataSource::generateData()
+{
+    int type = 0;
+    int testCount = 7;
+    int rowCount = 5;
+    // Remove previous data
+    m_data.clear();
+
+    // Append the new data depending on the type
+    for (int k(0); k < testCount; k++) {
+        int colCount = 0;
+        if (k > 0)
+            colCount = qPow(2, k - 1) * m_dataScale;
+
+        QList<QList<QPointF>> test;
+        for (int i(0); i < rowCount; i++) {
+            QList<QPointF> points;
+            points.reserve(colCount);
+            for (int j(0); j < colCount; j++) {
+                qreal x(0);
+                qreal y(0);
+                switch (type) {
+                case 0:
+                    // data with sin + random component
+                    y = qSin(M_PI / 50 * j) + 5 + QRandomGenerator::global()->generateDouble();
+                    x = j;
+                    break;
+                case 1:
+                    // linear data
+                    x = j;
+                    y = (qreal) i / 10;
+                    break;
+                default:
+                    // unknown, do nothing
+                    break;
+                }
+                points.append(QPointF(x, y));
+            }
+            test.append(points);
+        }
+        m_data.append(test);
+    }
+}
diff -pruN 6.8.2-4/tests/manual/qmlbenchmark2d/chartsdatasource.h 6.9.1-1/tests/manual/qmlbenchmark2d/chartsdatasource.h
--- 6.8.2-4/tests/manual/qmlbenchmark2d/chartsdatasource.h	1970-01-01 00:00:00.000000000 +0000
+++ 6.9.1-1/tests/manual/qmlbenchmark2d/chartsdatasource.h	2025-05-29 02:19:47.000000000 +0000
@@ -0,0 +1,33 @@
+// Copyright (C) 2024 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#ifndef CHARTSDATASOURCE_H
+#define CHARTSDATASOURCE_H
+
+#include <QList>
+#include <QObject>
+#include <QPointF>
+
+QT_FORWARD_DECLARE_CLASS(QQuickView)
+
+class ChartsDataSource : public QObject
+{
+    Q_OBJECT
+public:
+    explicit ChartsDataSource(QObject *parent = nullptr);
+
+public slots:
+    void generateData();
+    void reset(int dataScale);
+    void update(QObject *series);
+
+private:
+    QQuickView *m_appViewer = nullptr;
+    QList<QList<QList<QPointF>>> m_data;
+    int m_index = -1;
+    int m_testIndex = 0;
+    qint64 m_timer = 0;
+    int m_dataScale = 1000;
+};
+
+#endif
diff -pruN 6.8.2-4/tests/manual/qmlbenchmark2d/datasource.cpp 6.9.1-1/tests/manual/qmlbenchmark2d/datasource.cpp
--- 6.8.2-4/tests/manual/qmlbenchmark2d/datasource.cpp	1970-01-01 00:00:00.000000000 +0000
+++ 6.9.1-1/tests/manual/qmlbenchmark2d/datasource.cpp	2025-05-29 02:19:47.000000000 +0000
@@ -0,0 +1,102 @@
+// Copyright (C) 2024 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#include "datasource.h"
+
+#include <QQuickItem>
+#include <QQuickView>
+#include <QRandomGenerator>
+#include <QtGraphs/QBarSeries>
+#include <QtGraphs/QBarSet>
+#include <QtGraphs/QXYSeries>
+#include <QtMath>
+
+DataSource::DataSource(QObject *parent)
+    : QObject(parent)
+{}
+
+void DataSource::reset(int dataScale)
+{
+    m_dataScale = dataScale;
+    m_testIndex = 0;
+    m_timer = QDateTime::currentMSecsSinceEpoch();
+
+    generateData();
+}
+
+void DataSource::update(QObject *series)
+{
+    if (QDateTime::currentMSecsSinceEpoch() - m_timer >= 4000 && m_testIndex + 1 < m_data.size()) {
+        m_timer = QDateTime::currentMSecsSinceEpoch();
+        m_testIndex++;
+    }
+
+    if (series) {
+        m_index++;
+        if (m_index > m_data.at(m_testIndex).count() - 1)
+            m_index = 0;
+
+        QList<QPointF> points = m_data.at(m_testIndex).at(m_index);
+        if (auto xySeries = qobject_cast<QXYSeries *>(series)) {
+            xySeries->replace(points);
+            //xySeries->update(); // Uncomment for 6.8 release test
+        } else if (auto barSeries = qobject_cast<QBarSeries *>(series)) {
+            if (barSeries->count() <= 0) {
+                auto set = new QBarSet("Set", barSeries);
+                barSeries->append(set);
+            }
+
+            QBarSet *set = barSeries->at(0);
+            for (qsizetype i = 0; i < points.size(); i++) {
+                if (set->count() <= i)
+                    set->append(points[i].y());
+                else
+                    set->replace(i, points[i].y());
+            }
+        }
+    }
+}
+
+void DataSource::generateData()
+{
+    int type = 0;
+    int testCount = 7;
+    int rowCount = 5;
+    // Remove previous data
+    m_data.clear();
+
+    // Append the new data depending on the type
+    for (int k(0); k < testCount; k++) {
+        int colCount = 0;
+        if (k > 0)
+            colCount = qPow(2, k - 1) * m_dataScale;
+
+        QList<QList<QPointF>> test;
+        for (int i(0); i < rowCount; i++) {
+            QList<QPointF> points;
+            points.reserve(colCount);
+            for (int j(0); j < colCount; j++) {
+                qreal x(0);
+                qreal y(0);
+                switch (type) {
+                case 0:
+                    // data with sin + random component
+                    y = qSin(M_PI / 50 * j) + 5 + QRandomGenerator::global()->generateDouble();
+                    x = j;
+                    break;
+                case 1:
+                    // linear data
+                    x = j;
+                    y = (qreal) i / 10;
+                    break;
+                default:
+                    // unknown, do nothing
+                    break;
+                }
+                points.append(QPointF(x, y));
+            }
+            test.append(points);
+        }
+        m_data.append(test);
+    }
+}
diff -pruN 6.8.2-4/tests/manual/qmlbenchmark2d/datasource.h 6.9.1-1/tests/manual/qmlbenchmark2d/datasource.h
--- 6.8.2-4/tests/manual/qmlbenchmark2d/datasource.h	1970-01-01 00:00:00.000000000 +0000
+++ 6.9.1-1/tests/manual/qmlbenchmark2d/datasource.h	2025-05-29 02:19:47.000000000 +0000
@@ -0,0 +1,33 @@
+// Copyright (C) 2024 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#ifndef DATASOURCE_H
+#define DATASOURCE_H
+
+#include <QList>
+#include <QObject>
+#include <QPointF>
+
+QT_FORWARD_DECLARE_CLASS(QQuickView)
+
+class DataSource : public QObject
+{
+    Q_OBJECT
+
+public:
+    explicit DataSource(QObject *parent = nullptr);
+
+public slots:
+    void generateData();
+    void reset(int dataScale);
+    void update(QObject *series);
+
+private:
+    QList<QList<QList<QPointF>>> m_data;
+    int m_index = -1;
+    int m_testIndex = 0;
+    qint64 m_timer = 0;
+    int m_dataScale = 1000;
+};
+
+#endif
diff -pruN 6.8.2-4/tests/manual/qmlbenchmark2d/main.cpp 6.9.1-1/tests/manual/qmlbenchmark2d/main.cpp
--- 6.8.2-4/tests/manual/qmlbenchmark2d/main.cpp	1970-01-01 00:00:00.000000000 +0000
+++ 6.9.1-1/tests/manual/qmlbenchmark2d/main.cpp	2025-05-29 02:19:47.000000000 +0000
@@ -0,0 +1,66 @@
+// Copyright (C) 2024 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#include <QApplication>
+#include <QDir>
+#include <QQmlContext>
+#include <QQmlEngine>
+#include <QQuickItem>
+#include <QQuickView>
+#include "resultsio.h"
+
+#if USE_CHARTS
+#include "chartsdatasource.h"
+#else
+#include "datasource.h"
+#endif
+
+int main(int argc, char *argv[])
+{
+    // Qt Charts uses Qt Graphics View Framework for drawing, therefore QApplication must be used.
+    QApplication app(argc, argv);
+
+    QQuickView viewer;
+    viewer.setMinimumSize({600, 400});
+
+// The following are needed to make examples run without having to install the module
+// in desktop environments.
+#ifdef Q_OS_WIN
+    QString extraImportPath(QStringLiteral("%1/../../../../%2"));
+#else
+    QString extraImportPath(QStringLiteral("%1/../../../%2"));
+#endif
+    viewer.engine()->addImportPath(
+        extraImportPath.arg(QGuiApplication::applicationDirPath(), QString::fromLatin1("qml")));
+    QObject::connect(viewer.engine(), &QQmlEngine::quit, &viewer, &QWindow::close);
+
+    int frame = 0;
+    qreal time = QDateTime::currentMSecsSinceEpoch();
+
+    QObject::connect(&viewer, &QQuickView::frameSwapped, [&]() {
+        frame++;
+        if (QDateTime::currentMSecsSinceEpoch() >= time + 1000) {
+            time = QDateTime::currentMSecsSinceEpoch();
+            viewer.rootObject()->setProperty("fps", frame);
+            frame = 0;
+        }
+    });
+
+#if USE_CHARTS
+    ChartsDataSource chartsDataSource(&viewer);
+    viewer.rootContext()->setContextProperty("chartsDataSource", &chartsDataSource);
+#else
+    DataSource dataSource(&viewer);
+    viewer.rootContext()->setContextProperty("dataSource", &dataSource);
+#endif
+
+    ResultsIO resultsIO(&viewer);
+    viewer.rootContext()->setContextProperty("resultsIO", &resultsIO);
+
+    viewer.setTitle(QStringLiteral("Benchmark"));
+    viewer.setSource(QUrl("qrc:/Main.qml"));
+    viewer.setResizeMode(QQuickView::SizeRootObjectToView);
+    viewer.show();
+
+    return app.exec();
+}
diff -pruN 6.8.2-4/tests/manual/qmlbenchmark2d/qml.qrc 6.9.1-1/tests/manual/qmlbenchmark2d/qml.qrc
--- 6.8.2-4/tests/manual/qmlbenchmark2d/qml.qrc	1970-01-01 00:00:00.000000000 +0000
+++ 6.9.1-1/tests/manual/qmlbenchmark2d/qml.qrc	2025-05-29 02:19:47.000000000 +0000
@@ -0,0 +1,6 @@
+<RCC>
+    <qresource prefix="/">
+        <file>ChartsTest1.qml</file>
+        <file>Main.qml</file>
+    </qresource>
+</RCC>
diff -pruN 6.8.2-4/tests/manual/qmlbenchmark2d/resultsio.cpp 6.9.1-1/tests/manual/qmlbenchmark2d/resultsio.cpp
--- 6.8.2-4/tests/manual/qmlbenchmark2d/resultsio.cpp	1970-01-01 00:00:00.000000000 +0000
+++ 6.9.1-1/tests/manual/qmlbenchmark2d/resultsio.cpp	2025-05-29 02:19:47.000000000 +0000
@@ -0,0 +1,45 @@
+// Copyright (C) 2024 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#include "resultsio.h"
+#include <QFile>
+
+ResultsIO::ResultsIO(QObject *parent)
+    : QObject(parent)
+{}
+
+void ResultsIO::saveResults(QString json)
+{
+#if USE_CHARTS
+    QFile file("charts.json");
+#else
+    QFile file("graphs.json");
+#endif
+    if (file.open(QIODevice::WriteOnly))
+        file.write(json.toUtf8());
+}
+
+QString ResultsIO::loadChartsResults()
+{
+    QFile file("charts.json");
+    if (file.open(QIODevice::ReadOnly))
+        return file.readAll();
+    return "";
+}
+
+QString ResultsIO::loadGraphsResults()
+{
+    QFile file("graphs.json");
+    if (file.open(QIODevice::ReadOnly))
+        return file.readAll();
+    return "";
+}
+
+bool ResultsIO::useCharts()
+{
+#if USE_CHARTS
+    return true;
+#else
+    return false;
+#endif
+}
diff -pruN 6.8.2-4/tests/manual/qmlbenchmark2d/resultsio.h 6.9.1-1/tests/manual/qmlbenchmark2d/resultsio.h
--- 6.8.2-4/tests/manual/qmlbenchmark2d/resultsio.h	1970-01-01 00:00:00.000000000 +0000
+++ 6.9.1-1/tests/manual/qmlbenchmark2d/resultsio.h	2025-05-29 02:19:47.000000000 +0000
@@ -0,0 +1,22 @@
+// Copyright (C) 2024 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#ifndef RESULTSIO_H
+#define RESULTSIO_H
+
+#include <QObject>
+
+class ResultsIO : public QObject
+{
+    Q_OBJECT
+
+public:
+    explicit ResultsIO(QObject *parent = nullptr);
+
+    Q_INVOKABLE void saveResults(QString json);
+    Q_INVOKABLE QString loadChartsResults();
+    Q_INVOKABLE QString loadGraphsResults();
+    Q_INVOKABLE bool useCharts();
+};
+
+#endif // RESULTSIO_H
diff -pruN 6.8.2-4/tests/manual/qmlcustominput/CMakeLists.txt 6.9.1-1/tests/manual/qmlcustominput/CMakeLists.txt
--- 6.8.2-4/tests/manual/qmlcustominput/CMakeLists.txt	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/tests/manual/qmlcustominput/CMakeLists.txt	2025-05-29 02:19:47.000000000 +0000
@@ -4,7 +4,7 @@
 cmake_minimum_required(VERSION 3.16)
 
 if (NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT)
-    project(tst_qmlcustominput LANGUAGES C CXX ASM)
+    project(tst_qmlcustominput LANGUAGES C CXX)
     find_package(Qt6BuildInternals COMPONENTS STANDALONE_TEST)
 endif()
 
diff -pruN 6.8.2-4/tests/manual/qmlcustominput/qml/qmlcustominput/main.qml 6.9.1-1/tests/manual/qmlcustominput/qml/qmlcustominput/main.qml
--- 6.8.2-4/tests/manual/qmlcustominput/qml/qmlcustominput/main.qml	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/tests/manual/qmlcustominput/qml/qmlcustominput/main.qml	2025-05-29 02:19:47.000000000 +0000
@@ -12,6 +12,9 @@ Item {
     width: 1280
     height: 720
 
+    property real maxSegmentCount: 10
+    property real minSegmentCount: 1
+
     Data {
         id: graphData
     }
@@ -200,4 +203,89 @@ Item {
             onClicked: Qt.quit();
         }
     }
+
+    RowLayout {
+        id: sliderLayout
+        width: buttonLayout.width / 3
+        anchors.top: buttonLayout.bottom
+        anchors.left: parent.left
+        spacing: 10
+
+        Column {
+            id: xColumn
+            Label {
+                text: "X Axis Segment Sliders"
+            }
+
+            Slider {
+                id: xSegmentCountSlider
+                snapMode: Slider.SnapAlways
+                from: mainView.minSegmentCount
+                to: mainView.maxSegmentCount
+                value: 5
+
+                onValueChanged: scatterGraph.axisX.segmentCount = value
+            }
+
+            Slider {
+                id: xSubSegmentCountSlider
+                from: mainView.minSegmentCount
+                to: mainView.maxSegmentCount
+                value: 1
+
+                onValueChanged: scatterGraph.axisX.subSegmentCount = value
+            }
+        }
+
+        Column {
+            id: yColumn
+            Label {
+                text: "Y Axis Segment Sliders"
+            }
+
+            Slider {
+                id: ySegmentCountSlider
+                clip: true
+                from: mainView.minSegmentCount
+                to: mainView.maxSegmentCount
+                value: 5
+
+                onValueChanged: scatterGraph.axisY.segmentCount = value
+            }
+
+            Slider {
+                id: ySubSegmentCountSlider
+                from: mainView.minSegmentCount
+                to: mainView.maxSegmentCount
+                value: 1
+
+                onValueChanged: scatterGraph.axisY.subSegmentCount = value
+            }
+        }
+
+        Column {
+            id: zColumn
+            Label {
+                text: "Z Axis Segment Sliders"
+            }
+
+            Slider {
+                id: zSegmentCountSlider
+                from: mainView.minSegmentCount
+                to: mainView.maxSegmentCount
+                value: 5
+
+                onValueChanged: scatterGraph.axisZ.segmentCount = value
+            }
+
+            Slider {
+                id: zSubSegmentCountSlider
+                from: mainView.minSegmentCount
+                to: mainView.maxSegmentCount
+                value: 1
+
+                onValueChanged: scatterGraph.axisZ.subSegmentCount = value
+            }
+        }
+    }
 }
diff -pruN 6.8.2-4/tests/manual/qmldynamicdata/CMakeLists.txt 6.9.1-1/tests/manual/qmldynamicdata/CMakeLists.txt
--- 6.8.2-4/tests/manual/qmldynamicdata/CMakeLists.txt	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/tests/manual/qmldynamicdata/CMakeLists.txt	2025-05-29 02:19:47.000000000 +0000
@@ -4,7 +4,7 @@
 cmake_minimum_required(VERSION 3.16)
 
 if (NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT)
-    project(tst_qmldynamicdata LANGUAGES C CXX ASM)
+    project(tst_qmldynamicdata LANGUAGES C CXX)
     find_package(Qt6BuildInternals COMPONENTS STANDALONE_TEST)
 endif()
 
diff -pruN 6.8.2-4/tests/manual/qmlgradient/CMakeLists.txt 6.9.1-1/tests/manual/qmlgradient/CMakeLists.txt
--- 6.8.2-4/tests/manual/qmlgradient/CMakeLists.txt	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/tests/manual/qmlgradient/CMakeLists.txt	2025-05-29 02:19:47.000000000 +0000
@@ -4,7 +4,7 @@
 cmake_minimum_required(VERSION 3.16)
 
 if (NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT)
-    project(tst_qmlgradient LANGUAGES C CXX ASM)
+    project(tst_qmlgradient LANGUAGES C CXX)
     find_package(Qt6BuildInternals COMPONENTS STANDALONE_TEST)
 endif()
 
diff -pruN 6.8.2-4/tests/manual/qmlheightmap/CMakeLists.txt 6.9.1-1/tests/manual/qmlheightmap/CMakeLists.txt
--- 6.8.2-4/tests/manual/qmlheightmap/CMakeLists.txt	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/tests/manual/qmlheightmap/CMakeLists.txt	2025-05-29 02:19:47.000000000 +0000
@@ -4,7 +4,7 @@
 cmake_minimum_required(VERSION 3.16)
 
 if (NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT)
-    project(tst_qmlheightmap LANGUAGES C CXX ASM)
+    project(tst_qmlheightmap LANGUAGES C CXX)
     find_package(Qt6BuildInternals COMPONENTS STANDALONE_TEST)
 endif()
 
diff -pruN 6.8.2-4/tests/manual/qmlinjection/CMakeLists.txt 6.9.1-1/tests/manual/qmlinjection/CMakeLists.txt
--- 6.8.2-4/tests/manual/qmlinjection/CMakeLists.txt	1970-01-01 00:00:00.000000000 +0000
+++ 6.9.1-1/tests/manual/qmlinjection/CMakeLists.txt	2025-05-29 02:19:47.000000000 +0000
@@ -0,0 +1,39 @@
+# Copyright (C) 2024 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
+cmake_minimum_required(VERSION 3.16)
+
+if (NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT)
+    projecf(tst_qmlinjection LANGUAGES C CXX)
+    find_package(Qt6BuildInternals COMPONENTS STANDALONE_TEST)
+endif()
+
+set(CMAKE_INCLUDE_CURRENT_DIR ON)
+
+qt_internal_add_manual_test(tst_qmlinjection
+    GUI
+    SOURCES
+        main.cpp
+    )
+
+target_link_libraries(tst_qmlinjection PUBLIC
+    Qt::Gui
+    Qt::Graphs
+    )
+
+set(qmlinjection_resource_files
+    "qml/qmlinjection/main.qml"
+    "qml/qmlinjection/GraphInjection.qml"
+    "qml/qmlinjection/MultiView.qml"
+    "qml/qmlinjection/MultiGraph.qml"
+    "qml/qmlinjection/australia.png"
+    "qml/qmlinjection/australiaSatellite.jpg"
+    "qml/qmlinjection/plane.mesh"
+    )
+
+qt_internal_add_resource(tst_qmlinjection "qmlinjection"
+    PREFIX
+    "/"
+    FILES
+    ${qmlinjection_resource_files}
+    )
diff -pruN 6.8.2-4/tests/manual/qmlinjection/main.cpp 6.9.1-1/tests/manual/qmlinjection/main.cpp
--- 6.8.2-4/tests/manual/qmlinjection/main.cpp	1970-01-01 00:00:00.000000000 +0000
+++ 6.9.1-1/tests/manual/qmlinjection/main.cpp	2025-05-29 02:19:47.000000000 +0000
@@ -0,0 +1,33 @@
+// Copyright (C) 2024 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#include <QtCore/QDir>
+#include <QtGui/QGuiApplication>
+#include <QtQml/QQmlContext>
+#include <QtQml/QQmlEngine>
+#include <QtQuick/QQuickView>
+
+int main(int argc, char *argv[]) {
+  QGuiApplication app(argc, argv);
+
+  QQuickView viewer;
+
+  // The following are needed to make examples run without having to install the
+  // module in desktop environments.
+#ifdef Q_OS_WIN
+  QString extraImportPath(QStringLiteral("%1/../../../%2"));
+#else
+  QString extraImportPath(QStringLiteral("%1/../../%2"));
+#endif
+  viewer.engine()->addImportPath(extraImportPath.arg(
+      QGuiApplication::applicationDirPath(), QString::fromLatin1("qml")));
+  QObject::connect(viewer.engine(), &QQmlEngine::quit, &viewer,
+                   &QWindow::close);
+
+  viewer.setTitle(QStringLiteral("QML graph injection"));
+  viewer.setSource(QUrl("qrc:/qml/qmlinjection/main.qml"));
+  viewer.setResizeMode(QQuickView::SizeRootObjectToView);
+  viewer.show();
+
+  return app.exec();
+}
diff -pruN 6.8.2-4/tests/manual/qmlinjection/qml/qmlinjection/GraphInjection.qml 6.9.1-1/tests/manual/qmlinjection/qml/qmlinjection/GraphInjection.qml
--- 6.8.2-4/tests/manual/qmlinjection/qml/qmlinjection/GraphInjection.qml	1970-01-01 00:00:00.000000000 +0000
+++ 6.9.1-1/tests/manual/qmlinjection/qml/qmlinjection/GraphInjection.qml	2025-05-29 02:19:47.000000000 +0000
@@ -0,0 +1,140 @@
+// Copyright (C) 2024 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+import QtQuick3D
+import QtQuick3D.Helpers
+import QtGraphs
+import QtQml
+
+import QtQuick
+import QtQuick.Controls.Fusion
+import QtQuick.Layouts
+Item {
+    Bars3D {
+        id: bars
+        anchors.top: parent.top
+        anchors.bottom: parent.bottom
+        anchors.right: parent.right
+        width: parent.width * 0.5
+        aspectRatio: 3.0
+        rootNode.scale: Qt.vector3d(10,10,10)
+
+        Bar3DSeries {
+            id: barsSeries
+
+            ItemModelBarDataProxy {
+                id: barProxy
+                itemModel: ListModel {
+                    ListElement{ coords: "0,0"; data: "20.0/10.0/4.75"; }
+                    ListElement{ coords: "1,0"; data: "21.1/10.3/3.00"; }
+                    ListElement{ coords: "2,0"; data: "22.5/10.7/1.24"; }
+                    ListElement{ coords: "3,0"; data: "24.0/10.5/2.53"; }
+                    ListElement{ coords: "0,1"; data: "20.2/11.2/3.55"; }
+                    ListElement{ coords: "1,1"; data: "21.3/11.5/3.03"; }
+                    ListElement{ coords: "2,1"; data: "22.6/11.7/3.46"; }
+                    ListElement{ coords: "3,1"; data: "23.4/11.5/4.12"; }
+                    ListElement{ coords: "0,2"; data: "20.2/12.3/3.37"; }
+                    ListElement{ coords: "1,2"; data: "21.1/12.4/2.98"; }
+                    ListElement{ coords: "2,2"; data: "22.5/12.1/3.33"; }
+                    ListElement{ coords: "3,2"; data: "23.3/12.7/3.23"; }
+                    ListElement{ coords: "0,3"; data: "20.7/13.3/5.34"; }
+                    ListElement{ coords: "1,3"; data: "21.5/13.2/4.54"; }
+                    ListElement{ coords: "2,3"; data: "22.4/13.6/4.65"; }
+                    ListElement{ coords: "3,3"; data: "23.2/13.4/6.67"; }
+                    ListElement{ coords: "0,4"; data: "20.6/15.0/6.01"; }
+                    ListElement{ coords: "1,4"; data: "21.3/14.6/5.83"; }
+                    ListElement{ coords: "2,4"; data: "22.5/14.8/7.32"; }
+                    ListElement{ coords: "3,4"; data: "23.7/14.3/6.90"; }
+                }
+                rowRole: "coords"
+                columnRole: "coords"
+                valueRole: "data"
+                rowRolePattern: /(\d),\d/
+                columnRolePattern: /(\d),(\d)/
+                valueRolePattern: /^([^\/]*)\/([^\/]*)\/(.*)$/
+                rowRoleReplace: "\\1"
+                columnRoleReplace: "\\2"
+                valueRoleReplace: "\\3"
+            }
+        }
+    }
+
+    View3D {
+        id: view3d
+        anchors.top: parent.top
+        anchors.bottom: parent.bottom
+        anchors.left: parent.left
+        width: barVisButton.isEnabled? parent.width * 0.5 : parent.width
+        camera: cam
+        importScene: bars.rootNode
+
+        environment: SceneEnvironment {
+            clearColor: "skyblue"
+            backgroundMode: SceneEnvironment.Color
+        }
+
+        DirectionalLight {
+            eulerRotation.x: -30
+        }
+
+        PerspectiveCamera {
+            id: cam
+            property real xPos: Math.cos(camRot.value * 2 * Math.PI) * 50
+            property real zPos: Math.sin(camRot.value * 2 * Math.PI) * 50
+            position: Qt.vector3d(
+                          xPos,
+                          3,
+                          zPos
+                          )
+            lookAtNode: bars.rootNode
+            eulerRotation.x: -30
+            clipNear: 0.001
+        }
+
+        Model {
+            id: cube
+            source: "#Cube"
+            materials: DefaultMaterial {
+                diffuseColor: "red"
+            }
+            eulerRotation.y: 90
+            scale: Qt.vector3d(0.05,0.05,0.05)
+
+            Vector3dAnimation on eulerRotation {
+                loops: Animation.Infinite
+                duration: 5000
+                from: Qt.vector3d(0, 0, 0)
+                to: Qt.vector3d(360, 0, 360)
+            }
+        }
+
+        MouseArea {
+            anchors.fill: parent
+            onClicked: {
+                var origin = view3d.mapTo3DScene(Qt.vector3d(mouseX, mouseY, 0))
+                var far = view3d.mapTo3DScene(Qt.vector3d(mouseX, mouseY, 1))
+                var direction = Qt.vector3d(far.x - origin.x,
+                                            far.y - origin.y,
+                                            far.z - origin.z );
+                bars.doRayPicking(origin, direction)
+            }
+        }
+    }
+
+    Slider {
+        anchors.bottom: view3d.bottom
+        anchors.left: view3d.left
+        anchors.right: view3d.right
+        id: camRot
+        from: 0
+        to: 1
+        stepSize: 0.01
+        value: 0
+    }
+
+    Button {
+        id: barVisButton
+        property bool isEnabled: false
+        text: isEnabled ? "Hide original graph": "Show original graph"
+        onClicked: isEnabled = !isEnabled
+    }
+}
diff -pruN 6.8.2-4/tests/manual/qmlinjection/qml/qmlinjection/MultiGraph.qml 6.9.1-1/tests/manual/qmlinjection/qml/qmlinjection/MultiGraph.qml
--- 6.8.2-4/tests/manual/qmlinjection/qml/qmlinjection/MultiGraph.qml	1970-01-01 00:00:00.000000000 +0000
+++ 6.9.1-1/tests/manual/qmlinjection/qml/qmlinjection/MultiGraph.qml	2025-05-29 02:19:47.000000000 +0000
@@ -0,0 +1,168 @@
+// Copyright (C) 2024 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+import QtQuick
+import QtQuick.Controls.Fusion
+import QtQuick.Layouts
+
+import QtQuick3D
+import QtQuick3D.Helpers
+import QtGraphs
+import QtQml
+
+Item {
+    Scatter3D {
+        id: scatter
+        importScene: surf.rootNode
+        anchors.fill: parent
+
+        lightStrength: 0
+        ambientLightStrength: 0
+        theme: GraphsTheme {
+            id: graphTheme
+            colorScheme: GraphsTheme.ColorScheme.Dark
+            labelFont.pointSize: 7
+            plotAreaBackgroundVisible: false
+            gridVisible: false
+            labelsVisible: false
+            backgroundColor: "skyblue"
+        }
+
+        axisY.max: 100
+        axisX.max: 10
+        axisZ.max: 10
+        axisX.min: -1
+        axisZ.min: -1
+        Spline3DSeries {
+            id: scatterSeries1
+            splineVisible: true
+            splineColor: "red"
+            itemSize: 0.025
+            baseColor: "white"
+            itemLabelFormat: "Melbourne to Port Hedland International"
+            userDefinedMesh: ":/qml/qmlinjection/plane.mesh"
+            mesh: Abstract3DSeries.Mesh.UserDefined
+            meshRotation: Quaternion.fromAxisAndAngle(Qt.vector3d(0,1,0), -125)
+            ItemModelScatterDataProxy {
+                itemModel: ListModel {
+                    ListElement {x: "7.82"; z:"1.84"; height:"0.94";}
+                    ListElement {x: "4.48"; z:"4.88"; height:"17.0";}
+                    ListElement {x: "1.30"; z:"6.65"; height:"0.24";}
+                }
+                xPosRole: "x"
+                zPosRole: "z"
+                yPosRole: "height"
+            }
+        }
+        Spline3DSeries {
+            id: scatterSeries2
+            splineVisible: true
+            splineColor: "red"
+            itemSize: 0.025
+            baseColor: "white"
+            itemLabelFormat: "Hobart International to Cairns"
+            userDefinedMesh: ":/qml/qmlinjection/plane.mesh"
+            mesh: Abstract3DSeries.Mesh.UserDefined
+            meshRotation: Quaternion.fromAxisAndAngle(Qt.vector3d(0,1,0), 185)
+            ItemModelScatterDataProxy {
+                itemModel: ListModel {
+                    ListElement {x: "8.39"; z:"0.60"; height:"3.33";}
+                    ListElement {x: "8.05"; z:"4.97"; height:"15.0";}
+                    ListElement {x: "8.07"; z:"7.57"; height:"0.82";}
+                }
+                xPosRole: "x"
+                zPosRole: "z"
+                yPosRole: "height"
+            }
+        }
+        Spline3DSeries {
+            id: scatterSeries3
+            splineVisible: true
+            splineColor: "red"
+            itemSize: 0.025
+            baseColor: "white"
+            itemLabelFormat: "Perth to Darwin International"
+            userDefinedMesh: ":/qml/qmlinjection/plane.mesh"
+            mesh: Abstract3DSeries.Mesh.UserDefined
+            meshRotation: Quaternion.fromAxisAndAngle(Qt.vector3d(0,1,0), 145)
+            ItemModelScatterDataProxy {
+                itemModel: ListModel {
+                    ListElement {x: "0.76"; z:"3.28"; height:"1.84";}
+                    ListElement {x: "2.80"; z:"5.75"; height:"13.0";}
+                    ListElement {x: "4.45"; z:"8.82"; height:"0.98";}
+                }
+                xPosRole: "x"
+                zPosRole: "z"
+                yPosRole: "height"
+            }
+        }
+    }
+
+    Gradient {
+        id: surfGradient
+        GradientStop {position: 0.0; color: "darkblue"}
+        GradientStop {position: 0.1; color: "forestgreen"}
+        GradientStop {position: 0.15; color: "darkorange"}
+        GradientStop {position: 1.0; color: "palegoldenrod"}
+    }
+
+   Surface3D {
+       id: surf
+       width: surfOnTop.checked? parent.width : 0
+       height: surfOnTop.checked? parent.height : 0
+       importScene: lightNode
+
+       lightStrength: 0
+       ambientLightStrength: 0
+       axisY.max: 100
+       axisX.max: 10
+       axisZ.max: 10
+       axisX.min: -1
+       axisZ.min: -1
+
+       theme: GraphsTheme {
+           colorScheme: GraphsTheme.ColorScheme.Dark
+           labelFont.pointSize: 7
+           colorStyle: GraphsTheme.ColorStyle.ObjectGradient
+           baseGradients: [surfGradient] // Use the custom gradient
+           plotAreaBackgroundVisible: false
+           gridVisible: false
+           labelsVisible: false
+           backgroundColor: "skyblue"
+       }
+
+
+       Surface3DSeries {
+           id: heightSeries
+           shading: Surface3DSeries.Shading.Smooth
+           drawMode: Surface3DSeries.DrawSurface
+           meshSmooth: true
+           textureFile: "://qml/qmlinjection/australiaSatellite.jpg"
+
+           HeightMapSurfaceDataProxy {
+               heightMapFile: "://qml/qmlinjection/australia.png"
+               minYValue: 0
+               maxYValue: 7
+               autoScaleY: true
+           }
+       }
+   }
+
+   Node {
+       id: lightNode
+       DirectionalLight {
+           eulerRotation.x: -20
+           eulerRotation.y: 90
+           ambientColor: "navy"
+       }
+   }
+
+   RowLayout {
+       Text {
+           text : "Surface graph on top"
+       }
+       CheckBox {
+           id: surfOnTop
+       }
+   }
+}
diff -pruN 6.8.2-4/tests/manual/qmlinjection/qml/qmlinjection/MultiView.qml 6.9.1-1/tests/manual/qmlinjection/qml/qmlinjection/MultiView.qml
--- 6.8.2-4/tests/manual/qmlinjection/qml/qmlinjection/MultiView.qml	1970-01-01 00:00:00.000000000 +0000
+++ 6.9.1-1/tests/manual/qmlinjection/qml/qmlinjection/MultiView.qml	2025-05-29 02:19:47.000000000 +0000
@@ -0,0 +1,259 @@
+// Copyright (C) 2024 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+import QtQuick
+import QtQuick.Controls.Fusion
+import QtQuick.Layouts
+
+import QtQuick3D
+import QtQuick3D.Helpers
+import QtGraphs
+import QtQml
+
+Rectangle {
+    color: "black"
+
+    Rectangle {
+        id: topLeftOrig
+        anchors.left: parent.left
+        anchors.top: parent.top
+        width: parent.width * 0.5
+        height: parent.height * 0.5
+        color: "transparent"
+
+        Scatter3D {
+            id: scatter
+            anchors.fill: parent
+            anchors.margins: 2
+            shadowQuality: Graphs3D.ShadowQuality.None
+            selectionMode: Graphs3D.SelectionFlag.Item
+            msaaSamples: 4
+            aspectRatio: 3.0
+            rootNode.scale: Qt.vector3d(10,10,10)
+            ambientLightStrength: 0.5
+
+            Scatter3DSeries {
+                id: scatterSeries
+                ItemModelScatterDataProxy {
+                    id: scatterProxy
+                    itemModel: ListModel {
+                        ListElement{ coords: "0,0"; data: "20.0/10.0/4.75"; }
+                        ListElement{ coords: "1,0"; data: "21.1/10.3/3.00"; }
+                        ListElement{ coords: "2,0"; data: "22.5/10.7/1.24"; }
+                        ListElement{ coords: "3,0"; data: "24.0/10.5/2.53"; }
+                        ListElement{ coords: "0,1"; data: "20.2/11.2/3.55"; }
+                        ListElement{ coords: "1,1"; data: "21.3/11.5/3.03"; }
+                        ListElement{ coords: "2,1"; data: "22.6/11.7/3.46"; }
+                        ListElement{ coords: "3,1"; data: "23.4/11.5/4.12"; }
+                        ListElement{ coords: "0,2"; data: "20.2/12.3/3.37"; }
+                        ListElement{ coords: "1,2"; data: "21.1/12.4/2.98"; }
+                        ListElement{ coords: "2,2"; data: "22.5/12.1/3.33"; }
+                        ListElement{ coords: "3,2"; data: "23.3/12.7/3.23"; }
+                        ListElement{ coords: "0,3"; data: "20.7/13.3/5.34"; }
+                        ListElement{ coords: "1,3"; data: "21.5/13.2/4.54"; }
+                        ListElement{ coords: "2,3"; data: "22.4/13.6/4.65"; }
+                        ListElement{ coords: "3,3"; data: "23.2/13.4/6.67"; }
+                        ListElement{ coords: "0,4"; data: "20.6/15.0/6.01"; }
+                        ListElement{ coords: "1,4"; data: "21.3/14.6/5.83"; }
+                        ListElement{ coords: "2,4"; data: "22.5/14.8/7.32"; }
+                        ListElement{ coords: "3,4"; data: "23.7/14.3/6.90"; }
+                    }
+                    xPosRole: "coords"
+                    zPosRole: "coords"
+                    yPosRole: "data"
+                    xPosRolePattern: /(\d),\d/
+                    zPosRolePattern: /(\d),(\d)/
+                    yPosRolePattern: /^([^\/]*)\/([^\/]*)\/(.*)$/
+                    xPosRoleReplace: "\\1"
+                    zPosRoleReplace: "\\2"
+                    yPosRoleReplace: "\\3"
+                }
+            }
+        }
+    }
+
+    //Views
+    Rectangle {
+        id: topLeft
+        anchors.left: parent.left
+        anchors.top: parent.top
+        width: parent.width * 0.5
+        height: visButton.isEnabled? 0 : parent.height * 0.5
+        color: "transparent"
+
+        View3D {
+            id: topLeftView
+            anchors.fill: parent
+            anchors.margins: 2
+            camera: camTL
+            importScene: scatter.rootNode
+
+            environment: SceneEnvironment {
+                clearColor: scatter.theme.backgroundColor
+                backgroundMode: SceneEnvironment.Color
+            }
+
+            MouseArea {
+                anchors.fill: parent
+                onClicked: {
+                    var origin = topLeftView.mapTo3DScene(Qt.vector3d(mouseX, mouseY, 0))
+                    var far = topLeftView.mapTo3DScene(Qt.vector3d(mouseX, mouseY, 1))
+                    var direction = Qt.vector3d(far.x - origin.x,
+                                                far.y - origin.y,
+                                                far.z - origin.z );
+                    scatter.doRayPicking(origin, direction)
+                }
+            }
+        }
+    }
+
+    Rectangle {
+        id: topRight
+        anchors.right: parent.right
+        anchors.top: parent.top
+        width: parent.width * 0.5
+        height: parent.height * 0.5
+        color: "transparent"
+
+        View3D {
+            id: topRightView
+            anchors.fill: parent
+            anchors.margins: 2
+            camera: camTR
+            importScene: scatter.rootNode
+
+            environment: SceneEnvironment {
+                clearColor: scatter.theme.backgroundColor
+                backgroundMode: SceneEnvironment.Color
+            }
+
+            MouseArea {
+                anchors.fill: parent
+                onClicked: {
+                    var origin = topRightView.mapTo3DScene(Qt.vector3d(mouseX, mouseY, 0))
+                    var far = topRightView.mapTo3DScene(Qt.vector3d(mouseX, mouseY, 1))
+                    var direction = Qt.vector3d(far.x - origin.x,
+                                                far.y - origin.y,
+                                                far.z - origin.z );
+                    scatter.doRayPicking(origin, direction)
+                }
+            }
+        }
+    }
+
+    Rectangle {
+        id: bottomLeft
+        anchors.left: parent.left
+        anchors.bottom: parent.bottom
+        width: parent.width * 0.5
+        height: parent.height * 0.5
+        color: "transparent"
+        border.color: "black"
+
+        View3D {
+            id: bottomLeftView
+            anchors.fill: parent
+            anchors.margins: 2
+            camera: camBL
+            importScene: scatter.rootNode
+
+            environment: SceneEnvironment {
+                clearColor: scatter.theme.backgroundColor
+                backgroundMode: SceneEnvironment.Color
+            }
+            MouseArea {
+                anchors.fill: parent
+                onClicked: {
+                    var origin = bottomLeftView.mapTo3DScene(Qt.vector3d(mouseX, mouseY, 0))
+                    var far = bottomLeftView.mapTo3DScene(Qt.vector3d(mouseX, mouseY, 1))
+                    var direction = Qt.vector3d(far.x - origin.x,
+                                                far.y - origin.y,
+                                                far.z - origin.z );
+                    scatter.doRayPicking(origin, direction)
+                }
+            }
+        }
+    }
+
+    Rectangle {
+        id: bottomRight
+        anchors.right: parent.right
+        anchors.bottom: parent.bottom
+        width: parent.width * 0.5
+        height: parent.height * 0.5
+        color: "transparent"
+        border.color: "black"
+
+        View3D {
+            id: bottomRightView
+            anchors.fill: parent
+            anchors.margins: 2
+            camera: camBR
+            importScene: scatter.rootNode
+
+            environment: SceneEnvironment {
+                clearColor: scatter.theme.backgroundColor
+                backgroundMode: SceneEnvironment.Color
+            }
+
+            MouseArea {
+                anchors.fill: parent
+                onClicked: {
+                    var origin = bottomRightView.mapTo3DScene(Qt.vector3d(mouseX, mouseY, 0))
+                    var far = bottomRightView.mapTo3DScene(Qt.vector3d(mouseX, mouseY, 1))
+                    var direction = Qt.vector3d(far.x - origin.x,
+                                                far.y - origin.y,
+                                                far.z - origin.z );
+                    scatter.doRayPicking(origin, direction)
+                }
+            }
+        }
+    }
+
+    //Cameras
+    PerspectiveCamera {
+        id: camTL
+        position: Qt.vector3d(0, 10, 50)
+        lookAtNode: scatter.rootNode
+        eulerRotation.x: -30
+        clipNear: 0.001
+    }
+
+    OrthographicCamera {
+        id: camTR
+        y: 20
+
+        verticalMagnification: 5
+        horizontalMagnification: 5
+        eulerRotation.x: -90
+        clipNear: 0.001
+    }
+    OrthographicCamera {
+        id: camBL
+        y: 20
+
+        position: Qt.vector3d(0,3,0)
+        verticalMagnification: 10
+        horizontalMagnification: 10
+        clipNear: 0.001
+    }
+    OrthographicCamera {
+        id: camBR
+        y: 20
+
+        position: Qt.vector3d(0,3,0)
+        verticalMagnification: 10
+        horizontalMagnification: 10
+        eulerRotation.y: -90
+        clipNear: 0.001
+    }
+
+    Button {
+        id: visButton
+        property bool isEnabled: false
+        text: isEnabled ? "Hide original graph": "Show original graph"
+        onClicked: isEnabled = !isEnabled
+    }
+
+}
+
Binary files 6.8.2-4/tests/manual/qmlinjection/qml/qmlinjection/australia.png and 6.9.1-1/tests/manual/qmlinjection/qml/qmlinjection/australia.png differ
Binary files 6.8.2-4/tests/manual/qmlinjection/qml/qmlinjection/australiaSatellite.jpg and 6.9.1-1/tests/manual/qmlinjection/qml/qmlinjection/australiaSatellite.jpg differ
diff -pruN 6.8.2-4/tests/manual/qmlinjection/qml/qmlinjection/main.qml 6.9.1-1/tests/manual/qmlinjection/qml/qmlinjection/main.qml
--- 6.8.2-4/tests/manual/qmlinjection/qml/qmlinjection/main.qml	1970-01-01 00:00:00.000000000 +0000
+++ 6.9.1-1/tests/manual/qmlinjection/qml/qmlinjection/main.qml	2025-05-29 02:19:47.000000000 +0000
@@ -0,0 +1,47 @@
+// Copyright (C) 2024 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+import QtQuick
+import QtQuick.Controls.Fusion
+import QtQuick.Layouts
+import QtQml
+
+Item {
+    id: mainView
+    width: 1080
+    height: 720
+
+    TabBar {
+        id: tabBar
+        anchors.top: parent.top
+        anchors.left: parent.left
+        anchors.right: parent.right
+        contentHeight: 30
+
+        TabButton {
+            text: qsTr("Basic Injection")
+        }
+
+        TabButton {
+            text: qsTr("Multi-view")
+        }
+
+        TabButton {
+            text: qsTr("Multi-graph")
+        }
+    }
+
+    StackLayout {
+        anchors.top: tabBar.bottom
+        anchors.bottom: parent.bottom
+        anchors.left: parent.left
+        anchors.right: parent.right
+        currentIndex: tabBar.currentIndex
+
+        GraphInjection {}
+
+        MultiView {}
+
+        MultiGraph {}
+
+    }
+}
Binary files 6.8.2-4/tests/manual/qmlinjection/qml/qmlinjection/plane.mesh and 6.9.1-1/tests/manual/qmlinjection/qml/qmlinjection/plane.mesh differ
diff -pruN 6.8.2-4/tests/manual/qmllegend/CMakeLists.txt 6.9.1-1/tests/manual/qmllegend/CMakeLists.txt
--- 6.8.2-4/tests/manual/qmllegend/CMakeLists.txt	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/tests/manual/qmllegend/CMakeLists.txt	2025-05-29 02:19:47.000000000 +0000
@@ -4,7 +4,7 @@
 cmake_minimum_required(VERSION 3.16)
 
 if (NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT)
-    project(tst_qmllegend LANGUAGES C CXX ASM)
+    project(tst_qmllegend LANGUAGES C CXX)
     find_package(Qt6BuildInternals COMPONENTS STANDALONE_TEST)
 endif()
 
diff -pruN 6.8.2-4/tests/manual/qmlmultitest/CMakeLists.txt 6.9.1-1/tests/manual/qmlmultitest/CMakeLists.txt
--- 6.8.2-4/tests/manual/qmlmultitest/CMakeLists.txt	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/tests/manual/qmlmultitest/CMakeLists.txt	2025-05-29 02:19:47.000000000 +0000
@@ -4,7 +4,7 @@
 cmake_minimum_required(VERSION 3.16)
 
 if (NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT)
-    project(tst_qmlmultitest LANGUAGES C CXX ASM)
+    project(tst_qmlmultitest LANGUAGES C CXX)
     find_package(Qt6BuildInternals COMPONENTS STANDALONE_TEST)
 endif()
 
diff -pruN 6.8.2-4/tests/manual/qmlperf/CMakeLists.txt 6.9.1-1/tests/manual/qmlperf/CMakeLists.txt
--- 6.8.2-4/tests/manual/qmlperf/CMakeLists.txt	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/tests/manual/qmlperf/CMakeLists.txt	2025-05-29 02:19:47.000000000 +0000
@@ -4,7 +4,7 @@
 cmake_minimum_required(VERSION 3.16)
 
 if (NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT)
-    project(tst_qmlperf LANGUAGES C CXX ASM)
+    project(tst_qmlperf LANGUAGES C CXX)
     find_package(Qt6BuildInternals COMPONENTS STANDALONE_TEST)
 endif()
 
diff -pruN 6.8.2-4/tests/manual/qmlperf/qml/qmlperf/main.qml 6.9.1-1/tests/manual/qmlperf/qml/qmlperf/main.qml
--- 6.8.2-4/tests/manual/qmlperf/qml/qmlperf/main.qml	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/tests/manual/qmlperf/qml/qmlperf/main.qml	2025-05-29 02:19:47.000000000 +0000
@@ -191,9 +191,8 @@ Item {
 
             ColumnLayout {
                 id: transparencyContainer
-                visible: tabBar.currentIndex !== 0
                 Layout.fillWidth: true
-                Layout.preferredHeight: 30
+                Layout.preferredHeight: 60
                 Layout.margins: 10
                 Layout.alignment: Qt.AlignCenter
 
@@ -209,6 +208,10 @@ Item {
                     value: 1.0
                     onValueChanged: {
                         // change scattergradient alpha
+
+                        surfaceRedStop.color.a = value
+                        surfaceSeries.baseColor.a = value
+
                         scatterYGreenstop.color.a = value
                         scatterYBluestop.color.a = value
                         scatterYRedstop.color.a = value
@@ -222,6 +225,29 @@ Item {
                         barSeries.baseColor.a = value
                     }
                 }
+                Text {
+                    text: "Transparency Technique"
+                    Layout.fillWidth: true
+                    horizontalAlignment: Text.AlignHCenter
+                }
+
+                ComboBox {
+                    Layout.fillWidth: true
+                    textRole: "text"
+                    valueRole: "value"
+
+                    onActivated: {
+                        surfaceGraph.transparencyTechnique = currentValue
+                        scatterGraph.transparencyTechnique = currentValue
+                        barGraph.transparencyTechnique = currentValue
+                    }
+
+                    model : [
+                        { value: Graphs3D.TransparencyTechnique.Default, text: qsTr("Default") },
+                        { value: Graphs3D.TransparencyTechnique.Approximate, text: qsTr("Approximate") },
+                        { value: Graphs3D.TransparencyTechnique.Accurate, text: qsTr("Accurate") }
+                    ]
+                }
             }
 
             ColumnLayout {
@@ -424,7 +450,6 @@ Item {
                 axisY.max: 1
                 horizontalAspectRatio: 1.0
 
-
                 theme : GraphsTheme {
                     theme: GraphsTheme.Theme.QtGreen
                     colorStyle: GraphsTheme.ColorStyle.RangeGradient
@@ -432,8 +457,8 @@ Item {
 
                     Gradient {
                         id: surfaceGradient
-                        GradientStop { position: 1.0; color: "red" }
-                        GradientStop { position: 0.0; color: "blue" }
+                        GradientStop {id: surfaceRedStop; position: 1.0; color: "red" }
+                        GradientStop {id: surfaceBlueStop; position: 0.0; color: "blue" }
                     }
                 }
 
diff -pruN 6.8.2-4/tests/manual/qmlqtquick3dintegration/CMakeLists.txt 6.9.1-1/tests/manual/qmlqtquick3dintegration/CMakeLists.txt
--- 6.8.2-4/tests/manual/qmlqtquick3dintegration/CMakeLists.txt	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/tests/manual/qmlqtquick3dintegration/CMakeLists.txt	2025-05-29 02:19:47.000000000 +0000
@@ -4,7 +4,7 @@
 cmake_minimum_required(VERSION 3.16)
 
 if (NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT)
-    project(tst_qmlqtquick3dintegration LANGUAGES C CXX ASM)
+    project(tst_qmlqtquick3dintegration LANGUAGES C CXX)
     find_package(Qt6BuildInternals COMPONENTS STANDALONE_TEST)
 endif()
 
diff -pruN 6.8.2-4/tests/manual/qmlspline/CMakeLists.txt 6.9.1-1/tests/manual/qmlspline/CMakeLists.txt
--- 6.8.2-4/tests/manual/qmlspline/CMakeLists.txt	1970-01-01 00:00:00.000000000 +0000
+++ 6.9.1-1/tests/manual/qmlspline/CMakeLists.txt	2025-05-29 02:19:47.000000000 +0000
@@ -0,0 +1,31 @@
+# Copyright (C) 2024 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
+set(CMAKE_INCLUDE_CURRENT_DIR ON)
+
+qt_internal_add_manual_test(tst_qmlspline
+    GUI
+    SOURCES
+        main.cpp
+    )
+
+target_sources(tst_qmlspline
+  PRIVATE
+    splinegen.h splinegen.cpp
+)
+
+target_link_libraries(tst_qmlspline PUBLIC
+    Qt::Gui
+    Qt::Graphs
+    )
+
+set(qmlspline_resource_files
+    "qml/qmlspline/main.qml"
+    )
+
+qt_internal_add_resource(tst_qmlspline "qmlspline"
+    PREFIX
+    "/"
+    FILES
+    ${qmlspline_resource_files}
+    )
diff -pruN 6.8.2-4/tests/manual/qmlspline/main.cpp 6.9.1-1/tests/manual/qmlspline/main.cpp
--- 6.8.2-4/tests/manual/qmlspline/main.cpp	1970-01-01 00:00:00.000000000 +0000
+++ 6.9.1-1/tests/manual/qmlspline/main.cpp	2025-05-29 02:19:47.000000000 +0000
@@ -0,0 +1,38 @@
+// Copyright (C) 2024 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#include "splinegen.h"
+
+#include <QtCore/QDir>
+#include <QtGui/QGuiApplication>
+#include <QtQml/QQmlContext>
+#include <QtQml/QQmlEngine>
+#include <QtQuick/QQuickView>
+
+int main(int argc, char *argv[]) {
+  QGuiApplication app(argc, argv);
+
+  QQuickView viewer;
+
+  // The following are needed to make examples run without having to install the
+  // module in desktop environments.
+#ifdef Q_OS_WIN
+  QString extraImportPath(QStringLiteral("%1/../../../%2"));
+#else
+  QString extraImportPath(QStringLiteral("%1/../../%2"));
+#endif
+  viewer.engine()->addImportPath(extraImportPath.arg(
+      QGuiApplication::applicationDirPath(), QString::fromLatin1("qml")));
+  QObject::connect(viewer.engine(), &QQmlEngine::quit, &viewer,
+                   &QWindow::close);
+
+  SplineGen splineGen;
+  viewer.rootContext()->setContextProperty("splineGen", &splineGen);
+
+  viewer.setTitle(QStringLiteral("QML Scatter spline"));
+  viewer.setSource(QUrl("qrc:/qml/qmlspline/main.qml"));
+  viewer.setResizeMode(QQuickView::SizeRootObjectToView);
+  viewer.show();
+
+  return app.exec();
+}
diff -pruN 6.8.2-4/tests/manual/qmlspline/qml/qmlspline/main.qml 6.9.1-1/tests/manual/qmlspline/qml/qmlspline/main.qml
--- 6.8.2-4/tests/manual/qmlspline/qml/qmlspline/main.qml	1970-01-01 00:00:00.000000000 +0000
+++ 6.9.1-1/tests/manual/qmlspline/qml/qmlspline/main.qml	2025-05-29 02:19:47.000000000 +0000
@@ -0,0 +1,195 @@
+// Copyright (C) 2024 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+import QtCore
+import QtQuick
+import QtQuick.Layouts
+import QtQuick.Controls.Fusion
+import QtQuick3D.Helpers
+import QtQuick.Dialogs
+import QtGraphs
+import "."
+
+Item {
+    id: mainView
+    width: 1280
+    height: 1024
+
+
+    Scatter3D {
+        id: scatterGraph
+        property int splineType: 0
+        width: parent.width
+        height: parent.height
+        aspectRatio: 1
+        axisX.min: -1.2
+        axisX.max: 1.2
+        axisZ.min: -1.2
+        axisZ.max: 1.2
+        theme: GraphsTheme {
+            theme: GraphsTheme.Theme.QtGreen
+            colorStyle: GraphsTheme.ColorStyle.Uniform
+        }
+
+        Spline3DSeries {
+            id: splineSeries
+
+            splineVisible: true
+            splineTension: tensionSlider.value
+            splineKnotting: knottingSlider.value
+            splineLooping: looping.checked
+            splineResolution: resolution.value
+            itemSize: pointSizeSlider.value
+            baseColor: "white"
+
+            Component.onCompleted: splineGen.generateSpline(splineSeries, scatterGraph.splineType, points.value)
+        }
+    }
+
+
+    RowLayout {
+        id: settings
+        anchors.top: parent.top
+        anchors.left: parent.left
+
+        ComboBox {
+            id: splineTypeBox
+            model: ["Circle","Helix", "Stitch curve"]
+            onActivated:  {
+                scatterGraph.splineType = currentIndex
+                splineGen.generateSpline(splineSeries, scatterGraph.splineType, points.value)
+            }
+        }
+
+        Button {
+            id: liveToggle
+            text: liveTimer.running? "Static" : "Live"
+            onClicked: liveTimer.running = !liveTimer.running
+        }
+
+        ColumnLayout {
+            Text {
+                text: qsTr("Number of points")
+                color: "white"
+            }
+
+            SpinBox {
+                id: points
+                from: 0
+                value: 64
+                to: 80
+                editable: true
+                onValueChanged: splineGen.generateSpline(splineSeries, scatterGraph.splineType, value);
+            }
+        }
+
+
+        ColumnLayout {
+            Text {
+                text: qsTr("Point size")
+                color: "white"
+            }
+            Slider {
+                id: pointSizeSlider
+                from: 0.001
+                to: 0.1
+                value: 0.001
+            }
+        }
+
+        ColumnLayout {
+            Text {
+                text: qsTr("Spline color")
+                color: "white"
+            }
+
+            Button{
+                height: 25
+                width: 25
+
+                onClicked: splineCol.open()
+                Rectangle {
+                    anchors.fill: parent
+                    anchors.margins: 5
+                    color: splineSeries.splineColor
+                }
+            }
+
+            ColorDialog {
+                id: splineCol
+                selectedColor: splineSeries.splineColor
+                onAccepted: splineSeries.splineColor = selectedColor
+            }
+        }
+
+        ColumnLayout {
+            Text {
+                text: qsTr("Spline resolution")
+                color: "white"
+            }
+
+            SpinBox {
+                id: resolution
+                from: 2
+                value: 10
+                to: 30
+                editable: true
+            }
+        }
+    }
+
+    RowLayout {
+        id: splineSettings
+        anchors.top: settings.bottom
+
+        ColumnLayout {
+            Text {
+                id: tensionText
+                text: qsTr("Tension")
+                color: "white"
+            }
+            Slider {
+                id: tensionSlider
+                from: 0
+                to: 1
+                value: 0
+                stepSize: 0.1
+            }
+        }
+
+        ColumnLayout {
+            Text {
+                id: knottingText
+                color: "white"
+                text: qsTr("Knotting")
+            }
+            Slider {
+                id: knottingSlider
+                from: 0
+                to: 1
+                value: 0.5
+                stepSize: 0.1
+            }
+        }
+        ColumnLayout {
+            Text {
+                id: loopingText
+                text: qsTr("Looping")
+                color: "white"
+            }
+            CheckBox {
+                id: looping
+                checked: false
+            }
+        }
+    }
+
+
+    Timer {
+        id: liveTimer
+        interval: 1000 / 60
+        repeat: true
+        running: false
+        onTriggered: splineGen.tickSpline(splineSeries)
+    }
+}
diff -pruN 6.8.2-4/tests/manual/qmlspline/splinegen.cpp 6.9.1-1/tests/manual/qmlspline/splinegen.cpp
--- 6.8.2-4/tests/manual/qmlspline/splinegen.cpp	1970-01-01 00:00:00.000000000 +0000
+++ 6.9.1-1/tests/manual/qmlspline/splinegen.cpp	2025-05-29 02:19:47.000000000 +0000
@@ -0,0 +1,133 @@
+// Copyright (C) 2024 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+#include "splinegen.h"
+
+SplineGen::SplineGen(QObject *parent)
+    : QObject(parent)
+{
+    qRegisterMetaType<QScatter3DSeries *>();
+}
+
+SplineGen::~SplineGen()
+{
+    m_series->deleteLater();
+    m_splineCache.clear();
+}
+
+void SplineGen::generateSpline(QScatter3DSeries *series, SplineType type, int points)
+{
+    if (m_series != series)
+        m_series = series;
+
+    switch (type) {
+    case (SplineType::Circle):
+        genCircle(points);
+        break;
+    case (SplineType::Helix):
+        genHelix(points);
+        break;
+    case (SplineType::Stitch):
+        genStitch(points);
+        break;
+    }
+    series->dataProxy()->resetArray(m_splineCache.at(0));
+}
+
+void SplineGen::tickSpline(QScatter3DSeries *series)
+{
+    if (!series || series->dataProxy()->itemCount() == 0)
+        return;
+
+    static int index = 0;
+    int points = series->dataProxy()->itemCount();
+
+    QScatterDataArray newArray;
+    newArray.reserve(points);
+
+    const QScatterDataArray &cache = m_splineCache.at(index);
+    for (int i = 0; i < points; i++) {
+        newArray.append(cache.at(i));
+    }
+
+    series->dataProxy()->resetArray(newArray);
+    index++;
+    if (index >= m_cacheCount)
+        index = 0;
+}
+
+void SplineGen::genCircle(int points)
+{
+    for (int i = 0; i < m_splineCache.size(); i++) {
+        QScatterDataArray &array = m_splineCache[i];
+        array.clear();
+    }
+
+    m_splineCache.resize(m_cacheCount);
+    for (int i = 0; i < m_cacheCount; i++) {
+        QScatterDataArray &array = m_splineCache[i];
+        array.reserve(points);
+        float offset = 2 * M_PI * i / m_cacheCount;
+        for (int j = 0; j < points; j++) {
+            float t = 2 * M_PI * j / points;
+            float x = qCos(t + offset);
+            float y = 0.5;
+            float z = qSin(t + offset);
+            array.append(QScatterDataItem(x, y, z));
+        }
+    }
+}
+
+void SplineGen::genHelix(int points)
+{
+    for (int i = 0; i < m_splineCache.size(); i++) {
+        QScatterDataArray &array = m_splineCache[i];
+        array.clear();
+    }
+
+    // create cache array;
+
+    m_splineCache.resize(m_cacheCount);
+    for (int i = 0; i < m_cacheCount; i++) {
+        QScatterDataArray &array = m_splineCache[i];
+        array.reserve(points);
+        float offset = 2 * M_PI * i / m_cacheCount;
+        for (int j = 0; j < points; j++) {
+            //8 points per revolution
+
+            float t = 4 * M_PI * j / points;
+            float x = qCos(t + offset);
+            float y = t;
+            float z = qSin(t + offset);
+            array.append(QScatterDataItem(x, y, z));
+        }
+    }
+}
+
+void SplineGen::genStitch(int points)
+{
+    for (int i = 0; i < m_splineCache.size(); i++) {
+        QScatterDataArray &array = m_splineCache[i];
+        array.clear();
+    }
+    m_splineCache.resize(m_cacheCount);
+    for (int i = 0; i < m_cacheCount; i++) {
+        QScatterDataArray &array = m_splineCache[i];
+
+        float t = qSin(2 * M_PI * float(i) / float(m_cacheCount));
+        // round to closest fitting amount
+        int pointsPerAxis = int(qFloor(float(points) / 3.0));
+        int rounds = int(qCeil(float(pointsPerAxis) / 2.0));
+        array.reserve(pointsPerAxis * 3 + rounds);
+        const QVector3D masks[3] = {QVector3D(t, 1, 0), QVector3D(1, 0, t), QVector3D(0, t, 1)};
+        for (int j = 1; j <= rounds; j++) {
+            bool top = true;
+            for (int k = 0; k < 7; k++) {
+                float value = top ? pointsPerAxis + 1 - j : j;
+                value /= pointsPerAxis;
+                top = !top;
+                QVector3D p = masks[k % 3] * value;
+                array.append(QScatterDataItem(p));
+            }
+        }
+    }
+}
diff -pruN 6.8.2-4/tests/manual/qmlspline/splinegen.h 6.9.1-1/tests/manual/qmlspline/splinegen.h
--- 6.8.2-4/tests/manual/qmlspline/splinegen.h	1970-01-01 00:00:00.000000000 +0000
+++ 6.9.1-1/tests/manual/qmlspline/splinegen.h	2025-05-29 02:19:47.000000000 +0000
@@ -0,0 +1,35 @@
+// Copyright (C) 2024 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+#ifndef SPLINEGEN_H
+#define SPLINEGEN_H
+
+#include <QtGraphs>
+
+enum class SplineType {
+    Circle,
+    Helix,
+    Stitch,
+};
+class SplineGen : public QObject
+{
+    Q_OBJECT
+    Q_ENUM(SplineType)
+public:
+    SplineGen(QObject *parent = 0);
+    ~SplineGen() override;
+
+public Q_SLOTS:
+    void generateSpline(QScatter3DSeries *series, SplineType type, int points);
+    void tickSpline(QScatter3DSeries *series);
+
+private:
+    void genCircle(int points);
+    void genHelix(int points);
+    void genStitch(int points);
+    int m_cacheCount = 60;
+
+    QScatter3DSeries *m_series = nullptr;
+    QList<QScatterDataArray> m_splineCache;
+};
+
+#endif // SPLINEGEN_H
diff -pruN 6.8.2-4/tests/manual/qmlsurfacelayers/CMakeLists.txt 6.9.1-1/tests/manual/qmlsurfacelayers/CMakeLists.txt
--- 6.8.2-4/tests/manual/qmlsurfacelayers/CMakeLists.txt	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/tests/manual/qmlsurfacelayers/CMakeLists.txt	2025-05-29 02:19:47.000000000 +0000
@@ -4,7 +4,7 @@
 cmake_minimum_required(VERSION 3.16)
 
 if (NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT)
-    project(tst_qmlsurfacelayers LANGUAGES C CXX ASM)
+    project(tst_qmlsurfacelayers LANGUAGES C CXX)
     find_package(Qt6BuildInternals COMPONENTS STANDALONE_TEST)
 endif()
 
diff -pruN 6.8.2-4/tests/manual/qmlsurfacelayers/qml/qmlsurfacelayers/main.qml 6.9.1-1/tests/manual/qmlsurfacelayers/qml/qmlsurfacelayers/main.qml
--- 6.8.2-4/tests/manual/qmlsurfacelayers/qml/qmlsurfacelayers/main.qml	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/tests/manual/qmlsurfacelayers/qml/qmlsurfacelayers/main.qml	2025-05-29 02:19:47.000000000 +0000
@@ -9,11 +9,12 @@ import "."
 
 Item {
     id: mainview
-    width: 1280
-    height: 720
+    width: 1920
+    height: 1080
 
     property real fontSize: 12
     property real windowRatio: 4
+    property real maxAxisSegmentCount: 20
 
     Item {
         id: surfaceView
@@ -220,6 +221,93 @@ Item {
         }
         //! [5]
 
+        GroupBox {
+            Layout.fillWidth: true
+            background: Rectangle {
+                anchors.fill: parent
+                color: "white"
+            }
+
+            Column {
+                padding :10
+                spacing: 10
+                Label {
+                    font.pointSize: fontSize
+                    font.bold: true
+                    text: "Axis Segments"
+                }
+
+                Column {
+                    Label {
+                        text: "X Axis Segments"
+                    }
+                    Slider {
+                        id: axisSegmentX
+                        from: 1
+                        to: maxAxisSegmentCount
+                        value: surfaceLayers.axisX.segmentCount
+
+                        onValueChanged: surfaceLayers.axisX.segmentCount = value
+                    }
+
+                    Slider {
+                        id: subAxisSegmentX
+                        from: 1
+                        to: maxAxisSegmentCount
+                        value: surfaceLayers.axisX.subSegmentCount
+
+                        onValueChanged: surfaceLayers.axisX.subSegmentCount = value
+                    }
+                }
+
+                Column {
+                    Label {
+                        text: "Y Axis Segments"
+                    }
+                    Slider {
+                        id: axisSegmentY
+                        from: 1
+                        to: maxAxisSegmentCount
+                        value: surfaceLayers.axisY.segmentCount
+
+                        onValueChanged: surfaceLayers.axisY.segmentCount = value
+                    }
+
+                    Slider {
+                        id: subAxisSegmentY
+                        from: 1
+                        to: maxAxisSegmentCount
+                        value: surfaceLayers.axisY.subSegmentCount
+
+                        onValueChanged: surfaceLayers.axisY.subSegmentCount = value
+                    }
+                }
+
+                Column {
+                    Label {
+                        text: "Z Axis Segments"
+                    }
+                    Slider {
+                        id: axisSegmentZ
+                        from: 1
+                        to: maxAxisSegmentCount
+                        value: surfaceLayers.axisZ.segmentCount
+
+                        onValueChanged: surfaceLayers.axisZ.segmentCount = value
+                    }
+
+                    Slider {
+                        id: subAxisSegmentZ
+                        from: 1
+                        to: maxAxisSegmentCount
+                        value: surfaceLayers.axisZ.subSegmentCount
+
+                        onValueChanged: surfaceLayers.axisZ.subSegmentCount = value
+                    }
+                }
+            }
+        }
+
         //! [6]
         Button {
             id: sliceButton
diff -pruN 6.8.2-4/tests/manual/qmltestbed/CMakeLists.txt 6.9.1-1/tests/manual/qmltestbed/CMakeLists.txt
--- 6.8.2-4/tests/manual/qmltestbed/CMakeLists.txt	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/tests/manual/qmltestbed/CMakeLists.txt	2025-05-29 02:19:47.000000000 +0000
@@ -4,7 +4,7 @@
 cmake_minimum_required(VERSION 3.16)
 
 if (NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT)
-    project(tst_qmltestbed LANGUAGES C CXX ASM)
+    project(tst_qmltestbed LANGUAGES C CXX)
     find_package(Qt6BuildInternals COMPONENTS STANDALONE_TEST)
 endif()
 
@@ -56,6 +56,7 @@ set(qmltestbed_resource_files
     "qml/qmltestbed/AddRemovePie.qml"
     "qml/qmltestbed/QmlUsageSeries.qml"
     "qml/qmltestbed/PieModelMapping.qml"
+    "qml/qmltestbed/CustomInput.qml"
     "qml/qmltestbed/images/arrow_icon.png"
     "qml/qmltestbed/images/icon_settings.png"
     "qml/qmltestbed/images/happy_box.png"
diff -pruN 6.8.2-4/tests/manual/qmltestbed/qml/qmltestbed/AxisGridSetup.qml 6.9.1-1/tests/manual/qmltestbed/qml/qmltestbed/AxisGridSetup.qml
--- 6.8.2-4/tests/manual/qmltestbed/qml/qmltestbed/AxisGridSetup.qml	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/tests/manual/qmltestbed/qml/qmltestbed/AxisGridSetup.qml	2025-05-29 02:19:47.000000000 +0000
@@ -26,6 +26,7 @@ Rectangle {
             categories: [1, 2, 3, 4, 5, 6]
             gridVisible: checkBoxGridXMajor.checked
             subGridVisible: checkBoxGridXMinor.checked
+            alignment: checkBoxAxisXAlignment.checked ? Qt.AlignTop : Qt.AlignBottom
         }
         axisY: ValueAxis {
             id: yAxis
@@ -40,11 +41,12 @@ Rectangle {
             //labelDecimals: 3
             gridVisible: checkBoxGridYMajor.checked
             subGridVisible: checkBoxGridYMinor.checked
+            alignment: checkBoxAxisYAlignment.checked ? Qt.AlignRight : Qt.AlignLeft
         }
         theme: GraphsTheme {
             id: myTheme
             colorScheme: GraphsTheme.ColorScheme.Dark
-            backgroundColor: "#20000000"
+            backgroundColor: "#80000000"
             plotAreaBackgroundColor: "#20000000"
             seriesColors: ["#dd444444", "#dd555555", "#dd666666", "#dd777777", "#dd888888"]
             borderColors: ["#111111", "#222222", "#333333", "#444444", "#555555"]
@@ -69,8 +71,9 @@ Rectangle {
                 Rectangle {
                     id: comp
                     property color barColor
+                    property int barIndex
                     gradient: Gradient {
-                        GradientStop { position: 0.0; color: "red" }
+                        GradientStop { position: 0.0; color: (comp.barIndex % 2 === 0) ? "#f02020" : "#d0d020"}
                         GradientStop { position: 0.4; color: Qt.darker(comp.barColor, 2.0) }
                         GradientStop { position: 1.0; color: comp.barColor }
                     }
@@ -81,6 +84,16 @@ Rectangle {
             }
         }
     }
+    Rectangle {
+        x: chartView.x + chartView.plotArea.x
+        y: chartView.y + chartView.plotArea.y
+        width: chartView.plotArea.width
+        height: chartView.plotArea.height
+        color: "transparent"
+        border.color: "red"
+        border.width: 2
+        visible: checkBoxShowPlotArea.checked
+    }
 
     SettingsView {
         id: settingsView
@@ -167,6 +180,21 @@ Rectangle {
             checked: false
         }
         CustomCheckBox {
+            id: checkBoxShowPlotArea
+            text: "Show Plot Area"
+            checked: false
+        }
+        CustomCheckBox {
+            id: checkBoxAxisXAlignment
+            text: "Axis X: Bottom/Top"
+            checked: false
+        }
+        CustomCheckBox {
+            id: checkBoxAxisYAlignment
+            text: "Axis Y: Left/Right"
+            checked: false
+        }
+        CustomCheckBox {
             id: checkBoxAxisXVisible
             text: "Axis X: Visible"
             checked: true
diff -pruN 6.8.2-4/tests/manual/qmltestbed/qml/qmltestbed/CustomInput.qml 6.9.1-1/tests/manual/qmltestbed/qml/qmltestbed/CustomInput.qml
--- 6.8.2-4/tests/manual/qmltestbed/qml/qmltestbed/CustomInput.qml	1970-01-01 00:00:00.000000000 +0000
+++ 6.9.1-1/tests/manual/qmltestbed/qml/qmltestbed/CustomInput.qml	2025-05-29 02:19:47.000000000 +0000
@@ -0,0 +1,848 @@
+// Copyright (C) 2024 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Layouts
+import QtGraphs
+
+ColumnLayout {
+    anchors.fill: parent
+
+    TabBar {
+        id: tab
+        Layout.fillWidth: true
+        TabButton {
+            text: "Bar"
+        }
+        TabButton {
+            text: "Area"
+        }
+        TabButton {
+            text: "Pie"
+        }
+        TabButton {
+            text: "Line"
+        }
+    }
+
+    StackLayout {
+        currentIndex: tab.currentIndex
+
+        // Bar Graph
+        RowLayout {
+            GraphsView {
+                Layout.fillWidth: true
+                Layout.fillHeight: true
+
+                axisX: BarCategoryAxis {
+                    categories: ["2023", "2024", "2025", "2026"]
+                    subGridVisible: false
+                }
+
+                axisY: ValueAxis {
+                    max: 10
+                    subTickCount: 9
+                }
+
+                theme: GraphsTheme {
+                    colorScheme: GraphsTheme.ColorScheme.Dark
+                    theme: GraphsTheme.Theme.QtGreen
+                }
+
+                BarSeries {
+                    selectable: true
+                    BarSet { id: set1; label: "Axel"; values: [1, 2, 3, 4]; selectedColor: "red" }
+                    BarSet { id: set2; label: "Frank"; values: [8, 2, 6, 0] }
+                    BarSet { id: set3; label: "James"; values: [4+3*Math.sin(fA.elapsedTime), 5+3*Math.sin(fA.elapsedTime), 2, 3] }
+                    FrameAnimation {
+                        id: fA
+                        running: true
+                    }
+                    onPressed: (index, barset) => {
+                                   barPressedIndex.text = "Index : " + index
+                                   barPressedLabel.text = "Label : " + barset.label
+                               }
+                    onReleased: (index, barset) => {
+                                    barReleasedIndex.text = "Index : " + index
+                                    barReleasedLabel.text = "Label : " + barset.label
+                                }
+                    onClicked: (index, barset) => {
+                                   barClickedIndex.text = "Index : " + index
+                                   barClickedLabel.text = "Label : " + barset.label
+                               }
+                    onDoubleClicked: (index, barset) => {
+                                         barDoubleClickedIndex.text = "Index : " + index
+                                         barDoubleClickedLabel.text = "Label : " + barset.label
+                                     }
+                    onHoverEnter: (seriesName, position, value) => {
+                                      barHoverEnteredSeries.text = "Series : " + seriesName
+                                      barHoverEnteredPosition.text = "Position : " + position
+                                      barHoverEnteredValue.text = "Value : " + value
+                                  }
+                    onHover: (seriesName, position, value) => {
+                                 barHoverSeries.text = "Series : " + seriesName
+                                 barHoverPosition.text = "Position : " + position
+                                 barHoverValue.text = "Value : " + value
+                             }
+                    onHoverExit: (seriesName, position) => {
+                                     barHoverExitSeries.text = "Series : " + seriesName
+                                     barHoverExitPosition.text = "Position : " + position
+                                 }
+                }
+            }
+
+            Column {
+                Layout.minimumWidth: 250
+                spacing: 5
+
+                Text {
+                    text: "Pressed"
+                    color: "white"
+                    font.pointSize: 20
+                }
+
+                Text {
+                    id: barPressedIndex
+                    text: "Index :"
+                    color: "white"
+                }
+
+                Text {
+                    id: barPressedLabel
+                    text: "Label :"
+                    color: "white"
+                }
+
+                Text {
+                    text: "Released"
+                    color: "white"
+                    font.pointSize: 20
+                }
+
+                Text {
+                    id: barReleasedIndex
+                    text: "Index :"
+                    color: "white"
+                }
+
+                Text {
+                    id: barReleasedLabel
+                    text: "Label :"
+                    color: "white"
+                }
+
+                Text {
+                    text: "Clicked"
+                    color: "white"
+                    font.pointSize: 20
+                }
+
+                Text {
+                    id: barClickedIndex
+                    text: "Index :"
+                    color: "white"
+                }
+
+                Text {
+                    id: barClickedLabel
+                    text: "Label :"
+                    color: "white"
+                }
+
+                Text {
+                    text: "DoubleClicked"
+                    color: "white"
+                    font.pointSize: 20
+                }
+
+                Text {
+                    id: barDoubleClickedIndex
+                    text: "Index :"
+                    color: "white"
+                }
+
+                Text {
+                    id: barDoubleClickedLabel
+                    text: "Label :"
+                    color: "white"
+                }
+
+                Text {
+                    text: "HoverEnterd"
+                    color: "white"
+                    font.pointSize: 20
+                }
+
+                Text {
+                    id: barHoverEnteredSeries
+                    text: "Series :"
+                    color: "white"
+                }
+
+                Text {
+                    id: barHoverEnteredPosition
+                    text: "Position :"
+                    color: "white"
+                }
+
+                Text {
+                    id: barHoverEnteredValue
+                    text: "Value :"
+                    color: "white"
+                }
+
+                Text {
+                    text: "Hover"
+                    color: "white"
+                    font.pointSize: 20
+                }
+
+                Text {
+                    id: barHoverSeries
+                    text: "Series :"
+                    color: "white"
+                }
+
+                Text {
+                    id: barHoverPosition
+                    text: "Position :"
+                    color: "white"
+                }
+
+                Text {
+                    id: barHoverValue
+                    text: "Value :"
+                    color: "white"
+                }
+
+                Text {
+                    text: "HoverExit"
+                    color: "white"
+                    font.pointSize: 20
+                }
+
+                Text {
+                    id: barHoverExitSeries
+                    text: "Series :"
+                    color: "white"
+                }
+
+                Text {
+                    id: barHoverExitPosition
+                    text: "Position :"
+                    color: "white"
+                }
+            }
+        }
+
+        // Area Graph
+        RowLayout {
+            GraphsView {
+                Layout.fillWidth: true
+                Layout.fillHeight: true
+
+                axisX: ValueAxis {
+                    max: 8
+                }
+                axisY: ValueAxis {
+                    max: 4
+                }
+
+                theme: GraphsTheme {
+                    colorScheme: GraphsTheme.ColorScheme.Dark
+                    theme: GraphsTheme.Theme.QtGreen
+                }
+
+                AreaSeries {
+                    selectable: true
+                    hoverable: true
+
+                    upperSeries: SplineSeries {
+                        XYPoint { x: 3; y: 1 }
+                        XYPoint { x: 4; y: 2.5 }
+                        XYPoint { x: 5; y: 2.8 }
+                    }
+
+                    lowerSeries: SplineSeries {
+                        XYPoint { x: 3.4; y: 0.5 }
+                        XYPoint { x: 4; y: 1.5 }
+                        XYPoint { x: 5; y: 2 }
+                    }
+
+                    onPressed: (point) => {
+                                   areaPressedPoint.text = "Point : " + point
+                               }
+
+                    onReleased: (point) => {
+                                    areaReleasedPoint.text = "Point : " + point
+                                }
+
+                    onClicked: (point) => {
+                                   areaClickedPoint.text = "Point : " + point
+                               }
+
+                    onDoubleClicked: (point) => {
+                                         areaDoubleClickedPoint.text = "Point : " + point
+                                     }
+
+                    onHoverEnter: (seriesName, position, value) => {
+                                      areaHoverEnteredSeries.text = "Series : " + seriesName
+                                      areaHoverEnteredPosition.text = "Position : " + position
+                                      areaHoverEnteredValue.text = "Value : " + value
+                                  }
+                    onHover: (seriesName, position, value) => {
+                                 areaHoverSeries.text = "Series : " + seriesName
+                                 areaHoverPosition.text = "Position : " + position
+                                 areaHoverValue.text = "Value : " + value
+                             }
+                    onHoverExit: (seriesName, position) => {
+                                     areaHoverExitSeries.text = "Series : " + seriesName
+                                     areaHoverExitPosition.text = "Position : " + position
+                                 }
+                }
+            }
+
+            Column {
+                Layout.minimumWidth: 250
+                spacing: 5
+
+                Text {
+                    text: "Pressed"
+                    color: "white"
+                    font.pointSize: 20
+                }
+
+                Text {
+                    id: areaPressedPoint
+                    text: "Point :"
+                    color: "white"
+                }
+
+                Text {
+                    text: "Released"
+                    color: "white"
+                    font.pointSize: 20
+                }
+
+                Text {
+                    id: areaReleasedPoint
+                    text: "Point :"
+                    color: "white"
+                }
+
+                Text {
+                    text: "Clicked"
+                    color: "white"
+                    font.pointSize: 20
+                }
+
+                Text {
+                    id: areaClickedPoint
+                    text: "Point :"
+                    color: "white"
+                }
+
+                Text {
+                    text: "DoubleClicked"
+                    color: "white"
+                    font.pointSize: 20
+                }
+
+                Text {
+                    id: areaDoubleClickedPoint
+                    text: "Point :"
+                    color: "white"
+                }
+
+                Text {
+                    text: "HoverEnterd"
+                    color: "white"
+                    font.pointSize: 20
+                }
+
+                Text {
+                    id: areaHoverEnteredSeries
+                    text: "Series :"
+                    color: "white"
+                }
+
+                Text {
+                    id: areaHoverEnteredPosition
+                    text: "Position :"
+                    color: "white"
+                }
+
+                Text {
+                    id: areaHoverEnteredValue
+                    text: "Value :"
+                    color: "white"
+                }
+
+                Text {
+                    text: "Hover"
+                    color: "white"
+                    font.pointSize: 20
+                }
+
+                Text {
+                    id: areaHoverSeries
+                    text: "Series :"
+                    color: "white"
+                }
+
+                Text {
+                    id: areaHoverPosition
+                    text: "Position :"
+                    color: "white"
+                }
+
+                Text {
+                    id: areaHoverValue
+                    text: "Value :"
+                    color: "white"
+                }
+
+                Text {
+                    text: "HoverExit"
+                    color: "white"
+                    font.pointSize: 20
+                }
+
+                Text {
+                    id: areaHoverExitSeries
+                    text: "Series :"
+                    color: "white"
+                }
+
+                Text {
+                    id: areaHoverExitPosition
+                    text: "Position :"
+                    color: "white"
+                }
+            }
+        }
+
+        // Pie Graph
+        RowLayout {
+            GraphsView {
+                Layout.fillWidth: true
+                Layout.fillHeight: true
+
+                theme: GraphsTheme {
+                    colorScheme: GraphsTheme.ColorScheme.Dark
+                    theme: GraphsTheme.Theme.QtGreen
+                }
+
+                PieSeries {
+                    selectable: true
+                    hoverable: true
+                    PieSlice {
+                        label: "Volkswagen"
+                        labelVisible: true
+                        value: 13.5
+                        exploded: true
+                    }
+                    PieSlice {
+                        label: "Toyota"
+                        labelVisible: true
+                        labelPosition: PieSlice.LabelPosition.InsideHorizontal
+                        labelColor: 'black'
+                        value: 10.9
+                    }
+                    PieSlice {
+                        label: "Ford"
+                        labelVisible: true
+                        labelPosition: PieSlice.LabelPosition.InsideNormal
+                        labelColor: 'black'
+                        value: 8.6
+                    }
+                    PieSlice {
+                        label: "Skoda"
+                        labelVisible: true
+                        labelPosition: PieSlice.LabelPosition.InsideTangential
+                        labelColor: 'black'
+                        value: 8.2
+                    }
+                    PieSlice {
+                        label: "Volvo"
+                        labelVisible: true
+                        value: 6.8
+                    }
+                    PieSlice {
+                        label: "Others"
+                        labelVisible: true
+                        value: 52.0
+                    }
+
+                    onPressed: (slice) => {
+                                   piePressedSlice.text = "Slice Label : " + slice.label
+                               }
+
+                    onReleased: (slice) => {
+                                    pieReleasedSlice.text = "Slice Label : " + slice.label
+                                }
+
+                    onClicked: (slice) => {
+                                   pieClickedSlice.text = "Slice Label : " + slice.label
+                               }
+
+                    onDoubleClicked: (slice) => {
+                                         pieDoubleClickedSlice.text = "Slice Label : " + slice.label
+                                     }
+
+                    onHoverEnter: (seriesName, position, value) => {
+                                      pieHoverEnteredSeries.text = "Series : " + seriesName
+                                      pieHoverEnteredPosition.text = "Position : " + position
+                                      pieHoverEnteredValue.text = "Value : " + value
+                                  }
+                    onHover: (seriesName, position, value) => {
+                                 pieHoverSeries.text = "Series : " + seriesName
+                                 pieHoverPosition.text = "Position : " + position
+                                 pieHoverValue.text = "Value : " + value
+                             }
+                    onHoverExit: (seriesName, position) => {
+                                     pieHoverExitSeries.text = "Series : " + seriesName
+                                     pieHoverExitPosition.text = "Position : " + position
+                                 }
+                }
+            }
+
+            Column {
+                Layout.minimumWidth: 250
+                spacing: 5
+
+                Text {
+                    text: "Pressed"
+                    color: "white"
+                    font.pointSize: 20
+                }
+
+                Text {
+                    id: piePressedSlice
+                    text: "Slice Label :"
+                    color: "white"
+                }
+
+                Text {
+                    text: "Released"
+                    color: "white"
+                    font.pointSize: 20
+                }
+
+                Text {
+                    id: pieReleasedSlice
+                    text: "Slice Label :"
+                    color: "white"
+                }
+
+                Text {
+                    text: "Clicked"
+                    color: "white"
+                    font.pointSize: 20
+                }
+
+                Text {
+                    id: pieClickedSlice
+                    text: "Slice Label :"
+                    color: "white"
+                }
+
+                Text {
+                    text: "DoubleClicked"
+                    color: "white"
+                    font.pointSize: 20
+                }
+
+                Text {
+                    id: pieDoubleClickedSlice
+                    text: "Slice Label :"
+                    color: "white"
+                }
+
+                Text {
+                    text: "HoverEnterd"
+                    color: "white"
+                    font.pointSize: 20
+                }
+
+                Text {
+                    id: pieHoverEnteredSeries
+                    text: "Series :"
+                    color: "white"
+                }
+
+                Text {
+                    id: pieHoverEnteredPosition
+                    text: "Position :"
+                    color: "white"
+                }
+
+                Text {
+                    id: pieHoverEnteredValue
+                    text: "Value :"
+                    color: "white"
+                }
+
+                Text {
+                    text: "Hover"
+                    color: "white"
+                    font.pointSize: 20
+                }
+
+                Text {
+                    id: pieHoverSeries
+                    text: "Series :"
+                    color: "white"
+                }
+
+                Text {
+                    id: pieHoverPosition
+                    text: "Position :"
+                    color: "white"
+                }
+
+                Text {
+                    id: pieHoverValue
+                    text: "Value :"
+                    color: "white"
+                }
+
+                Text {
+                    text: "HoverExit"
+                    color: "white"
+                    font.pointSize: 20
+                }
+
+                Text {
+                    id: pieHoverExitSeries
+                    text: "Series :"
+                    color: "white"
+                }
+
+                Text {
+                    id: pieHoverExitPosition
+                    text: "Position :"
+                    color: "white"
+                }
+            }
+        }
+
+        // Line Graph
+        RowLayout {
+            GraphsView {
+                Layout.fillWidth: true
+                Layout.fillHeight: true
+
+                theme: GraphsTheme {
+                    colorScheme: GraphsTheme.ColorScheme.Dark
+                    theme: GraphsTheme.Theme.QtGreen
+                }
+
+                axisX: ValueAxis {
+                    id: axisX
+                    max: 4
+                    subTickCount: 9
+                }
+                axisY: ValueAxis {
+                    id: axisY
+                    max: 6
+                    subTickCount: 9
+                }
+                LineSeries {
+                    id: lineSeries
+                    selectable: true
+                    hoverable: true
+
+                    XYPoint { x: 0.0; y: 2.5 }
+                    XYPoint { x: 1.0; y: 3.3 }
+                    XYPoint { x: 2.0; y: 2.1 }
+                    XYPoint { x: 3.0; y: 4.9 }
+                    XYPoint { x: 4.0; y: 3.0 }
+
+                    pointDelegate: Item {
+                        id: delegate
+                        property color pointColor
+                        property real pointValueX
+                        property real pointValueY
+                        property bool pointSelected
+                        width: 20
+                        height: 20
+                        Rectangle {
+                            anchors.fill: parent
+                            color: delegate.pointSelected ? "#f08060" : "#202020"
+                            border.width: 2
+                            border.color: delegate.pointColor
+                            radius: width / 2
+                        }
+                        Text {
+                            anchors.horizontalCenter: parent.horizontalCenter
+                            anchors.bottom: parent.top
+                            color: "#ffffff"
+                            font.pixelSize: 16
+                            text: "(" + delegate.pointValueX.toFixed(1) + ", " + delegate.pointValueY.toFixed(1) + ")"
+                        }
+                    }
+
+                    onPressed: (point) => {
+                                   linePressedPoint.text = "Point : " + point
+                               }
+
+                    onReleased: (point) => {
+                                    lineReleasedPoint.text = "Point : " + point
+                                }
+
+                    onClicked: (point) => {
+                                   lineClickedPoint.text = "Point : " + point
+                               }
+
+                    onDoubleClicked: (point) => {
+                                         lineDoubleClickedPoint.text = "Point : " + point
+                                     }
+
+                    onHoverEnter: (seriesName, position, value) => {
+                                      lineHoverEnteredSeries.text = "Series : " + seriesName
+                                      lineHoverEnteredPosition.text = "Position : " + position
+                                      lineHoverEnteredValue.text = "Value : " + value
+                                  }
+                    onHover: (seriesName, position, value) => {
+                                 lineHoverSeries.text = "Series : " + seriesName
+                                 lineHoverPosition.text = "Position : " + position
+                                 lineHoverValue.text = "Value : " + value
+                             }
+                    onHoverExit: (seriesName, position) => {
+                                     lineHoverExitSeries.text = "Series : " + seriesName
+                                     lineHoverExitPosition.text = "Position : " + position
+                                 }
+                }
+            }
+
+            Column {
+                Layout.minimumWidth: 250
+                spacing: 5
+
+                Text {
+                    text: "Pressed"
+                    color: "white"
+                    font.pointSize: 20
+                }
+
+                Text {
+                    id: linePressedPoint
+                    text: "Point Label :"
+                    color: "white"
+                }
+
+                Text {
+                    text: "Released"
+                    color: "white"
+                    font.pointSize: 20
+                }
+
+                Text {
+                    id: lineReleasedPoint
+                    text: "Point Label :"
+                    color: "white"
+                }
+
+                Text {
+                    text: "Clicked"
+                    color: "white"
+                    font.pointSize: 20
+                }
+
+                Text {
+                    id: lineClickedPoint
+                    text: "Point Label :"
+                    color: "white"
+                }
+
+                Text {
+                    text: "DoubleClicked"
+                    color: "white"
+                    font.pointSize: 20
+                }
+
+                Text {
+                    id: lineDoubleClickedPoint
+                    text: "Point Label :"
+                    color: "white"
+                }
+
+                Text {
+                    text: "HoverEnterd"
+                    color: "white"
+                    font.pointSize: 20
+                }
+
+                Text {
+                    id: lineHoverEnteredSeries
+                    text: "Series :"
+                    color: "white"
+                }
+
+                Text {
+                    id: lineHoverEnteredPosition
+                    text: "Position :"
+                    color: "white"
+                }
+
+                Text {
+                    id: lineHoverEnteredValue
+                    text: "Value :"
+                    color: "white"
+                }
+
+                Text {
+                    text: "Hover"
+                    color: "white"
+                    font.pointSize: 20
+                }
+
+                Text {
+                    id: lineHoverSeries
+                    text: "Series :"
+                    color: "white"
+                }
+
+                Text {
+                    id: lineHoverPosition
+                    text: "Position :"
+                    color: "white"
+                }
+
+                Text {
+                    id: lineHoverValue
+                    text: "Value :"
+                    color: "white"
+                }
+
+                Text {
+                    text: "HoverExit"
+                    color: "white"
+                    font.pointSize: 20
+                }
+
+                Text {
+                    id: lineHoverExitSeries
+                    text: "Series :"
+                    color: "white"
+                }
+
+                Text {
+                    id: lineHoverExitPosition
+                    text: "Position :"
+                    color: "white"
+                }
+
+                Button {
+                    id: lineChangeDraggable
+                    text: "Draggable : " + lineSeries.draggable
+                    onClicked: () => {
+                                 lineSeries.draggable = lineSeries.draggable ? false : true
+                             }
+                }
+            }
+        }
+    }
+}
diff -pruN 6.8.2-4/tests/manual/qmltestbed/qml/qmltestbed/LineProperties.qml 6.9.1-1/tests/manual/qmltestbed/qml/qmltestbed/LineProperties.qml
--- 6.8.2-4/tests/manual/qmltestbed/qml/qmltestbed/LineProperties.qml	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/tests/manual/qmltestbed/qml/qmltestbed/LineProperties.qml	2025-05-29 02:19:47.000000000 +0000
@@ -74,6 +74,31 @@ Rectangle {
                 text: "SELECTED: " + lineSeries1.selectedPoints
             }
         }
+
+        Column {
+            Button {
+                text: "Reset zoom/pan"
+                onClicked: {
+                    xAxis.zoom = 1;
+                    yAxis.zoom = 1;
+                    xAxis.pan = 0;
+                    yAxis.pan = 0;
+                }
+            }
+
+            CheckBox {
+                id: zoomAreaCheck
+                text: "Zoom area enabled"
+
+                contentItem: Text {
+                    text: zoomAreaCheck.text
+                    font: zoomAreaCheck.font
+                    color: "#ffffff"
+                    verticalAlignment: Text.AlignVCenter
+                    leftPadding: zoomAreaCheck.indicator.width + zoomAreaCheck.spacing
+                }
+            }
+        }
     }
 
     Rectangle {
@@ -137,6 +162,9 @@ Rectangle {
         anchors.top: toolbar.bottom
         anchors.margins: 10
         anchors.rightMargin: settingsView.posX + 20 * px
+        zoomStyle: GraphsView.ZoomStyle.Center;
+        panStyle: zoomAreaCheck.checked ? GraphsView.PanStyle.None : GraphsView.PanStyle.Drag
+        zoomAreaEnabled: zoomAreaCheck.checked
 
         axisX: ValueAxis {
             id: xAxis
@@ -183,6 +211,7 @@ Rectangle {
                 property color pointColor
                 property real pointValueX
                 property real pointValueY
+                property int pointIndex
                 width: 16
                 height: 16
                 Rectangle {
@@ -190,14 +219,14 @@ Rectangle {
                     color: "#202020"
                     border.width: 2
                     border.color: pointColor
-                    radius: width / 2
+                    radius: (pointIndex % 2 === 0) ? width / 2 : 2
                 }
                 Text {
                     anchors.horizontalCenter: parent.horizontalCenter
                     anchors.bottom: parent.top
                     color: "#ffffff"
                     font.pixelSize: 16
-                    text: "(" + pointValueX.toFixed(1) + ", " + pointValueY.toFixed(1) + ")"
+                    text: pointIndex + ": (" + pointValueX.toFixed(1) + ", " + pointValueY.toFixed(1) + ")"
                 }
             }
             XYPoint { x: 0; y: 6.6 }
diff -pruN 6.8.2-4/tests/manual/qmltestbed/qml/qmltestbed/StartupView.qml 6.9.1-1/tests/manual/qmltestbed/qml/qmltestbed/StartupView.qml
--- 6.8.2-4/tests/manual/qmltestbed/qml/qmltestbed/StartupView.qml	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/tests/manual/qmltestbed/qml/qmltestbed/StartupView.qml	2025-05-29 02:19:47.000000000 +0000
@@ -112,6 +112,10 @@ Item {
             name: "PieModelMapping"
             file: "PieModelMapping.qml"
         }
+        ListElement {
+            name: "Custom Input"
+            file: "CustomInput.qml"
+        }
     }
 
     Component {
diff -pruN 6.8.2-4/tests/manual/qmltheme/CMakeLists.txt 6.9.1-1/tests/manual/qmltheme/CMakeLists.txt
--- 6.8.2-4/tests/manual/qmltheme/CMakeLists.txt	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/tests/manual/qmltheme/CMakeLists.txt	2025-05-29 02:19:47.000000000 +0000
@@ -4,7 +4,7 @@
 cmake_minimum_required(VERSION 3.16)
 
 if (NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT)
-    project(tst_qmltheme LANGUAGES C CXX ASM)
+    project(tst_qmltheme LANGUAGES C CXX)
     find_package(Qt6BuildInternals COMPONENTS STANDALONE_TEST)
 endif()
 
diff -pruN 6.8.2-4/tests/manual/qmltheme/qml/qmltheme/GraphModifiers.qml 6.9.1-1/tests/manual/qmltheme/qml/qmltheme/GraphModifiers.qml
--- 6.8.2-4/tests/manual/qmltheme/qml/qmltheme/GraphModifiers.qml	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/tests/manual/qmltheme/qml/qmltheme/GraphModifiers.qml	2025-05-29 02:19:47.000000000 +0000
@@ -10,6 +10,7 @@ ColumnLayout {
     spacing: 10
 
     property bool barsVisible: barsMode.checked
+    property bool valueColoring: valueColoringChange.checked
 
     Label {
         text: "Bars3D Graph"
@@ -153,7 +154,7 @@ ColumnLayout {
             if (checked)
                 customTheme.colorStyle = GraphsTheme.ColorStyle.Uniform
             else
-                customTheme.colorStyle = GraphsTheme.ColorStyle.ObjectGradient
+                customTheme.colorStyle = GraphsTheme.ColorStyle.RangeGradient
         }
     }
     Label {
@@ -164,4 +165,15 @@ ColumnLayout {
         id: testgradientchange
         checked: false
     }
+
+    Label {
+        text: "Value Coloring"
+        color: "gray"
+        visible: bars.visible && !colorStyle.checked;
+    }
+    CheckBox {
+        id: valueColoringChange
+        checked: false
+        visible: bars.visible && !colorStyle.checked
+    }
 }
diff -pruN 6.8.2-4/tests/manual/qmltheme/qml/qmltheme/main.qml 6.9.1-1/tests/manual/qmltheme/qml/qmltheme/main.qml
--- 6.8.2-4/tests/manual/qmltheme/qml/qmltheme/main.qml	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/tests/manual/qmltheme/qml/qmltheme/main.qml	2025-05-29 02:19:47.000000000 +0000
@@ -64,7 +64,7 @@ Item {
     GraphsTheme {
         id: customBarsTheme
         theme: GraphsTheme.Theme.UserDefined
-        colorStyle: GraphsTheme.ColorStyle.ObjectGradient
+        colorStyle: GraphsTheme.ColorStyle.RangeGradient
         baseColors: [barColor]
         baseGradients: [customGradient]
         plotAreaBackgroundColor: "gray"
@@ -120,6 +120,7 @@ Item {
 
             Bar3DSeries {
                 id: barsSeries
+                valueColoringEnabled: graphMod.valueColoring
                 // If you want to check with series colors, uncomment these
                 // baseGradient: customGradient
                 // baseColor: barColor.color
diff -pruN 6.8.2-4/tests/manual/qmlvolume/CMakeLists.txt 6.9.1-1/tests/manual/qmlvolume/CMakeLists.txt
--- 6.8.2-4/tests/manual/qmlvolume/CMakeLists.txt	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/tests/manual/qmlvolume/CMakeLists.txt	2025-05-29 02:19:47.000000000 +0000
@@ -4,7 +4,7 @@
 cmake_minimum_required(VERSION 3.16)
 
 if (NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT)
-    project(tst_qmlvolume LANGUAGES C CXX ASM)
+    project(tst_qmlvolume LANGUAGES C CXX)
     find_package(Qt6BuildInternals COMPONENTS STANDALONE_TEST)
 endif()
 
diff -pruN 6.8.2-4/tests/manual/rotations/CMakeLists.txt 6.9.1-1/tests/manual/rotations/CMakeLists.txt
--- 6.8.2-4/tests/manual/rotations/CMakeLists.txt	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/tests/manual/rotations/CMakeLists.txt	2025-05-29 02:19:47.000000000 +0000
@@ -4,7 +4,7 @@
 cmake_minimum_required(VERSION 3.16)
 
 if (NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT)
-    project(tst_rotations LANGUAGES C CXX ASM)
+    project(tst_rotations LANGUAGES C CXX)
     find_package(Qt6BuildInternals COMPONENTS STANDALONE_TEST)
 endif()
 
diff -pruN 6.8.2-4/tests/manual/scattertest/CMakeLists.txt 6.9.1-1/tests/manual/scattertest/CMakeLists.txt
--- 6.8.2-4/tests/manual/scattertest/CMakeLists.txt	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/tests/manual/scattertest/CMakeLists.txt	2025-05-29 02:19:47.000000000 +0000
@@ -4,7 +4,7 @@
 cmake_minimum_required(VERSION 3.16)
 
 if (NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT)
-    project(tst_scattertest LANGUAGES C CXX ASM)
+    project(tst_scattertest LANGUAGES C CXX)
     find_package(Qt6BuildInternals COMPONENTS STANDALONE_TEST)
 endif()
 
diff -pruN 6.8.2-4/tests/manual/scattertest/main.cpp 6.9.1-1/tests/manual/scattertest/main.cpp
--- 6.8.2-4/tests/manual/scattertest/main.cpp	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/tests/manual/scattertest/main.cpp	2025-05-29 02:19:47.000000000 +0000
@@ -168,6 +168,13 @@ int main(int argc, char **argv)
     fontSizeSlider->setValue(30);
     fontSizeSlider->setMaximum(200);
 
+    QSlider *labelSizeSlider = new QSlider(Qt::Horizontal, widget);
+    labelSizeSlider->setTickInterval(1);
+    labelSizeSlider->setTickPosition(QSlider::TicksBelow);
+    labelSizeSlider->setMinimum(1);
+    labelSizeSlider->setValue(10);
+    labelSizeSlider->setMaximum(30);
+
     QSlider *pointSizeSlider = new QSlider(Qt::Horizontal, widget);
     pointSizeSlider->setTickInterval(15);
     pointSizeSlider->setTickPosition(QSlider::TicksBelow);
@@ -247,6 +254,10 @@ int main(int argc, char **argv)
     axisTitlesVisibleCB->setText(QStringLiteral("Axis titles visible"));
     axisTitlesVisibleCB->setChecked(false);
 
+    QCheckBox *labelAdjustCB = new QCheckBox(widget);
+    labelAdjustCB->setText(QStringLiteral("Use label adjustment"));
+    labelAdjustCB->setChecked(false);
+
     QCheckBox *axisTitlesFixedCB = new QCheckBox(widget);
     axisTitlesFixedCB->setText(QStringLiteral("Axis titles fixed"));
     axisTitlesFixedCB->setChecked(true);
@@ -365,6 +376,8 @@ int main(int argc, char **argv)
     vLayout2->addWidget(fontList);
     vLayout2->addWidget(new QLabel(QStringLiteral("Adjust font size")));
     vLayout2->addWidget(fontSizeSlider);
+    vLayout2->addWidget(new QLabel(QStringLiteral("Adjust label size")));
+    vLayout2->addWidget(labelSizeSlider);
     vLayout2->addWidget(new QLabel(QStringLiteral("Adjust vertical aspect ratio")));
     vLayout2->addWidget(aspectRatioSlider);
     vLayout2->addWidget(new QLabel(QStringLiteral("Adjust horizontal aspect ratio")));
@@ -375,6 +388,7 @@ int main(int argc, char **argv)
     vLayout3->addWidget(polarCB);
     vLayout3->addWidget(axisTitlesVisibleCB);
     vLayout3->addWidget(axisTitlesFixedCB);
+    vLayout3->addWidget(labelAdjustCB);
     vLayout3->addWidget(new QLabel(QStringLiteral("Axis label rotation")));
     vLayout3->addWidget(axisLabelRotationSlider);
     vLayout3->addWidget(new QLabel(QStringLiteral("Axis title offset")));
@@ -402,8 +416,14 @@ int main(int argc, char **argv)
 
     QObject::connect(fontSizeSlider, &QSlider::valueChanged, modifier,
                      &ScatterDataModifier::changeFontSize);
-    QObject::connect(pointSizeSlider, &QSlider::valueChanged, modifier,
+    QObject::connect(pointSizeSlider,
+                     &QSlider::valueChanged,
+                     modifier,
                      &ScatterDataModifier::changePointSize);
+    QObject::connect(labelSizeSlider,
+                     &QSlider::valueChanged,
+                     modifier,
+                     &ScatterDataModifier::changeLabelSize);
 
     QObject::connect(styleButton, &QPushButton::clicked, modifier,
                      &ScatterDataModifier::changeStyle);
@@ -504,7 +524,13 @@ int main(int argc, char **argv)
                      &ScatterDataModifier::toggleAxisTitleVisibility);
     QObject::connect(axisTitlesFixedCB, &QCheckBox::checkStateChanged, modifier,
                      &ScatterDataModifier::toggleAxisTitleFixed);
-    QObject::connect(axisLabelRotationSlider, &QSlider::valueChanged, modifier,
+    QObject::connect(labelAdjustCB,
+                     &QCheckBox::checkStateChanged,
+                     modifier,
+                     &ScatterDataModifier::toggleLabelAdjustment);
+    QObject::connect(axisLabelRotationSlider,
+                     &QSlider::valueChanged,
+                     modifier,
                      &ScatterDataModifier::changeLabelRotation);
     QObject::connect(axisTitleOffsetSlider,
                      &QSlider::valueChanged,
diff -pruN 6.8.2-4/tests/manual/scattertest/scatterchart.cpp 6.9.1-1/tests/manual/scattertest/scatterchart.cpp
--- 6.8.2-4/tests/manual/scattertest/scatterchart.cpp	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/tests/manual/scattertest/scatterchart.cpp	2025-05-29 02:19:47.000000000 +0000
@@ -600,6 +600,13 @@ void ScatterDataModifier::changeFontSize
     m_chart->activeTheme()->setLabelFont(font);
 }
 
+void ScatterDataModifier::changeLabelSize(int labelSize)
+{
+    m_chart->axisX()->setLabelSize(float(labelSize) * 0.1);
+    m_chart->axisY()->setLabelSize(float(labelSize) * 0.1);
+    m_chart->axisZ()->setLabelSize(float(labelSize) * 0.1);
+}
+
 void ScatterDataModifier::changePointSize(int pointSize)
 {
     m_targetSeries->setItemSize(0.01f *  float(pointSize));
@@ -982,6 +989,13 @@ void ScatterDataModifier::toggleAxisTitl
     m_chart->axisZ()->setTitleFixed(enabled);
 }
 
+void ScatterDataModifier::toggleLabelAdjustment(int enabled)
+{
+    m_chart->axisX()->setScaleLabelsByCount(enabled);
+    m_chart->axisY()->setScaleLabelsByCount(enabled);
+    m_chart->axisZ()->setScaleLabelsByCount(enabled);
+}
+
 void ScatterDataModifier::renderToImage()
 {
     QSharedPointer<QQuickItemGrabResult> grabResult = m_chart->renderToImage(QSize());
diff -pruN 6.8.2-4/tests/manual/scattertest/scatterchart.h 6.9.1-1/tests/manual/scattertest/scatterchart.h
--- 6.8.2-4/tests/manual/scattertest/scatterchart.h	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/tests/manual/scattertest/scatterchart.h	2025-05-29 02:19:47.000000000 +0000
@@ -26,6 +26,7 @@ public:
     void changeLabelStyle();
     void changeFont(const QFont &font);
     void changeFontSize(int fontSize);
+    void changeLabelSize(int labelSize);
     void changePointSize(int pointSize);
     void setBackgroundVisible(int visible);
     void setGridVisible(int visible);
@@ -78,6 +79,7 @@ public Q_SLOTS:
     void changeRadialLabelOffset(int offset);
     void toggleAxisTitleVisibility(int enabled);
     void toggleAxisTitleFixed(int enabled);
+    void toggleLabelAdjustment(int enabled);
     void renderToImage();
     void togglePolar(int enable);
     void toggleLegacy(int enable);
diff -pruN 6.8.2-4/tests/manual/surfacetest/CMakeLists.txt 6.9.1-1/tests/manual/surfacetest/CMakeLists.txt
--- 6.8.2-4/tests/manual/surfacetest/CMakeLists.txt	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/tests/manual/surfacetest/CMakeLists.txt	2025-05-29 02:19:47.000000000 +0000
@@ -4,7 +4,7 @@
 cmake_minimum_required(VERSION 3.16)
 
 if (NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT)
-    project(tst_surfacetest LANGUAGES C CXX ASM)
+    project(tst_surfacetest LANGUAGES C CXX)
     find_package(Qt6BuildInternals COMPONENTS STANDALONE_TEST)
 endif()
 
diff -pruN 6.8.2-4/tests/manual/surfacetest/graphmodifier.cpp 6.9.1-1/tests/manual/surfacetest/graphmodifier.cpp
--- 6.8.2-4/tests/manual/surfacetest/graphmodifier.cpp	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/tests/manual/surfacetest/graphmodifier.cpp	2025-05-29 02:19:47.000000000 +0000
@@ -633,10 +633,10 @@ void GraphModifier::gradientPressed()
     }
 
     QLinearGradient gradient;
-    gradient.setColorAt(0.0, Qt::black);
-    gradient.setColorAt(0.33, Qt::blue);
-    gradient.setColorAt(0.67, Qt::red);
-    gradient.setColorAt(1.0, Qt::yellow);
+    gradient.setColorAt(0.0, QColor(0, 0, 0, 255));
+    gradient.setColorAt(0.33, QColor(0, 0, 255, 100));
+    gradient.setColorAt(0.67, QColor(255, 0, 0, 150));
+    gradient.setColorAt(1.0, QColor(255, 255, 0, 200));
 
     QList<QLinearGradient> gradients;
     gradients << gradient;
@@ -943,6 +943,12 @@ void GraphModifier::changeShadowQuality(
     m_graph->setShadowQuality(sq);
 }
 
+void GraphModifier::changeTransparencyTechnique(int technique)
+{
+    QtGraphs3D::TransparencyTechnique sq = QtGraphs3D::TransparencyTechnique(technique);
+    m_graph->setTransparencyTechnique(sq);
+}
+
 void GraphModifier::changeSelectionMode(int mode)
 {
     QComboBox *comboBox = qobject_cast<QComboBox *>(sender());
diff -pruN 6.8.2-4/tests/manual/surfacetest/graphmodifier.h 6.9.1-1/tests/manual/surfacetest/graphmodifier.h
--- 6.8.2-4/tests/manual/surfacetest/graphmodifier.h	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/tests/manual/surfacetest/graphmodifier.h	2025-05-29 02:19:47.000000000 +0000
@@ -101,6 +101,7 @@ public:
 
 public Q_SLOTS:
     void changeShadowQuality(int quality);
+    void changeTransparencyTechnique(int technique);
     void changeColorScheme(int colorScheme);
     void changeTheme(int theme);
     void flipViews();
diff -pruN 6.8.2-4/tests/manual/surfacetest/main.cpp 6.9.1-1/tests/manual/surfacetest/main.cpp
--- 6.8.2-4/tests/manual/surfacetest/main.cpp	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/tests/manual/surfacetest/main.cpp	2025-05-29 02:19:47.000000000 +0000
@@ -267,6 +267,12 @@ int main(int argc, char *argv[])
     shadowQuality->addItem(QStringLiteral("High Soft"));
     shadowQuality->setCurrentIndex(3);
 
+    QComboBox *transparencyTechnique = new QComboBox(widget);
+    transparencyTechnique->addItem(QStringLiteral("Default"));
+    transparencyTechnique->addItem(QStringLiteral("Approximate"));
+    transparencyTechnique->addItem(QStringLiteral("Accurate"));
+    transparencyTechnique->setCurrentIndex(0);
+
     QComboBox *selectionMode = new QComboBox(widget);
     selectionMode->addItem(QStringLiteral("None"), int(QtGraphs3D::SelectionFlag::None));
     selectionMode->addItem(QStringLiteral("Item"), int(QtGraphs3D::SelectionFlag::Item));
@@ -533,6 +539,8 @@ int main(int argc, char *argv[])
     vLayout2->addWidget(themeList);
     vLayout2->addWidget(new QLabel(QStringLiteral("Adjust shadow quality")));
     vLayout2->addWidget(shadowQuality);
+    vLayout2->addWidget(new QLabel(QStringLiteral("Change Transparency Technique")));
+    vLayout2->addWidget(transparencyTechnique);
     vLayout2->addWidget(new QLabel(QStringLiteral("Selection Mode")));
     vLayout2->addWidget(selectionMode);
     vLayout2->addWidget(new QLabel(QStringLiteral("Camera target")));
@@ -727,8 +735,14 @@ int main(int argc, char *argv[])
                      modifier, SLOT(changeTheme(int)));
     QObject::connect(shadowQuality, SIGNAL(currentIndexChanged(int)),
                      modifier, SLOT(changeShadowQuality(int)));
-    QObject::connect(selectionMode, SIGNAL(currentIndexChanged(int)),
-                     modifier, SLOT(changeSelectionMode(int)));
+    QObject::connect(transparencyTechnique,
+                     SIGNAL(currentIndexChanged(int)),
+                     modifier,
+                     SLOT(changeTransparencyTechnique(int)));
+    QObject::connect(selectionMode,
+                     SIGNAL(currentIndexChanged(int)),
+                     modifier,
+                     SLOT(changeSelectionMode(int)));
 #ifndef MULTI_SERIES
     QObject::connect(selectButton, &QPushButton::clicked,
                      modifier, &GraphModifier::selectButtonClicked);
diff -pruN 6.8.2-4/tests/manual/volumetrictest/CMakeLists.txt 6.9.1-1/tests/manual/volumetrictest/CMakeLists.txt
--- 6.8.2-4/tests/manual/volumetrictest/CMakeLists.txt	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/tests/manual/volumetrictest/CMakeLists.txt	2025-05-29 02:19:47.000000000 +0000
@@ -4,7 +4,7 @@
 cmake_minimum_required(VERSION 3.16)
 
 if (NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT)
-    project(tst_volumetrictest LANGUAGES C CXX ASM)
+    project(tst_volumetrictest LANGUAGES C CXX)
     find_package(Qt6BuildInternals COMPONENTS STANDALONE_TEST)
 endif()
 
diff -pruN 6.8.2-4/tests/manual/volumetrictest/volumetrictest.cpp 6.9.1-1/tests/manual/volumetrictest/volumetrictest.cpp
--- 6.8.2-4/tests/manual/volumetrictest/volumetrictest.cpp	2025-01-24 11:58:38.000000000 +0000
+++ 6.9.1-1/tests/manual/volumetrictest/volumetrictest.cpp	2025-05-29 02:19:47.000000000 +0000
@@ -255,15 +255,15 @@ void VolumetricModifier::testSubtextureS
 
     // Do some visible swaps on volume 3
     QImage slice = m_volumeItem3->renderSlice(Qt::XAxis, 144);
-    slice = slice.mirrored();
+    slice.flip();
     m_volumeItem3->setSubTextureData(Qt::XAxis, 144, slice);
 
     slice = m_volumeItem3->renderSlice(Qt::YAxis, 80);
-    slice = slice.mirrored();
+    slice.flip();
     m_volumeItem3->setSubTextureData(Qt::YAxis, 80, slice);
 
     slice = m_volumeItem3->renderSlice(Qt::ZAxis, 190);
-    slice = slice.mirrored(true, false);
+    slice.flip(Qt::Horizontal);
     m_volumeItem3->setSubTextureData(Qt::ZAxis, 190, slice);
 }
 
@@ -404,7 +404,7 @@ void VolumetricModifier::createVolume()
     uchar *p = data;
 
     // Change one picture using subtexture replacement
-    QImage flipped = logo.mirrored();
+    QImage flipped = logo.flipped();
     m_volumeItem->setSubTextureData(Qt::ZAxis, 100, flipped);
 
     // Clean up the two extra pixels
@@ -536,7 +536,7 @@ void VolumetricModifier::createAnotherVo
                                        zRange * 2.0f));
 
     // Change one picture using subtexture replacement
-    QImage flipped = logo.mirrored();
+    QImage flipped = logo.flipped();
     m_volumeItem2->setSubTextureData(Qt::ZAxis, 100, flipped);
     //m_volumeItem2->setAlphaMultiplier(0.2f);
     m_volumeItem2->setPreserveOpacity(false);
