diff options
38 files changed, 2460 insertions, 1192 deletions
diff --git a/LICENSE.QT-LICENSE-AGREEMENT b/LICENSE.QT-LICENSE-AGREEMENT new file mode 100644 index 0000000000..7be8fb5d45 --- /dev/null +++ b/LICENSE.QT-LICENSE-AGREEMENT @@ -0,0 +1,1285 @@ +QT LICENSE AGREEMENT Agreement version 4.2 + +This Qt License Agreement (“Agreement”) is a legal agreement for the licensing +of Licensed Software (as defined below) between The Qt Company (as defined +below) and the Licensee who has accepted the terms of this Agreement by +downloading or using the Licensed Software and/or as defined herein: + +Capitalized terms used herein are defined in Section 1. + +WHEREAS: + (A) Licensee wishes to use the Licensed Software for the purpose of + developing and distributing Applications and/or Devices (each as + defined below); and + (B) The Qt Company is willing to grant the Licensee a right to use + Licensed Software for such a purpose pursuant to term and conditions + of this Agreement. + +NOW, THEREFORE, THE PARTIES HEREBY AGREE AS FOLLOWS: + + +1. DEFINITIONS + +“Affiliate” of a Party shall mean an entity (i) which is directly +or indirectly controlling such Party; (ii) which is under the same direct or +indirect ownership or control as such Party; or (iii) which is directly or +indirectly owned or controlled by such Party. For these purposes, an entity +shall be treated as being controlled by another if that other entity has fifty +percent (50 %) or more of the votes in such entity, is able to direct its +affairs and/or to control the composition of its board of directors or +equivalent body. + +“Add-on Products” shall mean The Qt Company’s specific add-on software products +(for example Qt Safe Renderer, Qt for Automation, Qt Application Manager), which +are not licensed as part of The Qt Company’s standard offering, but shall be +included into the scope of Licensed Software only if so specifically agreed +between the Parties. + +“Applications” shall mean Licensee's software products created using the +Licensed Software, which may include the Redistributables, or part thereof. + +“Contractor(s)” shall mean third party consultants, distributors and contractors +performing services to the Licensee under applicable contractual arrangement. + +“Customer(s)” shall mean Licensee’s end users to whom Licensee, directly or +indirectly, distributes copies of the Redistributables. + +“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 relevant +territory. + +“Deployment Platforms” shall mean operating systems specified in the License +Certificate, on which the Redistributables can be distributed pursuant to the +terms and conditions of this Agreement. + +“Designated User(s)” shall mean the employee(s) of Licensee or Licensee’s +Affiliates acting within the scope of their employment or Licensee's Contractors +acting within the scope of their services for Licensee and on behalf of +Licensee. Designated Users shall be named in the License Certificate. + +“Development License” shall mean the license needed by the Licensee for each +Designated User to use the Licensed Software under the license grant described +in Section 3.1 of this Agreement. Development Licenses are available separately +for Qt for Application Development and Qt for Device Creation products, each +product having its designated scope and purpose of use. Distribution Licenses +are always connected to Qt for Device Creation product only. + +“Development Platforms” shall mean those operating systems specified in the +License Certificate, in which the Licensed Software can be used under the +Development License, but not distributed in any form or used for any other +purpose. + +“Devices” shall mean hardware devices or products that 1) are manufactured +and/or distributed by the Licensee or its Affiliates or Contractors, and (2)(i) +incorporate or integrate the Redistributables or parts thereof; or (ii) where +the main user interface or substantial functionality of such unit , when used by +a Customer, is provided by Application(s) or otherwise depends on the Licensed +Software, regardless of whether the Redistributables are distributed together +with the hardware or not. Devices covered with this Agreement shall be specified +in Appendix 2 or in a quote. + +“Distribution License(s)” shall mean the license required for any kind of sale, +trade, exchange, loan, lease, rental or other distribution by or on behalf of +Licensee to a third party of Redistributables in connection with Devices +pursuant to license grant described in Section 3.3 of this Agreement. + +“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, Purchase Order confirmation or in an appendix hereto, as the case +may be. + +“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. + +“License Certificate” shall mean a certificate generated by The Qt Company for +each Designated User respectively upon them downloading the Licensed Software, +which will be available under respective Designated User’s Qt Account at +account.qt.io. License Certificates will specify the Designated User, the +Development Platforms, Deployment Platforms and the License Term. Such terms are +considered part of the licenses granted hereunder and shall be updated from time +to time to reflect any agreed changes to the foregoing terms relating to +Designated User’s rights to the Licensed Software. + +“License Fee” shall mean the fee charged to the Licensee for rights granted +under the terms of this Agreement. + +“License Term” shall mean the agreed validity period of the Development License +of the respective Designated User, during which time the Designated User is +entitled to use the Licensed Software, as set forth in the respective License +Certificate. + +“Licensed Software” shall mean either + (i) Qt for Application Development or + (ii) Qt for Device Creation, and/or + (iii) Qt 3D Studio, and/or + (iv) Qt Design Studio, and/or + (v) selected Add-on Products, if any, + +depending on which product(s) the Licensee has purchased under this Agreement, +as well as corresponding online or electronic documentation, associated media +and printed materials, including the source code, example programs and the +documentation, licensed to the Licensee under this Agreement. Licensed Software +does not include Third Party Software (as defined in Section 4) or Open Source +Qt. 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 the Licensee 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). + +“Licensee” shall mean the individual or legal entity that is party to this +Agreement, as identified on the signature page hereof. + +“Licensee’s Records” shall mean books and records that are likely to contain +information bearing on Licensee’s compliance with this Agreement, Licensee’s use +of Open Source Qt and/or the payments due to The Qt Company under this +Agreement, including, but not limited to user information, assembly logs, sales +records and distribution records. + +“Modified Software” shall have the meaning as set forth in Section 2.3. + +“Online Services” shall mean any services or access to systems made available by +The Qt Company to the Licensee over the Internet relating to the Licensed +Software or for the purpose of use by the Licensee of the Licensed Software or +Support. Use of any such Online Services is discretionary for the Licensee and +some of them may be subject to additional fees. + +“Open Source Qt” shall mean the non-commercial Qt computer software products, +licensed 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, Open Source Qt shall not be provided nor governed under +this Agreement. + +”Party” or “Parties” shall mean Licensee and/or The Qt Company. + +“Permitted Combination” shall have the meaning as set forth in Section +3.4(viii). + +“Pre-Release Code” shall have the meaning as set forth in Section 4. + +“Prohibited Combination” shall mean any means to (i) use, combine, incorporate, +link or integrate Licensed Software with any software created with or +incorporating Open Source Qt, (ii) use Licensed Software for creation of any +software created with or incorporating Open Source Qt, or (iii) incorporate or +integrate Applications into a hardware device or product other than a Device. + +“Qt 3D Studio” shall mean all versions of The Qt Company’s Qt 3D Studio, a 3D +user interface design and development environment for rapid designing and +prototyping of animated user interfaces. + +“Qt Design Studio” shall mean all versions of The Qt Company’s Qt Design Studio +tool, a user interface design and development environment for rapid designing +and prototyping of animated user interfaces. + +“Qt for Application Development” shall mean The Qt Company’s productized +offering, which consist of all versions of + (i) Qt Toolkit, and + (ii) Qt Tools/Applications. + +“Qt for Device Creation” shall mean The Qt Company’s productized offering, which +consist of all versions of + (i) Qt for Application Development, and + (ii) Software components specific to embedded software development as set + forth in Appendix 1, Sections 1b and 1d. + +“Qt Toolkit” shall mean the modules defined in Appendix 1, Section 1a. + +“Qt Tools/Applications” shall mean the tools defined in Appendix 1, Section 1c. + +"Redistributables" shall mean the portions of the Licensed Software set forth in +Appendix 1, Section 2 that may be distributed pursuant to the terms of this +Agreement in object code form only, including any relevant documentation. Where +relevant, any reference to Licensed Software in this Agreement shall include and +refer also to Redistributables. + +“Renewal Term” shall mean an extension of previous License Term as agreed +between the Parties. + +“Submitted Modified Software” shall have the meaning as set forth in Section +2.3. + +“Support” shall mean standard developer support that is provided by The Qt +Company to assist Designated Users in using the Licensed Software in accordance +with The Qt Company’s standard support terms available at +https://www.qt.io/terms-conditions/ and as further defined in Section 8 +hereunder. + +“Taxes” shall have the meaning set forth in Section 10.5. + +“Term” shall have the meaning set forth in Section 12. + +“The Qt Company” shall mean: + (i) in the event Licensee is an individual residing in the United States + or a legal entity incorporated in the United States or having its + headquarters in the United States, The Qt Company Inc., a + Delaware corporation with its office at 2350 Mission College Blvd., + Suite 1020, Santa Clara, CA 95054, USA.; or + (ii) in the event the Licensee is an individual residing outside of the + United States or a legal entity incorporated outside of the United + States or having its registered office outside of the United States, + The Qt Company Ltd., a Finnish company with its registered office at + Bertel Jungin aukio D3A, 02600 Espoo, Finland. + +"Third Party Software " shall have the meaning set forth in Section 4. + +“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 +the Licensee under the Support. Updates shall be considered as part of the +Licensed Software hereunder. + +“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 Upgrades are +provided to the Licensee under this Agreement, they shall be considered as part +of the Licensed Software hereunder. + + +2. OWNERSHIP + +2.1 Ownership of The Qt Company +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. All of The Qt Company's Intellectual Property +Rights are and shall remain the exclusive property of The Qt Company or its +licensors respectively. + +2.2 Ownership of Licensee +All the Licensee's Intellectual Property Rights are and shall remain the +exclusive property of the Licensee or its licensors respectively. All +Intellectual Property Rights to the Modified Software, Applications and Devices +shall remain with the Licensee and no rights thereto shall be granted by the +Licensee to The Qt Company under this Agreement (except as set forth in Section +2.3 below). + +2.3 Modified Software +Licensee may create bug-fixes, error corrections, patches or modifications to +the Licensed Software (“Modified Software”). Such Modified Software may break +the source or binary compatibility with the Licensed Software (including without +limitation through changing the application programming interfaces ("API") or by +adding, changing or deleting any variable, method, or class signature in the +Licensed Software and/or any inter-process protocols, services or standards in +the Licensed Software libraries). To the extent that Licensee’s Modified +Software so breaks source or binary compatibility with the Licensed Software, +Licensee acknowledges that The Qt Company's ability to provide Support may be +prevented or limited and Licensee's ability to make use of Updates may be +restricted. + +Licensee may, at its sole and absolute discretion, choose to submit Modified +Software to The Qt Company (“Submitted Modified Software”) in connection with +Licensee’s Support request, service request or otherwise. In the event Licensee +does so, then, Licensee hereby grants The Qt Company a sublicensable, +assignable, irrevocable, perpetual, worldwide, non-exclusive, royalty-free and +fully paid-up license, under all of Licensee’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. + + +3. LICENSES GRANTED + +3.1 Development with Licensed Software +Subject to the terms of this Agreement, The Qt Company grants to Licensee a +worldwide, non- exclusive, non-transferable license, valid for the 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 thereto +related support and other related services to end-user Customers. + +Licensee may install copies of the Licensed Software on five (5) computers per +Designated User, provided that only the Designated Users who have a valid +Development License may use the Licensed Software. + +Licensee may at any time designate another Designated User to replace a +then-current Designated User by notifying The Qt Company in writing, provided +that any Designated User may be replaced only once during any six-month period. + +Upon expiry of the initially agreed License Term, the respective License Terms +shall be automatically extended to 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 ninety (90) days before expiry of the respective License Term. +Unless otherwise agreed between the Parties, Renewal Term shall be of equal +length with the initial License Term. + +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 +pricing applicable at the commencement date of any such Renewal Term. + +Any price or other term specified for a Renewal Term shall be valid only for the +specified time. The Qt Company may request the Licensee to place a purchase +order corresponding to a quote by The Qt Company for the relevant Renewal Term. + +In the event Licensee does not prevent auto-renewal pursuant the above, but a +Renewal Term is nevertheless not duly ordered within 30 days from the date of +the respective quote from The Qt Company and/or the respective License Fee paid +by due date specified in The Qt Company’s respective invoice, The Qt Company +shall apply a reinstatement fee equal to ten percent (10 %) of the total value +of the License Fees of the Development Licenses for the expired term to be added +to the License Fee of the respective Renewal Term. + +In the event Licensee chooses not to renew a Development License for a Renewal +Term by notifying The Qt Company thereof no less than ninety (90) days before +expiry of the respective License Term, Licensee may still reinstate such expired +Development Licenses for a Renewal Term subject to applicable renewal Term +License Fees until thirty (30) days from the expiry of the initially agreed +License Term or preceding Renewal Term. After such thirty (30) day period a +Development License shall be subject to applicable License Fees for a new +Development License and not any Renewal Term License Fees. + +3.2 Distribution of Applications +Subject to the terms of this Agreement, The Qt Company grants to Licensee a +worldwide, non- exclusive, non-transferable, revocable (for cause pursuant to +this Agreement) right and license, valid for the Term, 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 sublicenses to Redistributables, as distributed hereunder, for + Customers solely for Customer’s internal use and to the extent + necessary in order for the Customers to use the Applications for their + respective intended purposes. + +Right to distribute the Redistributables as part of an Application as provided +herein is not royalty- bearing but is conditional upon the Licensee not having +any unpaid License Fees for Development Licenses owed to The Qt Company at the +time of distribution of any Redistributables to Customers. + +3.3 Distribution of Devices +Subject to the terms of this Agreement, The Qt Company grants to Licensee a +worldwide, non- exclusive, non-transferable, revocable (for cause pursuant to +this Agreement) right and license, valid for the Term, 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 sublicenses to Redistributables, as distributed hereunder, for + Customers solely for Customer’s internal use and to the extent + necessary in order for the Customers to use the Devices for their + respective intended purposes. + +Right to distribute the Redistributables with Devices as provided herein is +conditional upon the Licensee (i) not having any unpaid License Fees for +Development Licenses owed to The Qt Company, and (ii) having purchased and paid +corresponding Distribution Licenses at the time of distribution of any +Redistributables to Customers. + +3.4 Further Requirements +The licenses granted above in this Section 3 by The Qt Company to Licensee are +conditional and subject to Licensee's compliance with the following terms: + (i) Licensee shall not remove or alter any copyright, trademark or other + proprietary rights notice(s) contained in any portion of the Licensed + Software; + (ii) Applications must add primary and substantial functionality to the + Licensed Software so as not to compete with the Licensed Software; + (iii) Applications may not pass on functionality which in any way makes it + possible for others to create software with the Licensed Software; + provided however that Licensee may use the 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); + (iv) Licensee shall not use Licensed Software in any manner or for any + purpose that infringes, misappropriates or otherwise violates any + Intellectual property or right of any third party, or that violates + any applicable law; + (v) Licensee shall not use The Qt Company's or any of its suppliers' + names, logos, or trademarks to market Applications, except that + Licensee may use “Built with Qt” logo to indicate that Application(s) + was developed using the Licensed Software; + (vi) Licensee shall not distribute, sublicense or disclose source code of + Licensed Software to any third party (provided however that Licensee + may appoint employee(s) of Contractors as Designated Users to use + Licensed Software pursuant to this Agreement). Such right may be + available for the Licensee subject to a separate software development + kit (“SDK”) license agreement to be concluded with The Qt Company; + (vii) Licensee shall not grant the Customers a right to (i) make copies of + the Redistributables except when and to the extent required to use the + Applications and/or Devices for their intended purpose, (ii) modify + the Redistributables or create derivative works thereof, (iii) + decompile, disassemble or otherwise reverse engineer Redistributables, + or (iv) redistribute any copy or portion of the Redistributables to + any third party, except as part of the onward sale of the Device on + which the Redistributables are installed; + (viii) Licensee shall not and shall cause that its Affiliates or Contractors + shall not use Licensed Software in any Prohibited Combination, unless + Licensee has received an advance written permission from The Qt + Company to do so. Absent such written permission, any and all + distribution by the Licensee during the Term of a hardware device or + product a) which incorporate or integrate any part of Licensed + Software or Open Source Qt; or b) where the main user interface or + substantial functionality is provided by software built with + Licensed Software or Open Source Qt or otherwise depends on the + Licensed Software or Open Source Qt, shall be considered to be + Device distribution under this Agreement and shall be dependent on + Licensee’s compliance thereof (including but not limited to + obligation to pay applicable License Fees for such distribution). + Notwithstanding what is provided above in this sub-section (viii), + Licensee is entitled to use and combine Qt 3D Studio and/or Qt + Design Studio with Open Source Qt (“Permitted Combination”) for + its internal evaluation purposes, provided that Licensee shall in no + way transfer, publish, disclose, display or otherwise make available + any software or work resulting from such Permitted Combination; + (ix) Licensee shall cause all of its Affiliates and Contractors entitled + to make use of the licenses granted under this Agreement, to be + contractually bound to comply with the relevant terms of this + Agreement and not to use the Licensed Software beyond the terms + hereof and for any purposes other than operating within the scope of + their services for Licensee. Licensee shall be responsible for any + and all actions and omissions of its Affiliates and Contractors + relating to the Licensed Software and use thereof (including but not + limited to payment of all applicable License Fees); + (x) Except when and to the extent explicitly provided in this Section 3, + Licensee shall not transfer, publish, disclose, display or otherwise + make available the Licensed Software; and + (xi) Licensee shall not attempt or enlist a third party to conduct or + attempt to conduct any of the above. + +Above terms shall not be applicable if and to the extent they conflict with any +mandatory provisions of any applicable laws. Any use of Licensed Software +beyond the provisions of this Agreement is strictly prohibited and requires an +additional license from The Qt Company. + + +4. THIRD PARTY SOFTWARE +The Licensed Software may provide links to third party libraries or code +(collectively "Third Party Software") to implement various functions. Third +Party Software does not comprise part of the Licensed Software. In some cases, +access to Third Party Software may be included with the Licensed Software. Such +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. Licensee acknowledges that use or +distribution of Third Party Software is in all respects subject to applicable +license terms of applicable third party right holders. + + +5. PRE-RELEASE CODE +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”, “Sample” etc. (“Pre-Release Code”). + +Such Pre-Release Code may be present complimentary for the Licensee, 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. The +Pre-Release Code may not be at the level of performance and compatibility of a +final, generally available, product offering. The Pre-Release Code may not +operate correctly, may contain errors and may be substantially modified by The +Qt Company prior to the first 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. The Qt Company assumes no +liability whatsoever regarding any Pre-Release Code, but any use thereof is +exclusively at Licensee’s own risk and expense. + +For clarity, unless Licensed Software specifies different license terms for the +respective Pre- Release Code, the Licensee is entitled to use such pre-release +code pursuant to Section 3, just like other Licensed Software, provided however +that in the event Add-on Products are included and available as such Pre-Release +Code, Licensee’s right to use such Add-on Products is nevertheless subject to +and conditional upon conclusion of separate agreement with The Qt Company. + + +6. LIMITED WARRANTY AND WARRANTY DISCLAIMER +The Qt Company hereby represents and warrants that it has the power and +authority to grant the rights and licenses granted to Licensee under this +Agreement. Except as set forth above, the Licensed Software is licensed to +Licensee "as is" and Licensee’s exclusive remedy and The Qt Company’s entire +liability for errors in the Licensed Software shall be limited, at The Qt +Company’s option, to correction of the error, replacement of the Licensed +Software or return of the applicable fees paid for the defective Licensed +Software for the time period during which the License is not able to utilize the +Licensed Software under the terms of this Agreement. + +TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, THE QT COMPANY ON BEHALF OF +ITSELF AND ITS LICENSORS, SUPPLIERS AND AFFILIATES, DISCLAIMS ALL OTHER +WARRANTIES, EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, ANY IMPLIED +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND +NON-INFRINGEMENT WITH REGARD TO THE LICENSED SOFTWARE. THE QT COMPANY DOES NOT +WARRANT THAT THE LICENSED SOFTWARE WILL SATISFY LICENSEE’S REQUIREMENTS OR THAT +IT WILL OPERATE WITHOUT DEFECT OR ERROR OR THAT THE OPERATION THEREOF WILL BE +UNINTERRUPTED. + + +7. INDEMNIFICATION AND LIMITATION OF LIABILITY + +7.1 Limitation of Liability +EXCEPT FOR (I) CASES OF GROSS NEGLIGENCE OR INTENTIONAL MISCONDUCT, AND (II) +BREACH OF CONFIDENTIALITY, AND TO THE EXTENT PERMITTED BY APPLICABLE LAW, IN NO +EVENT SHALL EITHER PARTY BE LIABLE TO THE OTHER PARTY FOR ANY LOSS OF PROFIT, +LOSS OF DATA, LOSS OF BUSINESS OR GOODWILL OR ANY OTHER INDIRECT, SPECIAL, +CONSEQUENTIAL, INCIDENTAL OR PUNITIVE COST, DAMAGES OR EXPENSE OF ANY KIND, +HOWSOEVER ARISING UNDER OR IN CONNECTION WITH THIS AGREEMENT. + +EXCEPT FOR (I) CASES OF GROSS NEGLIGENCE OR INTENTIONAL MISCONDUCT, AND (II) +BREACH OF CONFIDENTIALITY, AND TO THE EXTENT PERMITTED BY APPLICABLE LAW, IN NO +EVENT SHALL EITHER PARTY’S TOTAL AGGREGATE LIABILITY UNDER THIS AGREEMENT EXCEED +THE AGGREGATE LICENSE FEES PAID OR PAYABLE TO THE QT COMPANY FROM LICENSEE +DURING THE PERIOD OF TWELVE (12) MONTHS IMMEDIATELY PRECEDING THE EVENT +RESULTING IN SUCH LIABILITY. THE PROVISIONS OF THIS SECTION 7 ALLOCATE THE +RISKS UNDER THIS AGREEMENT BETWEEN THE QT COMPANY AND LICENSEE AND THE PARTIES +HAVE RELIED UPON THE LIMITATIONS SET FORTH HEREIN IN DETERMINING WHETHER TO +ENTER INTO THIS AGREEMENT. NOTWITHSTANDING ANYTHING TO THE CONTRARY IN THIS +AGREEMENT, LICENSEE SHALL ALWAYS BE LIABLE TO PAY THE APPLICABLE LICENSE FEES +CORRESPONDING TO ITS ACTUAL USE OF LICENSED SOFTWARE. + + +8. SUPPORT, UPDATES AND ONLINE SERVICES +Upon due payment of the agreed License Fees the Licensee will be eligible to +receive Support and Updates and to use the Online Services during the License +Term, provided, however, that in the event the License Term is longer than 36 +months, the initial payment includes Support for only the first 12 months, +unless the Parties specifically otherwise agree. + +Unless otherwise decided by The Company at its free and absolute discretion, +Upgrades will not be included in the Support but may be available subject to +additional fees. From time to time The Qt Company may change the Support terms, +provided that during the respective ongoing License Term the level of Support +provided by The Qt Company may not be reduced without the consent of the +Licensee. Unless otherwise agreed, The Qt Company shall not be responsible for +providing any service or support to Customers. + + +9. CONFIDENTIALITY +Each Party acknowledges that during the Term of this Agreement each Party may +receive information about the other Party's business, business methods, business +plans, customers, business relations, technology, and other information, +including the terms of this Agreement, that is confidential and of great value +to the other Party, and the value of which would be significantly reduced if +disclosed to third parties (“Confidential Information”). Accordingly, when a +Party (the “Receiving Party”) receives Confidential Information from the other +Party (the “Disclosing Party”), the Receiving Party shall only disclose such +information to employees and Contractors on a need to know basis, and shall +cause its employees and employees of its Affiliates to: (i) maintain any and all +Confidential Information in confidence; (ii) not disclose the Confidential +Information to a third party without the Disclosing Party's prior written +approval; and (iii) not, directly or indirectly, use the Confidential +Information for any purpose other than for exercising its rights and fulfilling +its responsibilities pursuant to this Agreement. Each Party shall take +reasonable measures to protect the Confidential Information of the other Party, +which measures shall not be less than the measures taken by such Party to +protect its own confidential and proprietary information. Obligation of +confidentiality shall not apply to information that (i) is or becomes generally +known to the public through no act or omission of the Receiving Party; (ii) was +in the Receiving Party's lawful possession prior to the disclosure hereunder and +was not subject to limitations on disclosure or use; (iii) is developed +independently by employees or Contractors of the Receiving Party or other +persons working for the Receiving Party who have not had access to the +Confidential Information of the Disclosing Party, as proven by the written +records of the Receiving Party; (iv) is lawfully disclosed to the Receiving +Party without restrictions, by a third party not under an obligation of +confidentiality; or (v) the Receiving Party is legally compelled to disclose, in +which case the Receiving Party shall notify the Disclosing Party of such +compelled disclosure and assert the privileged and confidential nature of the +information and cooperate fully with the Disclosing Party to limit the scope of +disclosure and the dissemination of disclosed Confidential Information to the +minimum extent necessary. + +The obligations under this Section 9 shall continue to remain in force for a +period of five (5) years after the last disclosure, and, with respect to trade +secrets, for so long as such trade secrets are protected under applicable trade +secret laws. + + +10. FEES, DELIVERY AND PAYMENT + +10.1 License Fees +License Fees are described in The Qt Company’s standard price list, quote or +Purchase Order confirmation or in an appendix hereto, as the case may be. The +License Fees shall not be refunded or claimed as a credit in any event or for +any reason whatsoever. + +10.2 Ordering Licenses +Licensee may purchase Development Licenses and Distribution Licenses pursuant to +agreed pricing terms or, if no specific pricing terms have been agreed upon, at +The Qt Company's standard pricing terms applicable at the time of purchase. +Unless specifically otherwise provided, any pricing terms referenced in this +Agreement shall be valid for twelve (12) months from the date of this Agreement. +Licensee shall submit all purchase orders for Development Licenses and +Distribution Licenses to The Qt Company by email or any other method acceptable +to The Qt Company (each such order is referred to herein as a “Purchase Order”) +for confirmation, whereupon the Purchase Order shall become binding between the +Parties. + +10.3 Distribution License Packs +Unless otherwise agreed, Distribution Licenses shall be purchased by way of +Distribution License Packs. Upon due payment of the ordered Distribution +License Pack(s), the Licensee will have an account of Distribution Licenses +available for distributing the Redistributables in accordance with this +Agreement. Each time Licensee distributes a copy of Redistributables, then one +Distribution License is used, and Licensee’s account of available Distribution +Licenses is decreased accordingly. Licensee may distribute copies of the +Redistributables so long as Licensee has Distribution Licenses remaining on its +account. + +10.4 Payment Terms +License Fees and any other charges under this Agreement shall be paid by +Licensee no later than thirty (30) days from the date of the applicable invoice +from The Qt Company. The Qt Company will submit an invoice to Licensee after +the date of this Agreement and/or after The Qt Company receives a Purchase Order +from Licensee. A late payment charge of the lower of (a) one percent per month; +or (b) the interest rate stipulated by applicable law, shall be charged on any +unpaid balances that remain past due. + +10.5 Taxes +All License Fees and other charges payable hereunder are gross amounts but +exclusive of any value added tax, use tax, sales tax, withholding tax and other +taxes, duties or tariffs (“Taxes”) levied directly for the sale, delivery or use +of Licensed Software hereunder pursuant to any applicable law. Such applicable +Taxes shall be paid by Licensee to The Qt Company, or, where applicable, in lieu +of payment of such Taxes to The Qt Company, Licensee shall provide an exemption +certificate to The Qt Company and any applicable authority. + +11 RECORD-KEEPING AND REPORTING OBLIGATIONS; AUDIT RIGHTS + +11.1 Licensee’s Record-keeping +Licensee shall at all times during the Term of this Agreement and for a period +of seven (7) years thereafter maintain Licensee’s Records in an accurate and +up-to-date form. Licensee’s Records shall be adequate to reasonably enable The +Qt Company to determine Licensee’s compliance with the provisions of this +Agreement. The records shall conform to general good accounting practices. +Licensee shall, within thirty (30) days from receiving The Qt Company’s request +to that effect, deliver to The Qt Company a report based on Licensee’s Records, +such report to contain information, in sufficient detail, on (i) number and +identity of users working with Licensed Software or Open Source Qt, (ii) copies +of Redistributables distributed by Licensee during the most recent calendar +quarter and/or any other term specified by The Qt Company, (iii) number of +undistributed copies of Redistributables and corresponding number of unused +Distribution Licenses remaining on Licensee’s account, and (iv) any other +information as The Qt Company may reasonably require from time to time. + +11.2. The Qt Company’s Audit Rights +The Qt Company or an independent auditor acting on behalf of The Qt Company’s, +may, upon at least five (5) business days’ prior written notice and at its +expense, audit Licensee with respect to the Licensee’s use of the Licensed +Software, but not more frequently than once during each 6- month period. Such +audit may be conducted by mail, electronic means or through an in-person visit +to Licensee’s place of business. Any such in-person audit shall be conducted +during regular business hours at Licensee's facilities and shall not +unreasonably interfere with Licensee's business activities. The Qt Company or +the independent auditor acting on behalf of The Qt Company shall be entitled to +inspect Licensee’s Records and conduct necessary interviews of Licensee’s +relevant employees and Contractors. All such Licensee’s Records and use thereof +shall be subject to an obligation of confidentiality under this Agreement. If +an audit reveals that Licensee is using the Licensed Software beyond scope of +the licenses Licensee has paid for, Licensee agrees to pay The Qt Company any +amounts owed for such unauthorized use within 30 days from receipt of the +corresponding invoice from The Qt Company. In addition, in the event the audit +reveals a material violation of the terms of this 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 the Licensee shall pay The Qt Company's reasonable cost +of conducting such audit. + + +12 TERM AND TERMINATION + +12.1 Agreement Term +This Agreement shall enter into force upon due acceptance by both Parties and +remain in force for as long as there is any Development License(s) purchased +under this Agreement in force (“Term”), unless and until terminated pursuant to +the terms of this Section 12. + +12.2 Termination and suspension of rights +Either Party shall have the right to terminate this Agreement upon thirty (30) +days prior written notice if the other Party commits a material breach of any +obligation of this Agreement and fails to remedy such breach within such notice +period. Instead of termination, The Qt Company shall have the right to suspend +or withhold grants of all rights to the Licensed Software hereunder, including +but not limited to the Development Licenses, Distribution License, and Support, +should Licensee fail to make payment in timely fashion or otherwise violates or +is reasonably suspected to violate its obligations or terms of this Agreement, +and where such violation or breach is not cured within five (5) business days +following The Qt Company’s written notice thereof. + +12.3 Mutual Right to Terminate +Either Party shall have the right to terminate this Agreement immediately upon +written notice in the event that the other Party becomes insolvent, files for +any form of bankruptcy, makes any assignment for the benefit of creditors, has a +receiver, administrative receiver or officer appointed over the whole or a +substantial part of its assets, ceases to conduct business, or an act equivalent +to any of the above occurs under the laws of the jurisdiction of the other +Party. + +12.4 Parties´ Rights and Duties upon Termination +Upon expiry or termination of the Agreement Licensee shall cease and shall cause +all Designated Users (including those of its Affiliates’ and Contractors’) to +cease using the Licensed Software and distribution of the Redistributables under +this Agreement. Notwithstanding the above, in the event the Agreement expires +or is terminated: + (i) as a result of The Qt Company choosing not to renew the Development + License(s) as set forth in Section 3.1, then all valid licenses + possessed by the Licensee at such date shall be extended to be valid + in perpetuity under the terms of this Agreement and Licensee is + entitled to purchase additional licenses as set forth in Section + 10.2; or + (ii) for reason other than by The Qt Company pursuant to item (i) above or + pursuant to Section 12.2, then the Licensee is entitled, for a period + of six (6) months after the effective date of termination, to continue + distribution of Devices under the Distribution Licenses paid but + unused at such effective date of termination. + +Upon any such termination the Licensee shall destroy or return to The Qt Company +all copies of the Licensed Software and all related materials and will certify +the same to The Qt Company upon its request, provided however that Licensee may +retain and exploit such copies of the Licensed Software as it may reasonably +require in providing continued support to Customers. Expiry or termination of +this Agreement for any reason whatsoever shall not relieve Licensee of its +obligation to pay any License Fees accrued or payable to The Qt Company prior to +the effective date of termination, and Licensee shall immediately pay to The Qt +Company all such fees upon the effective date of termination. Termination of +this Agreement shall not affect any rights of Customers to continue use of +Applications and Devices (and therein incorporated Redistributables). + +12.5 Extension in case of bankruptcy +In the event The Qt Company is declared bankrupt under a final, non-cancellable +decision by relevant court of law, and this Agreement is not, at the date of +expiry of the Development License(s) pursuant to Section 3.1, assigned to party, +who has assumed The Qt Company’s position as a legitimate licensor of Licensed +Software under this Agreement, then all valid licenses possessed by the Licensee +at such date of expiry, and which the Licensee has not notified for expiry, +shall be extended to be valid in perpetuity under the terms of this Agreement. + + +13. GOVERNING LAW AND LEGAL VENUE +In the event this Agreement is in the name of The Qt Company Inc., a Delaware +Corporation, then: + (i) this Agreement shall be construed and interpreted in accordance with + the laws of the State of California, USA, excluding its choice of law + provisions; + (ii) the United Nations Convention on Contracts for the International Sale + of Goods will not apply to this Agreement; and + (iii) any dispute, claim or controversy arising out of or relating to this + Agreement or the breach, termination, enforcement, interpretation or + validity thereof, including the determination of the scope or + applicability of this Agreement to arbitrate, shall be determined by + arbitration in San Francisco, USA, before one arbitrator. The + arbitration shall be administered by JAMS pursuant to JAMS' + Streamlined Arbitration Rules and Procedures. Judgment on the Award + may be entered in any court having jurisdiction. This Section shall + not preclude parties from seeking provisional remedies in aid of + arbitration from a court of appropriate jurisdiction. + +In the event this Agreement is in the name of The Qt Company Ltd., a Finnish +Company, then: + (i) this Agreement shall be construed and interpreted in accordance with + the laws of Finland, excluding its choice of law provisions; + (ii) the United Nations Convention on Contracts for the International Sale + of Goods will not apply to this Agreement; and + (iii) any disputes, controversy or claim arising out of or relating to this + Agreement, or the breach, termination or validity thereof shall be + finally settled by arbitration in accordance with the Arbitration + Rules of Finland Chamber of Commerce. The arbitration tribunal shall + consist of one (1), or if either Party so requires, of three (3), + arbitrators. The award shall be final and binding and enforceable in + any court of competent jurisdiction. The arbitration shall be held in + Helsinki, Finland and the process shall be conducted in the English + language. This Section shall not preclude parties from seeking + provisional remedies in aid of arbitration from a court of + appropriate jurisdiction. + + +14. GENERAL PROVISIONS + +14.1 No Assignment +Except in the case of a merger or sale of substantially all of its corporate +assets, Licensee shall not be entitled to assign or transfer all or any of its +rights, benefits and obligations under this Agreement without the prior written +consent of The Qt Company, which shall not be unreasonably withheld or delayed. +The Qt Company shall be entitled to freely assign or transfer any of its rights, +benefits or obligations under this Agreement. 14.2 No Third Party +Representations Licensee shall make no representations or warranties concerning +the Licensed Software on behalf of The Qt Company. Any representation or +warranty Licensee makes or purports to make on The Qt Company’s behalf shall be +void as to The Qt Company. 14.3 Surviving Sections Any terms and conditions +that by their nature or otherwise reasonably should survive termination of this +Agreement shall so be deemed to survive. Such sections include especially the +following: 1, 2, 6, 7, 9, 11, 12.4, 13 and 14. + +14.4 Entire Agreement +This Agreement, the exhibits hereto, the License Certificate and any applicable +Purchase Order accepted by The Qt Company constitute the complete agreement +between the Parties and supersedes all prior or contemporaneous discussions, +representations, and proposals, written or oral, with respect to the subject +matters discussed herein. In the event of any conflict or inconsistency between +this Agreement and any Purchase Order, the terms of this Agreement will prevail +over the terms of the Purchase Order with respect to such conflict or +inconsistency. Parties specifically acknowledge and agree that this Agreement +prevails over any click-to-accept or similar agreements the Designated Users may +need to accept online upon download of the Licensed Software, as may be required +by The Qt Company’s applicable processes relating to Licensed Software. + +14.5 Modifications +No modification of this Agreement shall be effective unless contained in a +writing executed by an authorized representative of each Party. No term or +condition contained in Licensee's Purchase Order (“Deviating Terms”) shall apply +unless The Qt Company has expressly agreed such Deviating Terms in writing. +Unless and to the extent expressly agreed by The Qt Company, any such Deviating +Terms shall be deemed void and with no legal effect. For clarity, delivery of +the Licensed Software following the receipt of the Purchase Order including +Deviating Terms shall not constitute acceptance of such Deviating Terms.” + +14.6 Force Majeure +Except for the payment obligations hereunder, neither Party shall be liable to +the other for any delay or non-performance of its obligations hereunder in the +event and to the extent that such delay or non-performance is due to an event of +act of God, terrorist attack or other similar unforeseeable catastrophic event +that prevents either Party for fulfilling its obligations under this Agreement +and which such Party cannot avoid or circumvent (“Force Majeure Event”). If the +Force Majeure Event results in a delay or non-performance of a Party for a +period of three (3) months or longer, then either Party shall have the right to +terminate this Agreement with immediate effect without any liability (except for +the obligations of payment arising prior to the event of Force Majeure) towards +the other Party. + +14.7 Notices +Any notice given by one Party to the other shall be deemed properly given and +deemed received if specifically acknowledged by the receiving Party in writing +or when successfully delivered to the recipient by hand, fax, or special courier +during normal business hours on a business day to the addresses specified for +each Party on the signature page. Each communication and document made or +delivered by one Party to the other Party pursuant to this Agreement shall be in +the English language. + +14.8 Export Control +Licensee acknowledges that the Redistributables, as incorporated in Applications +or Devices, may be subject to export control restrictions under the applicable +laws of respective countries. Licensee shall fully comply with all applicable +export license restrictions and requirements as well as with all laws and +regulations relating to the Redistributables and exercise of licenses hereunder +and shall procure all necessary governmental authorizations, including without +limitation, all necessary licenses, approvals, permissions or consents, where +necessary for the re-exportation of the Redistributables, Applications and/or +Devices. + +14.9 No Implied License +There are no implied licenses or other implied rights granted under this +Agreement, and all rights, save for those expressly granted hereunder, shall +remain with The Qt Company and its licensors. In addition, no licenses or +immunities are granted to the combination of the Licensed Software with any +other software or hardware not delivered by The Qt Company under this Agreement. + +14.10 Attorney Fees +The prevailing Party in any action to enforce this Agreement shall be entitled +to recover its attorney’s fees and costs in connection with such action. + +14.11 Privacy +Licensee acknowledges and agrees that for the purpose of this Agreement, The Qt +Company may collect, use, transfer and disclose personal data pertaining to +Designated Users as well as any other employees and directors of the Licensee +and its Contractors relevant for carrying out the intent of this Agreement. Such +personal data may be collected from the Licensee or directly from the relevant +individuals. The Parties acknowledge that with regard to such personal data +processed hereunder, The Qt Company shall be regarded as the Data Controller +under the applicable Data Protection Legislation. The Qt Company shall process +any such personal data in accordance with its privacy policies and practices, +which will comply with all applicable requirements of the Data Protection +Legislation. + +14.12 Severability + +If any provision of this Agreement shall be adjudged by any court of competent +jurisdiction to be unenforceable or invalid, that provision shall be limited or +eliminated to the minimum extent necessary so that this Agreement shall +otherwise remain in full force and effect and enforceable. + + +APPENDICES + +This Agreement includes Appendix 1 or/and Appendix 8, and possibly one or more +of the appendices 3-5, depending on the product(s) purchased by the Licensee, +what is stated in the quote or invoice, and/or what is stated in the Licensee’s +License Certificate. + + +APPENDIX 1: LICENSED SOFTWARE + +1a. Licensed Software - Qt Toolkit + +Module Description +Qt Core Core non-graphical classes used by other modules. +Qt GUI Base classes for graphical user interface (GUI) + components. +Qt Multimedia Classes for audio, video and camera functionality. +Qt Multimedia Widgets Widget-based classes for implementing multimedia + functionality. +Qt Network Classes to make network programming easier and more + portable. +Qt QML Classes for QML and JavaScript languages. +Qt Quick A declarative framework for building highly dynamic + applications with custom user interfaces. +Qt Quick Controls 2 Provides lightweight QML types for creating + performant user interfaces for desktop, embedded, + and mobile devices. +Qt Quick Dialogs Types for creating and interacting with system + dialogs from a Qt Quick application. +Qt Quick Layouts Layouts are items that are used to arrange Qt Quick + 2 based items in the user interface. +Qt Quick Test A unit test framework for QML applications. +Qt SQL Classes for database integration using SQL. +Qt Test Classes for unit testing Qt applications and + libraries. +Qt Widgets Classes to extend Qt GUI with C++ widgets. +Active Qt Classes for applications which use ActiveX and COM +Qt 3D Functionality for near-realtime simulation systems + with support for 2D and 3D rendering. +Qt Android Extras Provides platform-specific APIs for Android. +Qt Bluetooth Provides access to Bluetooth hardware. +Qt Canvas 3D Enables OpenGL-like 3D drawing calls from Qt Quick + applications using JavaScript. +Qt Concurrent Classes for writing multi-threaded programs without + using low-level threading primitives. +Qt D-Bus Classes for inter-process communication over the + D-Bus protocol. +Qt Gamepad Enables Qt applications to support the use of gamepad + hardware. +Qt Graphical Effects Graphical effects for use with Qt Quick 2. +Qt Help Classes for integrating documentation into + applications, similar to Qt Assistant. +Qt Image Formats Plugins for additional image formats: TIFF, + MNG, TGA, WBMP. +Qt Location Displays map, navigation, and place content in a QML + application. +Qt Mac Extras Provides platform-specific APIs for macOS. +Qt Network Authorization Provides support for OAuth-based authorization to + online services. +Qt NFC Provides access to Near-Field communication (NFC) + hardware. +Qt Platform Headers Provides classes that encapsulate platform-specific + information. +Qt Positioning Provides access to position, satellite and area + monitoring classes. +Qt Print Support Classes to make printing easier and more portable. +Qt Purchasing Enables in-app purchase of products in Qt + applications. +Qt for Python Python bindings for Qt. +Qt Quick Controls Reusable Qt Quick based UI controls to create + classic desktop-style user interfaces. +Qt Quick Extras Provides a specialized set of controls that can + be used to build interfaces in Qt Quick. +Qt Quick Widgets Provides a C++ widget class for displaying a Qt + Quick user interface. +Qt SCXML Provides classes and tools for creating state + machines from SCXML files. +Qt Sensors Provides access to sensor hardware and motion + gesture recognition. +Qt Serial Bus Provides access to serial industrial bus interface. +Qt Serial Port Provides access to hardware and virtual serial ports. +Qt Speech Provides support for accessibility features such as + text-to-speech. +Qt SVG Classes for displaying the contents of SVG files. +Qt UI Tools Classes for loading QWidget based forms created in + Qt Designer dynamically, at runtime. +Qt WebChannel Provides access to QObject or QML objects from HTML + clients for seamless integration of Qt applications + with HTML/JavaScript clients. +Qt WebEngine Classes and functions for embedding web content in + applications using the Chromium browser project. +Qt WebSockets Provides WebSocket communication. +Qt WebView Displays web content in a QML application by using + APIs native to the platform. +Qt Windows Extras Provides platform-specific APIs for Windows. +Qt X11 Extras Provides platform-specific APIs for X11. +Qt XML C++ implementations of SAX and DOM. +Qt XML Patterns Support for XPath, XQuery, XSLT and XML schema + validation. +Qt Wayland Compositor Provides a framework to develop a Wayland compositor. +Qt Charts UI Components for displaying charts. +Qt Data Visualization UI Components for creating 3D data visualizations. +Qt Virtual Keyboard A framework for implementing different input methods + as well as a QML virtual keyboard. + + +1b. Licenses software – Embedded software development libraries + +Module Description +Boot 2 Qt stack Yocto based Embedded Linux stack for selected + target hardware. +Qt OTA Client-side capability for device image updates Over + The Air. +Device Utilities Collection of API’s to manage the device; E.g. + display, WiFi and Bluetooth settings. +Qt Debugging Bridge (QDB) Daemon Enables host-target deployment, debugging, + profiling and other features over USB. Up to developer + to decide if this is left in the final solution. + + +1c. Licensed Software - Qt Tools/Applications + +Tool Description +Qt Creator The integrated development environment for Qt. +Qt Designer Qt tool for designing and building graphical user + interfaces. +Qt Linguist Tool used to add translations to Qt applications. +Qt Assistant Tool for viewing online documentation in Qt + help-file format. +Qmake Utility tool used to automate the generation of make + files. +uic User interface compiler for the Qt GUI toolkit. +rcc Resource compiler used for embedding resources into + Qt applications. +lupdate Tool that finds the translatable strings in the + specified source, header and Qt Designer interface + files, and produces or updates translation files. +lrelease Tool that produces translation files in the compact + binary format used by localized Qt applications. +qlalr Qt parser generator tool. +qdoc Configurable documentation generation tool. +qmlscene QML launcher tool. +qmlviewer QML launcher tool. + + +1d. Licenses software –Qt Tools/Applications specific to embedded software +development + +Tool Description +Target toolchains Cross compilation toolchains for supported target + devices and operating systems. +Qt Debugging Bridge (QDB) Enables deployment, debugging, profiling and other +Host Tools features over USB from development host PC to target + device. +qtconfig-gui Qt Lite Configurator tool graphical interface. +Qt Emulator Qt Emulator + + +2. Parts of the Licensed Software that are permitted for distribution in +object-code form only (“Redistributables”) under this Agreement: + +2a. Qt for Application Development + + - The Licensed Software's Qt Toolkit libraries defined in 1a + - The Licensed Software's installer framework + +2b. Qt for Device Creation + + - Qt for Application Development Redistributables defined in 2a + - The Licensed Software’s Embedded software development libraries defined + in 1b + +2c. Qt 3D Studio + +- The Licensed Software’s Qt 3D Studio Runtime (“Qt53DStudioRuntime2”) + + +APPENDIX 3: ADDITIONS TO LICENSED SOFTWARE + +1. Licensed Software + +In addition to what is provided under the definition of the Licensed Software, +Parties agree that Licensed Software shall also include the following additional +software products of The Qt Company if included in the quote / invoice: + +Additional software product Description +Qt for Automation A collection of software components and + libraries targeted for the development of + automation systems. +Qt Safe Renderer Provides a UI rendering component that can be + used to render safety- critical items as well + as documentation and certification artifacts. +Qt Application Manager Daemon, that helps to create embedded Linux + systems that have a highly complex UI setup. +GammaRay A software introspection tool for Qt + applications. + + +2. Parts of the Licensed Software that are permitted for distribution in +object-code form only (“Redistributables”) under this Agreement: + + - Qt for Automation The Licensed Software’s Qt for Automation + libraries defined in 1 + - Qt Safe Renderer The Licensed Software’s Qt Safe Renderer + libraries defined in 1 + - Qt Application Manager The Licensed Software’s Qt Application Manager + libraries defined in 1 + +All the above is considered as Redistributables and subject to applicable +provisions and limitations including but not limited to what is defined in +section 3. + + +APPENDIX 4: SMALL BUSINESS AND START-UP APPENDIX + +The provisions of this Appendix 4 are applicable for Start-up Companies and for +the Evaluation Term. + +For the purpose of this Appendix 4, the following additional definitions shall +be applicable: +“Trial Term” shall mean a period of twelve (12) months. + +“Start-up Company” means a company with a maximum annual revenue, including +funding, equivalent to 100,000 USD (in applicable currency) during a respective +calendar year, as evidenced by duly audited records of the Licensee and approved +by The Qt Company. + +During the Trial Term, Section 3 shall apply with following modifications +(“Trial Term Modifications”): + + - Licenses granted under Sections 3.1 and 3.2 shall be free of any charge. + For clarity, License for distribution of Devices pursuant to Section 3.3 is + subject to applicable License Fee for necessary Distribution Licenses; + - Development License under Section 3.1 is limited to a maximum of three (3) + Designated Users; and + - Support is available subject to availability, as judged by The Qt Company + at its free and absolute discretion, provided that support will be limited + to a maximum of ten (10) tickets during the Trial Term. + +Upon expiry of the Trial Term: + + a) This Appendix 4 is terminated, Trial Term Modifications cease to remain in + force, Licensee’s Development Licenses shall be automatically converted + into licenses subject to a License Fee (in the amount specified in the + quote or in Appendix 2 and payable with a 30-day payment term) and + Licensee’s rights and obligations under this Agreement shall continue to + remain in force under the standard provisions of the Agreement, unless the + Licensee notifies The Qt Company in writing no less than ninety (90) days + before such expiry date that Licensee does not agree to such continuance, + in which event the Agreement, and all rights of the Licensee thereunder, + shall expire; provided however that + b) in the event the Licensee still qualifies as a Start-up Company, the + Licensee has an option (“Option”), instead of what is stated in item a) + above, to extend the Trial Term renewal is limited to one time and total + duration of Trial Terms thus to 24 months after the effective date. + Licensee shall notify The Qt Company in writing no less than ninety (90) + days before the expiry date, if Licensee wish to exercise the Option. + + +APPENDIX 5: NON-COMMERCIAL USE APPENDIX + +The provisions of this Appendix 5 are applicable for non-commercial use of the +Licensed Software by the Licensee. For the purpose of this Appendix 5, the +following additional definitions (replacing the relevant definition of the +Agreement, where applicable) shall be applicable: + +“Demo Units” shall mean + (i) hardware development platform, which incorporates the Licensed + Software along with Licensee’s software and/or hardware, and + (ii) prototype versions of Applications or Devices. + +“Designated User(s)” shall mean the employees and students of the Licensee. + +“Licensee Products” shall mean Applications and/or Devices. + +“Permitted Purpose” shall mean + (i) Licensee’s internal evaluation and testing of Licensed Software, + (ii) building Demo Units as well as + (iii) educational use. + +“Term” shall mean a period of twelve (12) months or any such other period as +may be agreed between the Parties. + +For the purpose of this Appendix 5, the following changes shall be agreed with +respect to relevant Sections of the Agreement: + I. Recital (A) shall be replaced in its entirety to read as follows: “(A) + Licensee wishes to use the Licensed Software for the Permitted Purpose.” + II. Section 3.1 shall be replaced in its entirety to read as follows: “The + Qt Company grants to Licensee a personal, non-exclusive, + non-transferable, revocable, royalty-free license, valid for the Term, + to use, modify and copy the Licensed Software solely for the Permitted + Purpose. Licensee may install copies of the Licensed Software on an + unlimited number of computers provided that only Designated Users may + use the Licensed Software. Licensee may demonstrate the Demo Units, + provided that such demonstrations must be conducted by Licensee, and + the Demo Units must remain in Licensee’s possession and under + Licensee’s control at all times. For clarity, this Agreement does not + (i) entitle Licensee to use Licensed Software to create Applications + or Devices (other than prototypes thereof) or + (ii) carry any distribution rights to Licensee, but such rights are + subject to and conditional upon conclusion of a separate + license agreement with The Qt Company.” + III. Sections 3.2, 3.3, 8 and 10 shall be deleted. + IV. Section 3.4 shall be replaced in its entirety to read as follows: + “Licensee shall not: + - remove or alter any copyright, trademark or other proprietary + rights notice contained in any portion of the Licensed Software; + - transfer, publish, sublicense, disclose, display or otherwise make + the Licensed Software available to any third party (except that + Licensee may demonstrate the Demo Units pursuant to Section 3.1); + - in any way combine, incorporate or integrate Licensed Software + with, or use Licensed Software for creation of, any software + created with or incorporating Open Source Qt; + - Licensee shall cause all Designated Users who make use of the + licenses granted under this Agreement, to be contractually bound to + comply with the relevant terms of this Agreement and not to use the + Licensed Software beyond the terms hereof. Licensee shall be + responsible for any and all actions and omissions of its Designated + Users relating to the Licensed Software and use thereof. Any use + of Licensed Software beyond the provisions of this Agreement is + strictly prohibited and requires an additional license from The Qt + Company.” + V. Section 12 shall be replaced in its entirety to read as follows: “This + Agreement shall enter into force upon due acceptance by both Parties + and remain in force for the Term, unless and until terminated pursuant + to the terms of Section 12. Upon termination of the Agreement, Licensee + shall cease using the Licensed Software. All other copies of Licensed + Software in the possession or control of Licensee must be erased or + destroyed. An officer of Licensee must, upon request, promptly deliver + to The Qt Company a written confirmation that this has occurred.” + +Except for the modifications specified above, this Appendix carries no change to +the terms of the Agreement, which shall remain in full force. + + +APPENDIX 8: QT FOR DEVICE CREATION MCU APPENDIX + +This Appendix 8 shall be applicable in case the Licensee and/or respective +Designated User have purchased Qt for Device Creation MCU, either as an +add-on or standalone package. In case Qt for Device Creation MCU is purchased +as an addition to Qt for Device Creation, this appendix is an addition to +Appendix 1. In any other case, this appendix replaces Appendix 1. + +1a. Licensed Software - Qt Toolkit + +Module Description +Qt Quick Controls 2 Provides lightweight QML types for creating + performant user interfaces for desktop, embedded, + and mobile devices. + + +1b. Licensed software – Embedded software development libraries + +Module Description +Qt Quick Ultralite Qt Quick Ultralite (QUL) rendering engine and sample + source codes. +Qt Quick Ultralite Platform adaptations including OS support that allow +Platform Adaptations applications on QUL to run on microcontrollers + + +1c. Licensed Software - Qt Tools/Applications + +Tool Description +Qt Creator The integrated development environment for Qt. +Qt Designer Qt tool for designing and building graphical user + interfaces. +Qt Linguist Tool used to add translations to Qt applications. +Qt Assistant Tool for viewing online documentation in Qt help-file + format. +lupdate Tool that finds the translatable strings in the + specified source, header and Qt Designer interface + files, and produces or updates translation files. +lrelease Tool that produces translation files in the compact + binary format used by localized Qt applications. + + +1d. Licensed software – Qt Tools/Applications specific to embedded software +development + +Tool Description +Target toolchains Cross compilation toolchains for supported target + devices and operating systems. +qmlinterfaceextractor Tool to generate QML from header file. +qml2cpp Tool to convert QML to C++ files. +fontcompiler Tool to compile font meta data and True Type fonts. + + +2. Parts of the Licensed Software that are permitted for distribution in +object-code form only (“Redistributables”) under this Agreement: + + - The Licensed Software’s Embedded software development libraries + defined in 1b. diff --git a/LICENSE.QT-LICENSE-AGREEMENT-4.0 b/LICENSE.QT-LICENSE-AGREEMENT-4.0 deleted file mode 100644 index 74bd6bb41c..0000000000 --- a/LICENSE.QT-LICENSE-AGREEMENT-4.0 +++ /dev/null @@ -1,913 +0,0 @@ -QT LICENSE AGREEMENT -Agreement version 4.0 - -This License Agreement ("Agreement") is a legal agreement between The Qt -Company (as defined below) and the Licensee (as defined below) for the license -of Licensed Software (as defined below). Capitalized terms used herein are -defined in Section 1. - -WHEREAS: - -(A). Licensee wishes to use the Licensed Software for the purpose of developing -and distributing Applications and/or Devices; and - -(B). The Qt Company is willing to grant the Licensee a right to use Licensed -Software for such purpose pursuant to term and conditions of this Agreement. - -NOW, THEREFORE, THE PARTIES HEREBY AGREE AS FOLLOWS: - -1. DEFINITIONS - -"Affiliate" of a Party shall mean an entity (i) which is directly or indirectly -controlling such Party; (ii) which is under the same direct or indirect -ownership or control as such Party; or (iii) which is directly or indirectly -owned or controlled by such Party. For these purposes, an entity shall be -treated as being controlled by another if that other entity has fifty percent -(50 %) or more of the votes in such entity, is able to direct its affairs -and/or to control the composition of its board of directors or equivalent body. - -"Applications" shall mean Licensee's software products created using the -Licensed Software, which may include the Redistributables, or part -thereof. - -"Contractor(s)" shall mean third party consultants, distributors and -contractors performing services to a Party under applicable contractual -arrangement. - -"Customer(s)" shall mean Licensee's end users to whom Licensee, directly or -indirectly, distributes copies of the Redistributables. - -"Deployment Platforms" shall mean operating systems specified in the License -Certificate, in which the Redistributables can be distributed pursuant to the -terms and conditions of this Agreement. - -"Designated User(s)" shall mean the employee(s) of Licensee or Licensee's -Affiliates acting within the scope of their employment or Licensee's -Contractors acting within the scope of their services for Licensee and on -behalf of Licensee. Designated Users shall be named in the License Certificate. - -"Development License" shall mean the license needed by the Licensee for each -Designated User to use the Licensed Software under the license grant described -in Section 3.1 of this Agreement. - -"Development Platforms" shall mean those operating systems specified in the -License Certificate, in which the Licensed Software can be used under the -Development License, but not distributed in any form or used for any other -purpose. - -"Devices" shall mean hardware devices or products that 1) are manufactured -and/or distributed by the Licensee or its Affiliates or Contractors, and -(2)(i) incorporate or integrate the Redistributables or parts thereof; or (ii) -do not incorporate or integrate the Redistributables at the time of -distribution, but where, when used by a Customer, the main user interface or -substantial functionality of such device is provided by Application(s) or -otherwise depends on the Licensed Software. - -"Distribution License(s)" shall mean the license required for distribution of -Redistributables in connection with Devices pursuant to license grant described -in Section 3.3 of this Agreement. - -"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, Purchase Order confirmation or in an appendix hereto, -as the case may be. - -"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. - -"License Certificate" shall mean a certificate generated by The Qt Company for -each Designated User respectively upon them downloading the licensed Software. -License Certificate will be available under respective Designated User's Qt -Account at account.qt.io and it will specify the Designated User, the -Development Platforms, Deployment Platforms and the License Term. The terms of -the License Certificate are considered part of this Agreement and shall be -updated from time to time to reflect any agreed changes to the foregoing terms -relating to Designated User's rights to the Licensed Software. - -"License Fee" shall mean the fee charged to the Licensee for rights granted -under the terms of this Agreement. - -"License Term" shall mean the agreed validity period of the Development -License of the respective Designated User, during which time the -Designated User is entitled to use the Licensed Software, as set forth in the -respective License Certificate. - -"Licensed Software" shall mean all versions of the - -(i) Qt Toolkit (including Qt Essentials, Qt Add-Ons and Value-Add modules) as -described in http://doc.qt.io/qt-5/qtmodules.html, - -(ii) Qt Creator (including Creator IDE tool) as described in -http://doc.qt.io/qtcreator/index.html, - -(iii) Qt 3D Studio as described in http://doc.qt.io/qt3dstudio/index.html, and - -as well as corresponding online or electronic documentation, associated media -and printed materials, including the source code, example programs and the -documentation, licensed to the Licensee under this Agreement. Licensed Software -does not include Third Party Software (as defined in Section 4), Open Source -Qt, or other software products of The Qt Company (for example Qt Safe Renderer -and Qt for Automation), unless such other software products of The Qt Company -are separately agreed in writing to be included in scope of the Licensed -Software. - -"Licensee" shall mean the individual or legal entity that is party to this -Agreement, as identified on the signature page hereof. - -"Licensee's Records" shall mean books and records that are likely to contain -information bearing on Licensee's compliance with this Agreement or the -payments due to The Qt Company under this Agreement, including, but not limited -to: assembly logs, sales records and distribution records. - -"Modified Software" shall have the meaning as set forth in Section 2.3. - -"Online Services" shall mean any services or access to systems made available -by The Qt Company to the Licensee over the Internet relating to the Licensed -Software or for the purpose of use by the Licensee of the Licensed Software or -Support. Use of any such Online Services is discretionary for the Licensee and -some of them may be subject to additional fees. - -"Open Source Qt" shall mean the non-commercial Qt computer software products, -licensed 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, Open Source Qt shall not be provided nor governed under -this Agreement. - -"Party" or "Parties" shall mean Licensee and/or The Qt Company. - -"Redistributables" shall mean the portions of the Licensed Software set forth -in Appendix 1, Section 1 that may be distributed pursuant to the terms of this -Agreement in object code form only, including any relevant documentation. -Where relevant, any reference to Licensed Software in this Agreement shall -include and refer also to Redistributables. - -"Renewal Term" shall mean an extension of previous License Term as agreed -between the Parties. - -"Submitted Modified Software" shall have the meaning as set forth in -Section 2.3. - -"Support" shall mean standard developer support that is provided by The Qt -Company to assist Designated Users in using the Licensed Software in -accordance with The Qt Company's standard support terms and as further -defined in Section 8 hereunder. - -"Taxes" shall have the meaning set forth in Section 10.5. - -"Term" shall have the meaning set forth in Section 12. - -"The Qt Company" shall mean: - -(i) in the event Licensee is an individual residing in the United States or a -legal entity incorporated in the United States or having its headquarters in -the United States, The Qt Company Inc., a Delaware corporation with its office -at 2350 Mission College Blvd., Suite 1020, Santa Clara, CA 95054, USA.; or - -(ii) in the event the Licensee is an individual residing outside of the United -States or a legal entity incorporated outside of the United States or having -its registered office outside of the United States, The Qt Company Ltd., a -Finnish company with its registered office at Bertel Jungin aukio D3A, 02600 -Espoo, Finland. - -"Third Party Software " shall have the meaning set forth in Section 4. - -"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 the Licensee under the Support. Updates shall be considered as -part of the Licensed Software hereunder. - -"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 Upgrades are -provided to the Licensee under this Agreement, they shall be considered as -part of the Licensed Software hereunder. - -2. OWNERSHIP - -2.1 Ownership of The Qt Company - -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. - -All The Qt Company's Intellectual Property Rights are and shall remain the -exclusive property of The Qt Company or its licensors respectively. - -2.2 Ownership of Licensee - -All the Licensee's Intellectual Property Rights are and shall remain the -exclusive property of the Licensee or its licensors respectively. - -All Intellectual Property Rights to the Modified Software, Applications and -Devices shall remain with the Licensee and no rights thereto shall be granted -by the Licensee to The Qt Company under this Agreement (except as set forth in -Section 2.3 below). - -2.3 Modified Software - -Licensee may create bug-fixes, error corrections, patches or modifications to -the Licensed Software ("Modified Software"). Such Modified Software may break -the source or binary compatibility with the Licensed Software (including -without limitation through changing the application programming interfaces -("API") or by adding, changing or deleting any variable, method, or class -signature in the Licensed Software and/or any inter-process protocols, services -or standards in the Licensed Software libraries). To the extent that Licensee's -Modified Software so breaks source or binary compatibility with the Licensed -Software, Licensee acknowledges that The Qt Company's ability to provide -Support may be prevented or limited and Licensee's ability to make use of -Updates may be restricted. - -Licensee may, at its sole and absolute discretion, choose to submit Modified -Software to The Qt Company ("Submitted Modified Software") in connection with -Licensee's Support request, service request or otherwise. In the event Licensee -does so, then, Licensee hereby grants The Qt Company a sublicensable, -assignable, irrevocable, perpetual, worldwide, non-exclusive, royalty-free and -fully paid-up license, under all of Licensee'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. - -3. LICENSES GRANTED - -3.1 Development with Licensed Software - -Subject to the terms of this Agreement, The Qt Company grants to Licensee a -personal, worldwide, non-exclusive, non-transferable license, valid for the -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 thereto -related support and other related services to end-user Customers. - -Licensee may install copies of the Licensed Software on an unlimited number of -computers provided that (i) only the Designated Users may use the Licensed -Software, and (ii) all Designated Users must have a valid Development License -to use Licensed Software. - -Licensee may at any time designate another Designated User to replace a then- -current Designated User by notifying The Qt Company in writing, provided that -any Designated User may be replaced only once during any six-month period. - -Upon expiry of the initially agreed License Term, the respective License Terms -shall be automatically extended to 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 ninety (90) days before expiry of the respective License Term. -Unless otherwise agreed between the Parties, Renewal Term shall be of equal -length with the initial Term. - -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 pricing applicable at the commencement date of any such Renewal Term. - -3.2 Distribution of Applications - -Subject to the terms of this Agreement, The Qt Company grants to Licensee a -personal, worldwide, non-exclusive, non-transferable, revocable (for cause -pursuant to this Agreement) right and license, valid for the Term, 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 sublicenses to Redistributables, as distributed hereunder, for -Customers solely for Customer's internal use and to the extent necessary in -order for the Customers to use the Applications for their respective intended -purposes. - -Right to distribute the Redistributables as part of an Application as provided -herein is not royalty-bearing but is conditional upon the Licensee having paid -the agreed Development Licenses from The Qt Company before distributing any -Redistributables to Customers. - -3.3 Distribution of Devices - -Subject to the terms of this Agreement, The Qt Company grants to Licensee a -personal, worldwide, non-exclusive, non-transferable, revocable (for cause -pursuant to this Agreement) right and license, valid for the Term, 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 sublicenses to Redistributables, as distributed hereunder, for -Customers solely for Customer's internal use and to the extent necessary in -order for the Customers to use the Devices for their respective intended -purposes. - -Right to distribute the Redistributables with Devices as provided herein is -conditional upon the Licensee having purchased and paid the appropriate amount -of Development and Distribution Licenses from The Qt Company before -distributing any Redistributables to Customers. - -3.4 Further Requirements - -The licenses granted above in this Section 3 by The Qt Company to Licensee are -conditional and subject to Licensee's compliance with the following terms: - -(i) Licensee shall not remove or alter any copyright, trademark or other -proprietary rights notice contained in any portion of the Licensed Software; - -(ii) Applications must add primary and substantial functionality to the -Licensed Software; - -(iii) Applications may not pass on functionality which in any way makes it -possible for others to create software with the Licensed Software; provided -however that Licensee may use the 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); - -(iv) Applications must not compete with the Licensed Software; - -(v) Licensee shall not use The Qt Company's or any of its suppliers' names, -logos, or trademarks to market Applications, except that Licensee may use -"Built with Qt" logo to indicate that Application(s) was developed using the -Licensed Software; - -(vi) Licensee shall not distribute, sublicense or disclose source code of -Licensed Software to any third party (provided however that Licensee may -appoint employee(s) of Contractors as Designated Users to use Licensed -Software pursuant to this Agreement). Such right may be available for the -Licensee subject to a separate software development kit ("SDK") license -agreement to be concluded with The Qt Company; - -(vii) Licensee shall not grant the Customers a right to (i) make copies of the -Redistributables except when and to the extent required to use the Applications -and/or Devices for their intended purpose, (ii) modify the Redistributables or -create derivative works thereof, (iii) decompile, disassemble or otherwise -reverse engineer Redistributables, or (iv) redistribute any copy or portion of -the Redistributables to any third party, except as part of the onward sale of -the Device on which the Redistributables are installed; - -(viii) Licensee shall not and shall cause that its Affiliates or Contractors -shall not a) in any way combine, incorporate or integrate Licensed Software -with, or use Licensed Software for creation of, any software created with or -incorporating Open Source Qt, or b) incorporate or integrate Applications -into a hardware device or product other than a Device, unless Licensee has -received an advance written permission from The Qt Company to do so. Absent -such written permission, any and all distribution by the Licensee during the -Term of a hardware device or product a) which incorporate or integrate any -part of Licensed Software or Open Source Qt; or b) where the main user -interface or substantial functionality is provided by software build with -Licensed Software or Open Source Qt or otherwise depends on the Licensed -Software or Open Source Qt, shall be considered as a Device distribution under -this Agreement and dependent on compliance thereof (including but not limited -to obligation to pay applicable License Fees for such distribution); - -(ix) Licensee shall cause all of its Affiliates and Contractors entitled to -make use of the licenses granted under this Agreement, to be contractually -bound to comply with the relevant terms of this Agreement and not to use the -Licensed Software beyond the terms hereof and for any purposes other than -operating within the scope of their services for Licensee. Licensee shall be -responsible for any and all actions and omissions of its Affiliates and -Contractors relating to the Licensed Software and use thereof (including but -not limited to payment of all applicable License Fees); - -(x) Except when and to the extent explicitly provided in this Section 3, -Licensee shall not transfer, publish, disclose, display or otherwise make -available the Licensed Software; - -; and - -(xi) Licensee shall not attempt or enlist a third party to conduct or attempt -to conduct any of the above. - -Above terms shall not be applicable if and to the extent they conflict with any -mandatory provisions of any applicable laws. - -Any use of Licensed Software beyond the provisions of this Agreement is -strictly prohibited and requires an additional license from The Qt Company. - -4. THIRD PARTY SOFTWARE - -The Licensed Software may provide links to third party libraries or code -(collectively "Third Party Software") to implement various functions. Third -Party Software does not comprise part of the Licensed Software. In some cases, -access to Third Party Software may be included in the Licensed Software. Such -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. Licensee acknowledges that use or -distribution of Third Party Software is in all respects subject to applicable -license terms of applicable third party right holders. - -5. PRE-RELEASE CODE - -The Licensed Software may contain pre-release code and functionality marked or -otherwise stated as "Technology Preview", "Alpha", "Beta" or similar -designation. Such pre-release code may be present in order to provide -experimental support for new platforms or preliminary versions of one or more -new functionalities. The pre-release code may not be at the level of -performance and compatibility of a final, generally available, product -offering of the Licensed Software. The pre-release parts of the Licensed -Software may not operate correctly, may contain errors and may be substantially -modified by The Qt Company prior to the first 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. The -Qt Company assumes no liability whatsoever regarding any pre-release code, but -any use thereof is exclusively at Licensee's own risk and expense. - -6. LIMITED WARRANTY AND WARRANTY DISCLAIMER - -The Qt Company hereby represents and warrants that it has the power and -authority to grant the rights and licenses granted to Licensee under this -Agreement. - -Except as set forth above, the Licensed Software is licensed to Licensee -"as is" and Licensee's exclusive remedy and The Qt Company's entire liability -for errors in the Licensed Software shall be limited, at The Qt Company's -option, to correction of the error, replacement of the Licensed Software or -return of the applicable fees paid for the defective Licensed Software for the -time period during which the License is not able to utilize the Licensed -Software under the terms of this Agreement. - -TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, THE QT COMPANY ON BEHALF OF -ITSELF AND ITS LICENSORS, SUPPLIERS AND AFFILIATES, DISCLAIMS ALL OTHER -WARRANTIES, EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, ANY IMPLIED -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON- -INFRINGEMENT WITH REGARD TO THE LICENSED SOFTWARE. THE QT COMPANY DOES NOT -WARRANT THAT THE LICENSED SOFTWARE WILL SATISFY LICENSEE'S REQUIREMENTS OR THAT -IT WILL OPERATE WITHOUT DEFECT OR ERROR OR THAT THE OPERATION THEREOF WILL BE -UNINTERRUPTED. ALL USE OF AND RELIANCE ON THE LICENSED SOFTWARE IS AT THE SOLE -RISK OF AND RESPONSIBILITY OF LICENSEE. - -7. INDEMNIFICATION AND LIMITATION OF LIABILITY - -7.1 Limitation of Liability - -EXCEPT FOR (I) CASES OF GROSS NEGLIGENCE OR INTENTIONAL MISCONDUCT, AND (II) -BREACH OF CONFIDENTIALITY, AND TO THE EXTENT PERMITTED BY APPLICABLE LAW, IN NO -EVENT SHALL EITHER PARTY BE LIABLE TO THE OTHER PARTY FOR ANY LOSS OF PROFIT, -LOSS OF DATA, LOSS OF BUSINESS OR GOODWILL OR ANY OTHER INDIRECT, SPECIAL, -CONSEQUENTIAL, INCIDENTAL OR PUNITIVE COST, DAMAGES OR EXPENSE OF ANY KIND, -HOWSOEVER ARISING UNDER OR IN CONNECTION WITH THIS AGREEMENT. PARTIES -SPECIFICALLY AGREE THAT LICENSEE'S OBLIGATION TO PAY LICENSE AND OTHER FEES -CORRESPONDING TO ACTUAL USAGE OF LICENSED SOFTWARE HEREUNDER SHALL BE -CONSIDERED AS A DIRECT DAMAGE. - -EXCEPT FOR (I) CASES OF GROSS NEGLIGENCE OR INTENTIONAL MISCONDUCT, AND (II) -BREACH OF CONFIDENTIALITY, AND TO THE EXTENT PERMITTED BY APPLICABLE LAW, IN -NO EVENT SHALL EITHER PARTY'S TOTAL AGGREGATE LIABILITY UNDER THIS AGREEMENT -EXCEED THE AGGREGATE LICENSE FEES PAID OR PAYABLE TO THE QT COMPANY FROM -LICENSEE DURING THE PERIOD OF TWELVE (12) MONTHS IMMEDIATELY PRECEDING THE -EVENT RESULTING IN SUCH LIABILITY. - -THE PROVISIONS OF THIS SECTION 7 ALLOCATE THE RISKS UNDER THIS AGREEMENT -BETWEEN THE QT COMPANY AND LICENSEE AND THE PARTIES HAVE RELIED UPON THE -LIMITATIONS SET FORTH HEREIN IN DETERMINING WHETHER TO ENTER INTO THIS AGREEMENT. - -7.2 Licensee's Indemnification - -Licensee shall indemnify and hold harmless The Qt Company from and against any -claim, injury, judgment, settlement, loss or expense, including attorneys' fees -related to: (a) Licensee's misrepresentation in connection with The Qt Company -or the Licensed Software or breach of this Agreement, (b) the Application or -Device (except where such cause of liability is solely attributable to the -Licensed Software). - -8. SUPPORT, UPDATES AND ONLINE SERVICES - -Upon due payment of the agreed License Fees the Licensee will be eligible to -receive Support and Updates and to use the Online Services during the License -Term, provided, however, that in the event the License Term is longer than 36 -months, Support is provided only for the first 12 months, unless the Parties -specifically otherwise agree. - -Unless otherwise decided by The Company at its free and absolute discretion, -Upgrades will not be included in the Support but may be available subject to -additional fees. - -From time to time The Qt Company may change the Support terms, provided that -during the respective ongoing License Term the level of Support provided by The -Qt Company may not be reduced without the consent of the Licensee. - -Unless otherwise agreed, The Qt Company shall not be responsible for providing -any service or support to Customers. - -9. CONFIDENTIALITY - -Each Party acknowledges that during the Term of this Agreement each Party may -receive information about the other Party's business, business methods, -business plans, customers, business relations, technology, and other -information, including the terms of this Agreement, that is confidential and -of great value to the other Party, and the value of which would be -significantly reduced if disclosed to third parties ("Confidential -Information"). Accordingly, when a Party (the "Receiving Party") receives -Confidential Information from the other Party (the "Disclosing Party"), the -Receiving Party shall only disclose such information to employees and -Contractors on a need to know basis, and shall cause its employees and -employees of its Affiliates to: (i) maintain any and all Confidential -Information in confidence; (ii) not disclose the Confidential Information to a -third party without the Disclosing Party's prior written approval; and (iii) -not, directly or indirectly, use the Confidential Information for any purpose -other than for exercising its rights and fulfilling its responsibilities -pursuant to this Agreement. Each Party shall take reasonable measures to -protect the Confidential Information of the other Party, which measures shall -not be less than the measures taken by such Party to protect its own -confidential and proprietary information. - -Obligation of confidentiality shall not apply to information that (i) is or -becomes generally known to the public through no act or omission of the -Receiving Party; (ii) was in the Receiving Party's lawful possession prior to -the disclosure hereunder and was not subject to limitations on disclosure or -use; (iii) is developed independently by employees or Contractors of the -Receiving Party or other persons working for the Receiving Party who have not -had access to the Confidential Information of the Disclosing Party, as proven -by the written records of the Receiving Party; (iv) is lawfully disclosed to -the Receiving Party without restrictions, by a third party not under an -obligation of confidentiality; or (v) the Receiving Party is legally compelled -to disclose, in which case the Receiving Party shall notify the Disclosing -Party of such compelled disclosure and assert the privileged and confidential -nature of the information and cooperate fully with the Disclosing Party to -limit the scope of disclosure and the dissemination of disclosed Confidential -Information to the minimum extent necessary. - -The obligations under this Section 9 shall continue to remain in force for a -period of five (5) years after the last disclosure, and, with respect to trade -secrets, for so long as such trade secrets are protected under applicable trade -secret laws. - -10. FEES, DELIVERY AND PAYMENT - -10.1 License Fees - -License Fees are described in The Qt Company's standard price list, quote or -Purchase Order confirmation or in an appendix hereto, as the case may be. - -The License Fees shall not be refunded or claimed as a credit in any event or -for any reason whatsoever. - -10.2 Ordering Licenses - -Licensee may purchase Development Licenses and Distribution Licenses pursuant -to agreed pricing terms or, if no specific pricing terms have been agreed upon, -at The Qt Company's standard pricing terms applicable at the time of purchase. - -Licensee shall submit all purchase orders for Development Licenses and -Distribution Licenses to The Qt Company by email or any other method acceptable -to The Qt Company (each such order is referred to herein as a "Purchase Order") -for confirmation, whereupon the Purchase Order shall become binding between the -Parties. - -10.3 Distribution License Packs - -Unless otherwise agreed, Distribution Licenses shall be purchased by way of -Distribution License Packs. - -Upon due payment of the ordered Distribution License Pack(s), the Licensee will -have an account of Distribution Licenses available for installing, bundling or -integrating (all jointly "installing") the Redistributables with the Devices or -for otherwise distributing the Redistributables in accordance with this -Agreement. - -Each time Licensee "installs" or distributes a copy of Redistributables, then -one Distribution License is used, and Licensee's account of available -Distribution Licenses is decreased accordingly. - -Licensee may "install" copies of the Redistributables so long as Licensee has -Distribution Licenses remaining on its account. - -Redistributables will be deemed to have been "installed" into a Device when one -of the following circumstances shall have occurred: a) the Redistributables -have been loaded onto the Device and used outside of the Licensee's premises or -b) the Device has been fully tested and placed into Licensee's inventory -(or sold) for the first time (i.e., Licensee will not be required to use -(or pay for) more than one Distribution License for each individual Device, -e.g. in a situation where a Device is returned to Licensee's inventory after -delivery to a distributor or sale to a Customer). In addition, if Licensee -includes a back-up copy of the Redistributables on a CD-ROM or other storage -medium along with the product, that backup copy of the Redistributables will -not be deemed to have been "installed" and will not require an additional -Distribution License. - -10.4 Payment Terms - -License Fees and any other charges under this Agreement shall be paid by -Licensee no later than thirty (30) days from the date of the applicable invoice -from The Qt Company. - -The Qt Company will submit an invoice to Licensee after the date of this -Agreement and/or after The Qt Company receives a Purchase Order from -Licensee. - -A late payment charge of the lower of (a) one percent per month; or (b) the -interest rate stipulated by applicable law, shall be charged on any unpaid -balances that remain past due. - -The Qt Company shall have the right to suspend, terminate or withhold grants -of all rights to the Licensed Software hereunder, including but not limited to -the Developer License, Distribution License, and Support, should Licensee fail -to make payment in timely fashion. - -10.5 Taxes - -All License Fees and other charges payable hereunder are gross amounts but -exclusive of any value added tax, use tax, sales tax and other taxes, duties or -tariffs ("Taxes"). Such applicable Taxes shall be paid by Licensee, or, where -applicable, in lieu of payment of such Taxes, Licensee shall provide an -exemption certificate to The Qt Company and any applicable authority. - -11 RECORD-KEEPING AND REPORTING OBLIGATIONS; AUDIT RIGHTS - -11.1 Licensee's Record-keeping - -Licensee shall at all times maintain accurate and up-to-date written records of -Licensee's activities related to the use of Licensed Software and distribution -of Redistributables. The records shall be adequate to determine Licensee's -compliance with the provisions of this Agreement and to demonstrate the number -of Designated Users and Redistributables distributed by Licensee. The records -shall conform to good accounting practices reasonably acceptable to The Qt -Company. - -Licensee shall, within thirty (30) days from receiving The Qt Company's request -to that effect, deliver to The Qt Company a report on Licensee's usage of -Licensed Software, such report to copies of Redistributables distributed by -Licensee during that calendar quarter, and also detailing the number of -undistributed copies of Redistributables made by Licensee and remaining in its -account contain information, in sufficient detail, on (i) amount of users -working with Licensed Software, (ii) copies of Redistributables distributed by -Licensee during that calendar quarter, (iii) number of undistributed copies of -Redistributables and corresponding number of unused Distribution Licenses -remaining on Licensee's account, and (iv) any other information as The Qt -Company may reasonably require from time to time. - -11.2. The Qt Company's Audit Rights - -The Qt Company or an independent auditor acting on behalf of The Qt Company's, -may, upon at least five (5) business days' prior written notice and at its -expense, audit Licensee with respect to the use of the Redistributables, but -not more frequently than once during each 6-month period. Such audit may be -conducted by mail, electronic means or through an in-person visit to Licensee's -place of business. Any such in-person audit shall be conducted during regular -business hours at Licensee's facilities and shall not unreasonably interfere -with Licensee's business activities. The Qt Company or the independent auditor -acting on behalf of The Qt Company shall be entitled to inspect Licensee's -Records. All such Licensee's Records and use thereof shall be subject to an -obligation of confidentiality under this Agreement. - -If an audit reveals that Licensee is using the Licensed Software beyond scope -of the licenses Licensee has paid for, Licensee agrees to immediately pay The -Qt Company any amounts owed for such unauthorized use. - -In addition, in the event the audit reveals a material violation of the terms -of this Agreement (underpayment of more than 5% of License Fees shall always be -deemed a material violation for purposes of this section), then the Licensee -shall pay The Qt Company's reasonable cost of conducting such audit. - -12 TERM AND TERMINATION - -12.1 Term - -This Agreement shall enter into force upon due acceptance by both Parties and -remain in force for as long as there is any Development License(s) in force -("Term"), unless and until terminated pursuant to the terms of this Section 12. - -12.2 Termination by The Qt Company - -The Qt Company shall have the right to terminate this Agreement upon thirty -(30) days prior written notice if the Licensee is in material breach of any -obligation of this Agreement and fails to remedy such breach within such notice -period. - -12.3 Mutual Right to Terminate - -Either Party shall have the right to terminate this Agreement immediately upon -written notice in the event that the other Party becomes insolvent, files for -any form of bankruptcy, makes any assignment for the benefit of creditors, has -a receiver, administrative receiver or officer appointed over the whole or a -substantial part of its assets, ceases to conduct business, or an act -equivalent to any of the above occurs under the laws of the jurisdiction of the -other Party. - -12.4 Parties' Rights and Duties upon Termination - -Upon expiry or termination of the Agreement Licensee shall cease and shall -cause all Designated Users (including those of its Affiliates' and -Contractors') to cease using the Licensed Software and distribution of the -Redistributables under this Agreement. - -Notwithstanding the above, in the event the Agreement expires or is terminated: - -(i) as a result of The Qt Company choosing not to renew the Development -License(s) as set forth in Section 3.1, then all valid licenses possessed by -the Licensee at such date shall be extended to be valid in perpetuity under the -terms of this Agreement and Licensee is entitled to purchase additional -licenses as set forth in Section 10.2; or - -(ii) for reason other than by The Qt Company pursuant to item (i) above or -pursuant to Section 12.2, then the Licensee is entitled, for a period of six -(6) months after the effective date of termination, to continue distribution of -Devices under the Distribution Licenses paid but unused at such effective date -of termination. - -Upon any such termination the Licensee shall destroy or return to The Qt -Company all copies of the Licensed Software and all related materials and will -certify the same to The Qt Company upon its request, provided however that -Licensee may retain and exploit such copies of the Licensed Software as it may -reasonably require in providing continued support to Customers. - -Expiry or termination of this Agreement for any reason whatsoever shall not -relieve Licensee of its obligation to pay any License Fees accrued or payable -to The Qt Company prior to the effective date of termination, and Licensee -shall immediately pay to The Qt Company all such fees upon the effective date -of termination. Termination of this Agreement shall not affect any rights of -Customers to continue use of Applications and Devices (and therein incorporated -Redistributables). - -12.5 Extension in case of bankruptcy - -In the event The Qt Company is declared bankrupt under a final, non-cancellable -decision by relevant court of law, and this Agreement is not, at the date of -expiry of the Development License(s) pursuant to Section 3.1, assigned to -party, who has assumed The Qt Company's position as a legitimate licensor of -Licensed Software under this Agreement, then all valid licenses possessed by -the Licensee at such date of expiry, and which the Licensee has not notified -for expiry, shall be extended to be valid in perpetuity under the terms of -this Agreement. - -13. GOVERNING LAW AND LEGAL VENUE - -In the event this Agreement is in the name of The Qt Company Inc., a Delaware -Corporation, then: - -(i) this Agreement shall be construed and interpreted in accordance with the -laws of the State of California, USA, excluding its choice of law provisions; - -(ii) the United Nations Convention on Contracts for the International Sale of -Goods will not apply to this Agreement; and - -(iii) any dispute, claim or controversy arising out of or relating to this -Agreement or the breach, termination, enforcement, interpretation or validity -thereof, including the determination of the scope or applicability of this -Agreement to arbitrate, shall be determined by arbitration in San Francisco, -USA, before one arbitrator. The arbitration shall be administered by JAMS -pursuant to JAMS' Streamlined Arbitration Rules and Procedures. Judgment on the -Award may be entered in any court having jurisdiction. This Section shall not -preclude parties from seeking provisional remedies in aid of arbitration from a -court of appropriate jurisdiction. - -In the event this Agreement is in the name of The Qt Company Ltd., a Finnish -Company, then: - -(i) this Agreement shall be construed and interpreted in accordance with the -laws of Finland, excluding its choice of law provisions; - -(ii) the United Nations Convention on Contracts for the International Sale of -Goods will not apply to this Agreement; and - -(iii) any disputes, controversy or claim arising out of or relating to this -Agreement, or the breach, termination or validity thereof shall be shall be -finally settled by arbitration in accordance with the Arbitration Rules of -Finland Chamber of Commerce. The arbitration tribunal shall consist of one (1), -or if either Party so requires, of three (3), arbitrators. The award shall be -final and binding and enforceable in any court of competent jurisdiction. The -arbitration shall be held in Helsinki, Finland and the process shall be -conducted in the English language. This Section shall not preclude parties from -seeking provisional remedies in aid of arbitration from a court of appropriate -jurisdiction. - -14. GENERAL PROVISIONS - -14.1 No Assignment - -Except in the case of a merger or sale of substantially all of its corporate -assets, Licensee shall not be entitled to assign or transfer all or any of its -rights, benefits and obligations under this Agreement without the prior written -consent of The Qt Company, which shall not be unreasonably withheld or delayed. -The Qt Company shall be entitled to freely assign or transfer any of its -rights, benefits or obligations under this Agreement. - -14.2 No Third Party Representations - -Licensee shall make no representations or warranties concerning the Licensed -Software on behalf of The Qt Company. Any representation or warranty Licensee -makes or purports to make on The Qt Company's behalf shall be void as to The -Qt Company. - -14.3 Surviving Sections - -Any terms and conditions that by their nature or otherwise reasonably should -survive termination of this Agreement shall so be deemed to survive. - -14.4 Entire Agreement - -This Agreement, the exhibits hereto, the License Certificate and any applicable -Purchase Order constitute the complete agreement between the Parties and -supersedes all prior or contemporaneous discussions, representations, and -proposals, written or oral, with respect to the subject matters discussed -herein. - -In the event of any conflict or inconsistency between this Agreement and any -Purchase Order, the terms of this Agreement will prevail over the terms of the -Purchase Order with respect to such conflict or inconsistency. - -Parties specifically acknowledge and agree that this Agreement prevails over -any click-to-accept or similar agreements the Designated Users may need to -accept online upon download of the Licensed Software, as may be required by -The Qt Company's applicable processes relating to Licensed Software. - -14.5 Modifications - -No modification of this Agreement shall be effective unless contained in a -writing executed by an authorized representative of each Party. No term or -condition contained in Licensee's Purchase Order shall apply unless expressly -accepted by The Qt Company in writing. - -14.6 Force Majeure - -Except for the payment obligations hereunder, neither Party shall be liable to -the other for any delay or non-performance of its obligations hereunder in the -event and to the extent that such delay or non-performance is due to an event -of act of God, terrorist attack or other similar unforeseeable catastrophic -event that prevents either Party for fulfilling its obligations under this -Agreement and which such Party cannot avoid or circumvent ("Force Majeure -Event"). If the Force Majeure Event results in a delay or non-performance of a -Party for a period of three (3) months or longer, then either Party shall have -the right to terminate this Agreement with immediate effect without any -liability (except for the obligations of payment arising prior to the event of -Force Majeure) towards the other Party. - -14.7 Notices - -Any notice given by one Party to the other shall be deemed properly given and -deemed received if specifically acknowledged by the receiving Party in writing -or when successfully delivered to the recipient by hand, fax, or special -courier during normal business hours on a business day to the addresses -specified for each Party on the signature page. Each communication and document -made or delivered by one Party to the other Party pursuant to this Agreement -shall be in the English language. - -14.8 Export Control - -Licensee acknowledges that the Redistributables may be subject to export -control restrictions under the applicable laws of respective countries. -Licensee shall fully comply with all applicable export license restrictions -and requirements as well as with all laws and regulations relating to the -Redistributables and exercise of licenses hereunder and shall procure all -necessary governmental authorizations, including without limitation, all -necessary licenses, approvals, permissions or consents, where necessary for the -re-exportation of the Redistributables, Applications and/or Devices. - -14.9 No Implied License - -There are no implied licenses or other implied rights granted under this -Agreement, and all rights, save for those expressly granted hereunder, shall -remain with The Qt Company and its licensors. In addition, no licenses or -immunities are granted to the combination of the Licensed Software with any -other software or hardware not delivered by The Qt Company under this Agreement. - -14.10 Attorney Fees - -The prevailing Party in any action to enforce this Agreement shall be entitled -to recover its attorney's fees and costs in connection with such action. - -14.11 Severability - -If any provision of this Agreement shall be adjudged by any court of competent -jurisdiction to be unenforceable or invalid, that provision shall be limited or -eliminated to the minimum extent necessary so that this Agreement shall -otherwise remain in full force and effect and enforceable. - - -IN WITNESS WHEREOF, the Parties hereto, intending to be legally bound hereby, -have caused this Agreement to be executed by Licensee's authorized -representative installing the Licensed Software and accepting the terms -hereof in connection therewith. - - -Appendix 1 - -1. Parts of the Licensed Software that are permitted for distribution in -object code form only ("Redistributables") under this Agreement: - -- The Licensed Software's Qt Essentials and Qt Add-on libraries -- The Licensed Software's configuration tool ("qtconfig") -- The Licensed Software's help tool ("Qt Assistant") -- The Licensed Software's internationalization tools ("Qt Linguist", "lupdate", - "lrelease") -- The Licensed Software's QML ("Qt Quick") launcher tool ("qmlscene" or - "qmlviewer") -- The Licensed Software's installer framework - -2. Parts of the Licensed Software that are not permitted for distribution -include, but are not limited to: - -- The Licensed Software's source code and header files -- The Licensed Software's documentation -- The Licensed Software's documentation generation tool ("qdoc") -- The Licensed Software's tool for writing makefiles ("qmake") -- The Licensed Software's Meta Object Compiler ("moc") -- The Licensed Software's User Interface Compiler ("uic") -- The Licensed Software's Resource Compiler ("rcc") -- The Licensed Software's parts of the IDE tool ("Qt Creator") -- The Licensed Software's parts of the Design tools ("Qt 3D Studio" or - "Qt Quick Designer") -- The Licensed Software's Emulator diff --git a/configure.pri b/configure.pri index 5f54ea8388..ea3129af26 100644 --- a/configure.pri +++ b/configure.pri @@ -94,7 +94,7 @@ defineReplace(qtConfFunc_licenseCheck) { hasOpenSource = true else: \ hasOpenSource = false - exists($$QT_SOURCE_TREE/LICENSE.QT-LICENSE-AGREEMENT-4.0): \ + exists($$QT_SOURCE_TREE/LICENSE.QT-LICENSE-AGREEMENT): \ hasCommercial = true else: \ hasCommercial = false @@ -224,7 +224,7 @@ defineReplace(qtConfFunc_licenseCheck) { affix = either } } else { - theLicense = $$cat($$QT_SOURCE_TREE/LICENSE.QT-LICENSE-AGREEMENT-4.0, lines) + theLicense = $$cat($$QT_SOURCE_TREE/LICENSE.QT-LICENSE-AGREEMENT, lines) theLicense = $$first(theLicense) showWhat = "Type '?' to view the $${theLicense}." } @@ -251,7 +251,7 @@ defineReplace(qtConfFunc_licenseCheck) { } else: equals(val, n)|equals(val, no) { return(false) } else: equals(commercial, yes):equals(val, ?) { - licenseFile = $$QT_SOURCE_TREE/LICENSE.QT-LICENSE-AGREEMENT-4.0 + licenseFile = $$QT_SOURCE_TREE/LICENSE.QT-LICENSE-AGREEMENT } else: equals(commercial, no):equals(val, l) { licenseFile = $$QT_SOURCE_TREE/LICENSE.LGPL3 } else: equals(commercial, no):equals(val, g):$$gpl2Ok { diff --git a/dist/changes-5.14.0 b/dist/changes-5.14.0 new file mode 100644 index 0000000000..77cbb70928 --- /dev/null +++ b/dist/changes-5.14.0 @@ -0,0 +1,542 @@ +Qt 5.14 introduces many new features and improvements as well as bugfixes +over the 5.13.x series. For more details, refer to the online documentation +included in this distribution. The documentation is also available online: + +https://doc.qt.io/qt-5/index.html + +The Qt version 5.14 series is binary compatible with the 5.13.x series. +Applications compiled for 5.13 will continue to run with 5.14. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + +https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* Important Behavioral Change * +**************************************************************************** + + - [QTBUG-47644] WrapWord now correctly prefers line breaks between words + in Korean text. WrapAnywhere can still be used to get breaks between + syllables instead. + +**************************************************************************** +* Potentially Source-Incompatible Changes * +**************************************************************************** + + - qstringlist.h no longer includes qregexp.h. + - Prefixing Q_NAMESPACE with an export macro may no longer work. Use the + new Q_NAMESPACE_EXPORT macro for that use case. + +**************************************************************************** +* QtCore * +**************************************************************************** + + - Added support of deduction guides for QPair + - Added new Qt::SplitBehavior, for use as eventual replacement for + QString::SplitBehavior. + - Added the new Q_NAMESPACE_EXPORT macro. It can be used just like + Q_NAMESPACE to add meta-object information to a namespace; however it + also supports exporting of such information from shared libraries. + - [QTBUG-15234] Qt installations on the host system can now be relocated, + i.e. moved to other directories. + + - JSON: + * Added overloads of functions taking key strings as QStringView; in + QJsonObject, QJsonValue and QJsonDocument. + + - QAtomicInteger: + * Added loadRelaxed() and storeRelaxed(), to be used as replacements of + load() / store(). + + - QAtomicPointer: + * Added loadRelaxed() and storeRelaxed(), to be used as replacements of + load() / store(). + + - QBasicTimer: + * QBasicTimer is now a move-only class. Copying is now deprecated and + will be removed in Qt 6. + * Added swap() member and free function. + + - QByteArray::operator[]: + * Detach immediately, instead of deferring until modification via + the returned QByteRef. + * Deprecate reliance on its implicit resizing behavior. Support for + writing past the end of QByteArray shall be removed in a future + version of Qt. + + - QCalendar: + * Added QCalendar to support diverse calendars, supported by + implementing QCalendarBackend. + * Added support for Julian and Milankovic calendars. These are enabled + by default, except in bootstrap builds. + * Added support for the Jalali (Persian or Solar Hijri) calendar, + controlled by feature jalalicalendar. + * Added support for the Islamic Civil calendar, controlled by feature + islamiccivilcalendar, with locale data that can be shared with other + implementations, controlled by feature hijricalendar. + + - QChar: + * Added FormFeed (FF) special character. + + - QCollator: + * Added support for QStringView. + * The default QCollator now uses the system's collation locale, rather + than the system locale itself. + + - QDataStream: + * Enumerations can now be serialized through QDataStream without the + need of manually defining streaming operators. + + - QDate: + * [QTBUG-64485] Added startOfDay() and endOfDay() methods to provide a + QDateTime at the start and end of a given date, taking account of any + time skipped by transitions, e.g. a DST spring-forward, which can lead + to a day starting at 01:00 or ending just before 23:00. + * Allow choice of calendar in various operations, with Gregorian + remaining the default. + + - QDateTime: + * Invalid datetimes are now treated as equal and less than all valid + ones. They could previously be found equal to valid datetimes. + + - QDir: + * Remove Windows specific long path markers when handling file paths + with native separators. + + - QEasingCurve: + * QEasingCurve now properly streams all the data needed to QDataStream. + + - QFileInfo: + * [QTBUG-75869] Introduced QFileInfo::isJunction() to detect NTFS Junctions + on Windows. + + - QHash: + * Added range constructor. + + - QJsonObject: + * Added insert(), remove(), and take() overloads taking QLatin1String. + + - QLatin1Char: + * Comparison against char now works even in QT_NO_CAST_FROM_ASCII + builds. + + - QLatin1Literal: + * The undocumented QLatin1Literal type alias for QLatin1String is now + deprecated. Use QLatin1String instead. + + - QLatin1String: + * Added indexOf(). + * Added contains(). + * Added lastIndexOf(). + + - QLineF: + * added QLineF::intersects() as a replacement for QLineF::intersect() + + - QLinkedList: + * Added range constructor. + + - QList: + * Added range constructor. + + - QLocale: + * The system locale now knows what to use for collation, + QLocale::system().collation(). + * The NaN obtained when reading "nan" as a floating-point value is now + quiet rather than signaling. + * The system locale's UI languages list now includes, as for that of an + ordinary locale, the results of adding likely sub-tags from each + locale name, and of removing some, where this doesn't change which + locale is specified. This gives searches for translation files a + better chance of finding a suitable file. + + - QMetaObject: + * [QTBUG-38876] Some internal members of the QMetaObject class have + changed types. Those members are not public API and thus should not + cause source incompatibilities. + + - QMultiHash: + * Added range constructor. + + - QMutex: + * Added QRecursiveMutex as a replacement of QMutex(QMutex::Recursive). + + - QPoint/QPointF: + * Added transposed(). + + - QPointer: + * Added a free swap function. + + - QSet: + * Added range constructor. + + - QSharedPointer: + * Overloads of qSharedPointerObjectCast have been added to work on + std::shared_ptr. + * The swap overload for QSharedPointer in the std namespace has been + removed; a new overload has been added in the Qt namespace. + + - QSize/QSizeF: + * Added grownBy(QMargin(F))/shrunkBy(QMargin(F)). + + - QString: + * The behavior of operator[] to allow implicit resizing of the string + has been deprecated, and will be removed in a future version of Qt. + * QString::operator[] detaches immediately. Previously, the detach was + delayed until a modification was made to the string through the + returned QCharRef. + * QString::arg(QString, ..., QString) can now be called with more than + nine arguments, as well as with QStringViews. + + - QString/QStringRef: + * The split functions now optionally take Qt::SplitBehavior. + + - QStringList: + * Added range constructor. + * Added QStringView overloads of join(), filter(), and + replaceInStrings(). + + - QStringView: + * Added indexOf(). + * Added contains(). + * Added lastIndexOf(). + * Deprecated the (undocumented) QStringViewLiteral macro. Just use u"" + or QStringView(u"") instead. + + - QStringView/QLatin1String: + * Added arg(), taking arbitrarily many strings. + + - QTextStream: + * The NaN obtained when reading "nan" as a floating-point value is now + quiet rather than signaling. + + - QTimeZone: + * [QTBUG-75565] The TZDB back-end now recognizes the contents of /etc/TZ + as a fall-back for $TZ (as used by uClibc). + + - QVarLengthArray: + * Added range constructor. + * Added a qHash overload. + + - QVariant: + * Fixed a bug that caused isNull() to be true after downcasting a + QObject* payload using convert(). + + - QVector: + * Added range constructor. + + - QWeakPointer: + * The data() function has been deprecated. + * A swap overload has been added. + + - QtGlobal: + * Add new macros QT_DEPRECATED_VERSION and QT_DEPRECATED_VERSION_X to + conditionally display deprecation warnings + * Added qExchange(), a drop-in for C++14's std::exchange() + + - Windows: + * QSysInfo::prettyProductName() now returns a version including the + Windows 10 release id or Windows 7 build number respectively, + resembling the version string displayed by the winver tool. + +**************************************************************************** +* QtDBus * +**************************************************************************** + + - QDBusAbstractInterface: + * The call() and asyncCall() methods now accept more than eight QVariant + arguments. + + - QDBusObjectPath: + * Added explicit cast operator to QVariant. + +**************************************************************************** +* QtGui * +**************************************************************************** + + - QColor: + * Added QColorConstants, a namespace containing constexpr QColor + instances. + + - A QColorSpace class has been added, and color spaces are now parsed from + PNG and JPEG images. No automatic color space conversion is done + however, and applications must request it. + - Added support for filtering Vulkan debug messages in QVulkanInstance. + This is especially useful for processing or suppressing messages from + the validation layers. + - Obsolete constructors and accessors in QWheelEvent now have proper + deprecation macros, and are no longer in use in any Qt modules. + What is left is intended to be compatible with planned changes in Qt 6. + + - QFont: + * [QTBUG-77908] Fixed kerning error with certain fonts. + * [QTBUG-76239] Fixed an issue where application fonts would be parsed + multiple times, causing some unnecessary overhead when during + application startup. + * [QTBUG-46322] Resolving a font that just has a family set with + families set will prepend the family to the families so that it is + still the first preference for the font. + + - QImage: + * [QTBUG-42540], [QTBUG-68787] Loading of image files having a file + name suffix for a different image file type has been + fixed. QImageReader will now ask the suffix format handler to + confirm the file contents (canRead()), and fall back to normal + file content recognition on failure. This implies a slight + behavior change in QImageReader::loopCount(), ::imageCount() and + ::nextImageDelay(): For an unreadable file with a recognized + suffix, they would earlier return 0, while they now will + return -1, i.e. error, as per the documentation. + + - QPainter: + * HighQualityAntialiasing and NonCosmeticDefaultPen are marked as + deprecated and don't have an effect anymore + + - QTextDocument: + * [QTBUG-36152] CSS styling of table cell borders (styling <td> and <th> + elements) is now supported during HTML import and export, including + border-color, border-width and border-style. Setting the table's + border-width to a value >= 1 and enabling border-collapse will now draw + a simple, clean table grid (1px) with an outer border of the specified + width and color. A manual test was added, which allows editing HTML + with live preview. + * [QTBUG-43589] Fixed incorrect rounding of widths of variable-width + columns in tables, to avoid border drawing artifacts. + * [QTBUG-78318] QTextFrameFormat margins, padding and borders are now + scaled to device coordinates, and thus correctly sized on high-dpi + displays and printers. + * Markdown (CommonMark or GitHub dialect) is now a supported format for + reading into and writing from QTextDocument, via the setMarkdown() and + toMarkdown() functions. We do not guarantee that every markdown + document can be re-written exactly as it was read; but that does work + in many cases, and it's OK to report bugs about cases that don't work. + + - Touch: + * [QTBUG-77142] When a stationary touchpoint contains some "interesting" + property change (pressure or velocity, so far), it is delivered normally. + +**************************************************************************** +* QtNetwork * +**************************************************************************** + + - QAuthenticator: + * [QTBUG-4117] Add support for SPNEGO/Negotiate + + - QHostInfo: + * Added move contructor. + + - QNetworkAccessManager: + * [QTBUG-69477] Don't fail when FTP does not implement the HELP command. + * Added setAutoDeleteReplies to QNetworkAccessManager to enable the + AutoDeleteReplyOnFinishAttribute attribute for all QNetworkRequests + that are passed to QNetworkAccessManager. + + - QNetworkRequest: + * Added the AutoDeleteReplyOnFinishAttribute attribute to + QNetworkRequest, which makes QNetworkAccessManager delete the + QNetworkReply after it has emitted the "finished" signal. + * Add an ability to configure HTTP/2 protocol + + - QSslKey: + * Key data is cleared as soon as possible when move-assigning. + + - QSslSocket: + * [QTBUG-72016] Added runtime validation of the SSL private key when it + is loaded through a file path. + +**************************************************************************** +* QtSql * +**************************************************************************** + + - QPSQL: + * [QTBUG-79033][QTBUG-79064] added support for PostgreSQL 12 + + - QSqlite: + * Updated to v3.30.1 + + - QSqlite2: + * Marked QSQLITE2 plugin as obsolete - it will be removed with Qt6 + together with the QTDS plugin + +**************************************************************************** +* QtTestLib * +**************************************************************************** + + - Comparison of QImage, QPixmap now checks for the device pixel ratio. + - It is now possible to perform static initialization before QApplication + instantiation by implementing a initMain() function in the test class. + +**************************************************************************** +* QtWidgets * +**************************************************************************** + + - QActionGroup: + * Added new exclusionPolicy property. Set it to ExclusiveOptional to + allow unchecking the active checkable action in an exclusive group. + + - QCalendarWidget: + * Allow choice of calendar, with Gregorian remaining the default. + + - QComboBox: + * Two new signals textHighlighted() and textActivated() were added to + replace highlighted()/activated() QString overloads. + + - QDateTimeEdit: + * Allow choice of calendar, with Gregorian remaining the default. + + - QFileDialog: + * The widgets-based dialog now remembers the selected files when + navigating the history. + + - QFormLayout: + * Honor the vertical expanding state of a widget inside a QFormLayout. + + - QGraphicsWidget: + * Added QMarginsF overloads of setContentsMargins() and + setWindowFrameMargins(). + + - QGroupBox: + * [QTBUG-259389 Always disable children of a checkable, unchecked group + box before showing. + + - QLabel: + * Markdown is now a supported textFormat for QLabel. + + - QLayout: + * Prevent clipping of group box titles on macOS (and similar styles that + draw into layout margins) + + - QLineEdit: + * Behavior change: now the editingFinished signal is emitted only once + after the line edit content was edited. + * The getTextMargins() member function has been deprecated in favor of + textMargins(). + + - QStyle: + * Style sheets now only use the part of the stylesheet font that it + knows about. The remaining will be resolved/inherited from the + context. + + - QTextBrowser: + * Markdown is now a supported format. QTextBrowser::setSource() detects + the common file extensions (.md, .mkd and .markdown). In case it + cannot be detected that way, setSource() now takes an optional + ResourceType enum argument so that the type can be overridden. + QTextBrowser inherits all the QTextEdit features: if readOnly is set + to false, the user can perform the editing operations that QTextEdit + allows. If readOnly is set to true (the default), the user can click + Markdown hyperlinks to emit the anchorClicked() signal, as with HTML. + + - QTextEdit: + * [QTBUG-75931] Added support for copy-pasting foreground brushes with + textures within same document. + * Markdown (CommonMark or GitHub dialect) is now a supported format, + via the markdown property. GitHub dialect is the default, and supports + all features such as hyperlinks, images, tables, lists, checklists, etc. + * If the text was loaded from a Markdown document that contains checkboxes, + the user can click on them to toggle the states. The cursor changes to + PointingHandCursor when the mouse is hovering over a checkbox. + + - QTreeView: + * Don't emit clicked signal after a doubleClicked signal. + + - QWidget: + * The getContentsMargins() member function has been deprecated in favor + of contentsMargins(). + +**************************************************************************** +* Platform Specific Changes * +**************************************************************************** + + - Android + * Fixed an issue where an application installation would be irrecoverably + broken if power loss or a crash occurred during its first initialization + run. + * Make it easy to run Qt tests on Android. "$ make check" is all that's + needed to run a test on an Android device. + * Remove ant support from androiddeployqt + * Introduce "make apk" target, an easy way to create an apk. + * Android depends on NDK r20+ + * Android multi arch build in one go, needed to support the new .aab + packaging format. + * -android-abis configure script parameter useful to compile Qt only for a + selected Android ABIs. + * Instead of bundling QML resources in assets and extracting them on first + start, Qt now creates an .rcc file and register it before invoking the + main function. + * Fixed regression that made it impossible for an application to use the + tap-and-hold gesture. + + - Linux: + * Added a device spec for Raspberry Pi 4 (32-bit, V3D) + * Added a device spec for 64-bit i.MX8 systems (Vivante graphics stack) + + - MinGW: + * [QTBUG-4155] Added a suffix to debug mode pkgconfig files. + + - macOS: + * The drawableSize of Metal layers is no longer updated automatically on + window resize or screen change. Update the size manually in response to + resizeEvent(), or at the start of each frame, as needed. + + - Mir: + * The Mir platform plugin has been removed: use the Wayland plugin when + connecting to a Mir display server. + + - Windows: + * It is now possible to enable RTL mode by passing the option -platform + windows:reverse. + * [QTBUG-74748] Fixed a bug where it would be impossible to + request different faces of a font family after a specific type face + has been in use. + +**************************************************************************** +* Third-Party Code * +**************************************************************************** + - Upgraded bundled Freetype version to 2.10.1. + - Build sqlite without SQLITE_OMIT_LOAD_EXTENSION + - Qt Gui: Added md4c markdown parser to src/3rdparty/md4c (MIT licensed). + - [QTBUG-79418] Updated double-conversion code to upstream version 3.1.5. + - [QTBUG-79420] libjpeg-turbo was updated to version 2.0.3 + - [QTBUG-79418] Updated DNS public suffix list + +**************************************************************************** +* Tools * +**************************************************************************** + + - rcc: + * Added -d option to generate a dependency file. + * Added support for Python as output format. + +**************************************************************************** +* configure * +**************************************************************************** + + - Added the configure option -qtlibinfix-plugins to rename plugins + according to QT_LIBINFIX. This option is off by default. + +**************************************************************************** +* CMake * +**************************************************************************** + + - [QTBUG-38913][QTBUG-76562] Added ability to auto-import non-qml plugins + on CMake builds + +**************************************************************************** +* qmake * +**************************************************************************** + + - Installation targets do not ignore the exit code of QINSTALL and + QINSTALL_PROGRAM anymore. + - Introduced the variables LEX_DIR and YACC_DIR which determine the + location of lex/yacc output. Fixed parallel execution of lex/yacc for + debug_and_release builds. + - The syntax 'LIBS += -frameworkFoo', or 'LIBS += "-framework Foo"' is no + longer supported. Use the canonical 'LIBS += -framework Foo' instead. + - Fixed precompiled headers for the Clang compiler. + + - Android: + * Remove gcc-style PCH directives from the android-clang mkspec. diff --git a/examples/widgets/widgets/styles/main.cpp b/examples/widgets/widgets/styles/main.cpp index d340719984..471589d3ad 100644 --- a/examples/widgets/widgets/styles/main.cpp +++ b/examples/widgets/widgets/styles/main.cpp @@ -50,12 +50,15 @@ #include <QApplication> +#include "norwegianwoodstyle.h" #include "widgetgallery.h" int main(int argc, char *argv[]) { Q_INIT_RESOURCE(styles); + QApplication::setStyle(new NorwegianWoodStyle); + QApplication app(argc, argv); WidgetGallery gallery; gallery.show(); diff --git a/examples/widgets/widgets/styles/norwegianwoodstyle.cpp b/examples/widgets/widgets/styles/norwegianwoodstyle.cpp index 0f614a2e9a..bbdb626a18 100644 --- a/examples/widgets/widgets/styles/norwegianwoodstyle.cpp +++ b/examples/widgets/widgets/styles/norwegianwoodstyle.cpp @@ -58,6 +58,7 @@ NorwegianWoodStyle::NorwegianWoodStyle() : QProxyStyle(QStyleFactory::create("windows")) { + setObjectName("NorwegianWood"); } //! [0] diff --git a/examples/widgets/widgets/styles/widgetgallery.cpp b/examples/widgets/widgets/styles/widgetgallery.cpp index 7e1616c6c0..d70c503f53 100644 --- a/examples/widgets/widgets/styles/widgetgallery.cpp +++ b/examples/widgets/widgets/styles/widgetgallery.cpp @@ -143,6 +143,7 @@ WidgetGallery::WidgetGallery(QWidget *parent) setLayout(mainLayout); setWindowTitle(tr("Styles")); + styleChanged(); } //! [4] @@ -150,12 +151,10 @@ WidgetGallery::WidgetGallery(QWidget *parent) void WidgetGallery::changeStyle(const QString &styleName) //! [5] //! [6] { - if (styleName == "NorwegianWood") { + if (styleName == "NorwegianWood") QApplication::setStyle(new NorwegianWoodStyle); - } else { + else QApplication::setStyle(QStyleFactory::create(styleName)); - } - changePalette(); } //! [6] @@ -170,6 +169,25 @@ void WidgetGallery::changePalette() } //! [8] +void WidgetGallery::changeEvent(QEvent *event) +{ + if (event->type() == QEvent::StyleChange) + styleChanged(); +} + +void WidgetGallery::styleChanged() +{ + auto styleName = QApplication::style()->objectName(); + for (int i = 0; i < styleComboBox->count(); ++i) { + if (QString::compare(styleComboBox->itemText(i), styleName, Qt::CaseInsensitive) == 0) { + styleComboBox->setCurrentIndex(i); + break; + } + } + + changePalette(); +} + //! [9] void WidgetGallery::advanceProgressBar() //! [9] //! [10] diff --git a/examples/widgets/widgets/styles/widgetgallery.h b/examples/widgets/widgets/styles/widgetgallery.h index 9ee65c21c4..4deee6839a 100644 --- a/examples/widgets/widgets/styles/widgetgallery.h +++ b/examples/widgets/widgets/styles/widgetgallery.h @@ -80,8 +80,12 @@ class WidgetGallery : public QDialog public: WidgetGallery(QWidget *parent = nullptr); +protected: + void changeEvent(QEvent *) override; + private slots: void changeStyle(const QString &styleName); + void styleChanged(); void changePalette(); void advanceProgressBar(); diff --git a/mkspecs/features/android/android.prf b/mkspecs/features/android/android.prf index fc0ff553d0..26374cabca 100644 --- a/mkspecs/features/android/android.prf +++ b/mkspecs/features/android/android.prf @@ -36,6 +36,7 @@ build_pass { } } } else: contains(TEMPLATE, "lib"):!static:!QTDIR_build:android_install { + !contains(TARGET, "_$${QT_ARCH}"): TARGET = $${TARGET}_$${QT_ARCH} target.path = /libs/$$ANDROID_TARGET_ARCH/ INSTALLS *= target } diff --git a/mkspecs/features/android/android_deployment_settings.prf b/mkspecs/features/android/android_deployment_settings.prf index e781eb024c..f375a687a9 100644 --- a/mkspecs/features/android/android_deployment_settings.prf +++ b/mkspecs/features/android/android_deployment_settings.prf @@ -63,11 +63,12 @@ contains(TEMPLATE, ".*app"):!build_pass:!android-embedded { QML_ROOT_PATH = $$_PRO_FILE_PWD_ FILE_CONTENT += " \"qml-root-path\": $$emitString($$QML_ROOT_PATH)," FILE_CONTENT += " \"stdcpp-path\": $$emitString($$ANDROID_STDCPP_PATH)," - !isEmpty(RESOURCES) { + !isEmpty(RESOURCES)|!isEmpty(QMLCACHE_RESOURCE_FILES) { # Make sure that qmake generated qrc files are accounted for load(resources_functions) qtFlattenResources() - for(resource, RESOURCES) { + NEWRESOURCES = $$RESOURCES $$QMLCACHE_RESOURCE_FILES + for(resource, NEWRESOURCES) { contains(resource, ".*\\qmake_qmake_immediate.qrc$") { # They will be created for each architecture, since they could be different # we need to account for all of them diff --git a/mkspecs/features/qt_configure.prf b/mkspecs/features/qt_configure.prf index 7ed1f7f03a..6537d98c5d 100644 --- a/mkspecs/features/qt_configure.prf +++ b/mkspecs/features/qt_configure.prf @@ -666,6 +666,7 @@ defineTest(qtConfLibrary_inline) { vars += $$eval(config.commandline.rev_assignments.$${iv}) defined(config.input.$${iv}, var) { eval($${1}.builds.$${b} = $$eval(config.input.$${iv})) + export($${1}.builds.$${b}) $${1}.builds._KEYS_ *= $${b} any = true } else { @@ -680,11 +681,14 @@ defineTest(qtConfLibrary_inline) { export($${1}.builds._KEYS_) # we also reset the generic libs, to avoid surprises. $${1}.libs = + export($${1}.libs) } # direct libs. overwrites inline libs. - defined(config.input.$${input}.libs, var): \ + defined(config.input.$${input}.libs, var) { eval($${1}.libs = $$eval(config.input.$${input}.libs)) + export($${1}.libs) + } includes = $$eval(config.input.$${input}.incdir) @@ -693,6 +697,7 @@ defineTest(qtConfLibrary_inline) { !isEmpty(prefix) { includes += $$prefix/include $${1}.libs = -L$$prefix/lib $$eval($${1}.libs) + export($${1}.libs) } libdir = $$eval(config.input.$${input}.libdir) diff --git a/qmake/doc/src/qmake-manual.qdoc b/qmake/doc/src/qmake-manual.qdoc index ed7fe60fdc..0a8326d94a 100644 --- a/qmake/doc/src/qmake-manual.qdoc +++ b/qmake/doc/src/qmake-manual.qdoc @@ -5407,7 +5407,7 @@ \li The exit code of the test will be ignored during \c{make check}. \endtable - Testcases will often be written with \l{QTest} or \l{TestCase}, but + Test cases will often be written with \l{QTest} or \l[QML]{TestCase}, but that is not a requirement to make use of \c{CONFIG+=testcase} and \c{make check}. The only primary requirement is that the test program exit with a zero exit code on success, and a non-zero exit code on failure. diff --git a/qmake/generators/mac/pbuilder_pbx.cpp b/qmake/generators/mac/pbuilder_pbx.cpp index 24e69444c9..c2f6df7787 100644 --- a/qmake/generators/mac/pbuilder_pbx.cpp +++ b/qmake/generators/mac/pbuilder_pbx.cpp @@ -1629,17 +1629,24 @@ ProjectBuilderMakefileGenerator::writeMakeParts(QTextStream &t) } } - // The symroot is marked by xcodebuild as excluded from Time Machine - // backups, as it's a temporary build dir, so we don't want it to be - // the same as the possibe in-source dir, as that would leave out - // sources from being backed up. - t << "\t\t\t\t" << writeSettings("SYMROOT", - Option::output_dir + Option::dir_sep + ".xcode") << ";\n"; - - // The configuration build dir however is not treated as excluded, - // so we can safely point it to the root output dir. - t << "\t\t\t\t" << writeSettings("CONFIGURATION_BUILD_DIR", - Option::output_dir + Option::dir_sep + "$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)") << ";\n"; + if (Option::output_dir != qmake_getpwd()) { + // The SYMROOT is marked by Xcode as excluded from Time Machine + // backups, as it's a temporary build dir, but that's fine when + // we are shadow building. + t << "\t\t\t\t" << writeSettings("SYMROOT", "$(PROJECT_DIR)") << ";\n"; + } else { + // For in-source builds we don't want to exclude the sources + // from being backed up, so we point SYMROOT to a temporary + // build directory. + t << "\t\t\t\t" << writeSettings("SYMROOT", ".xcode") << ";\n"; + + // Then we set the configuration build dir instead, so that the + // final build artifacts end up in the place Qt Creator expects. + // The disadvantage of using this over SYMROOT is that Xcode will + // fail to archive projects that override this variable. + t << "\t\t\t\t" << writeSettings("CONFIGURATION_BUILD_DIR", + "$(PROJECT_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)") << ";\n"; + } if (!project->isEmpty("DESTDIR")) { ProString dir = project->first("DESTDIR"); diff --git a/src/3rdparty/VulkanMemoryAllocator/qt_attribution.json b/src/3rdparty/VulkanMemoryAllocator/qt_attribution.json index 2548856ca7..0a5df738a8 100644 --- a/src/3rdparty/VulkanMemoryAllocator/qt_attribution.json +++ b/src/3rdparty/VulkanMemoryAllocator/qt_attribution.json @@ -2,7 +2,7 @@ { "Id": "VulkanMemoryAllocator", "Name": "Vulkan Memory Allocator", - "QDocModule": "qtrhi", + "QDocModule": "qtgui", "Description": "Vulkan Memory Allocator", "QtUsage": "Memory management for the Vulkan backend of QRhi.", diff --git a/src/corelib/doc/src/qtcore-index.qdoc b/src/corelib/doc/src/qtcore-index.qdoc index 40a6584af0..29fc25f69d 100644 --- a/src/corelib/doc/src/qtcore-index.qdoc +++ b/src/corelib/doc/src/qtcore-index.qdoc @@ -56,7 +56,7 @@ \include module-use.qdocinc using qt module \quotefile overview/using-qt-core.cmake - See also the \l[QtDoc]{Building with CMake} overview. + See also the \l[QtDoc]{Build with CMake} overview. \section2 Building with qmake diff --git a/src/corelib/doc/src/resource-system.qdoc b/src/corelib/doc/src/resource-system.qdoc index 69ec5e556b..f9ef317799 100644 --- a/src/corelib/doc/src/resource-system.qdoc +++ b/src/corelib/doc/src/resource-system.qdoc @@ -189,13 +189,13 @@ XML file to indicate a file should be most compressed, regardless of which algorithms \c rcc supports. - \li \c{zstd}: use the \l{Zstandard}{https://zstd.net} library to compress + \li \c{zstd}: use the \l{https://zstd.net}{Zstandard} library to compress contents. Valid compression levels range from 1 to 19, 1 is least compression (least CPU time) and 19 is the most compression (most CPU time). The default level is 14. A special value of 0 tells the \c{zstd} library to choose an implementation-defined default. - \li \c{zlib}: use the \l{zlib}{https://zlib.net} library to compress + \li \c{zlib}: use the \l{https://zlib.net}{zlib} library to compress contents. Valid compression levels range from 1 to 9, with 1the least compression (least CPU time) and 9 the most compression (most CPU time). The special value 0 means "no compression" and should not be used. The diff --git a/src/corelib/global/qendian.cpp b/src/corelib/global/qendian.cpp index 7fd6e13d3b..98dc6a9a4b 100644 --- a/src/corelib/global/qendian.cpp +++ b/src/corelib/global/qendian.cpp @@ -137,7 +137,7 @@ QT_BEGIN_NAMESPACE \sa qToLittleEndian() */ /*! - \fn template <typename T> T qFromLittleEndian(const void *src) + \fn template <typename T> inline T qFromLittleEndian(const void *src) \since 4.3 \relates <QtEndian> @@ -159,7 +159,7 @@ QT_BEGIN_NAMESPACE \sa qToLittleEndian() */ /*! - \fn template <typename T> T qFromLittleEndian(T src) + \fn template <typename T> inline T qFromLittleEndian(T src) \since 4.3 \relates <QtEndian> \overload @@ -171,7 +171,7 @@ QT_BEGIN_NAMESPACE unmodified. */ /*! - \fn template <typename T> T qFromLittleEndian(const void *src, qsizetype count, void *dest) + \fn template <typename T> inline T qFromLittleEndian(const void *src, qsizetype count, void *dest) \since 5.12 \relates <QtEndian> diff --git a/src/corelib/global/qglobal.h b/src/corelib/global/qglobal.h index 861f087c60..1bfe2c1615 100644 --- a/src/corelib/global/qglobal.h +++ b/src/corelib/global/qglobal.h @@ -944,6 +944,10 @@ QT_WARNING_POP # define Q_DUMMY_COMPARISON_OPERATOR(C) #endif +QT_WARNING_PUSH +// warning: noexcept-expression evaluates to ‘false’ because of a call to ‘void swap(..., ...)' +QT_WARNING_DISABLE_GCC("-Wnoexcept") + namespace QtPrivate { namespace SwapExceptionTester { // insulate users from the "using std::swap" below @@ -963,6 +967,8 @@ inline void qSwap(T &value1, T &value2) swap(value1, value2); } +QT_WARNING_POP + #if QT_DEPRECATED_SINCE(5, 0) Q_CORE_EXPORT QT_DEPRECATED void *qMalloc(size_t size) Q_ALLOC_SIZE(1); Q_CORE_EXPORT QT_DEPRECATED void qFree(void *ptr); diff --git a/src/corelib/global/qlibraryinfo.cpp b/src/corelib/global/qlibraryinfo.cpp index ecd26233cd..fa2098c757 100644 --- a/src/corelib/global/qlibraryinfo.cpp +++ b/src/corelib/global/qlibraryinfo.cpp @@ -562,9 +562,39 @@ static QString getRelocatablePrefix() HMODULE hModule = getWindowsModuleHandle(); const int kBufferSize = 4096; wchar_t buffer[kBufferSize]; - const int pathSize = GetModuleFileName(hModule, buffer, kBufferSize); - if (pathSize > 0) - prefixPath = prefixFromQtCoreLibraryHelper(QString::fromWCharArray(buffer, pathSize)); + DWORD pathSize = GetModuleFileName(hModule, buffer, kBufferSize); + const QString qtCoreFilePath = QString::fromWCharArray(buffer, int(pathSize)); + const QString qtCoreDirPath = QFileInfo(qtCoreFilePath).absolutePath(); + pathSize = GetModuleFileName(NULL, buffer, kBufferSize); + const QString exeDirPath = QFileInfo(QString::fromWCharArray(buffer, int(pathSize))).absolutePath(); + if (QFileInfo(exeDirPath) == QFileInfo(qtCoreDirPath)) { + // QtCore DLL is next to the executable. This is either a windeployqt'ed executable or an + // executable within the QT_HOST_BIN directory. We're detecting the latter case by checking + // whether there's an import library corresponding to our QtCore DLL in PREFIX/lib. + const QString libdir = QString::fromLatin1( + qt_configure_strs + qt_configure_str_offsets[QLibraryInfo::LibrariesPath - 1]); + const QLatin1Char slash('/'); +#if defined(Q_CC_MINGW) + const QString implibPrefix = QStringLiteral("lib"); + const QString implibSuffix = QStringLiteral(".a"); +#else + const QString implibPrefix; + const QString implibSuffix = QStringLiteral(".lib"); +#endif + const QString qtCoreImpLibFileName = implibPrefix + + QFileInfo(qtCoreFilePath).completeBaseName() + implibSuffix; + const QString qtCoreImpLibPath = qtCoreDirPath + + slash + QLatin1String(QT_CONFIGURE_LIBLOCATION_TO_PREFIX_PATH) + + slash + libdir + + slash + qtCoreImpLibFileName; + if (!QFileInfo::exists(qtCoreImpLibPath)) { + // We did not find a corresponding import library and conclude that this is a + // windeployqt'ed executable. + return exeDirPath; + } + } + if (!qtCoreFilePath.isEmpty()) + prefixPath = prefixFromQtCoreLibraryHelper(qtCoreFilePath); #else #error "The chosen platform / config does not support querying for a dynamic prefix." #endif diff --git a/src/corelib/io/qresource.cpp b/src/corelib/io/qresource.cpp index 3664a63050..bb608d8a72 100644 --- a/src/corelib/io/qresource.cpp +++ b/src/corelib/io/qresource.cpp @@ -280,9 +280,9 @@ static inline QStringList *resourceSearchPaths() RCC tool used to compress the payload. \value NoCompression Contents are not compressed - \value ZlibCompression Contents are compressed using \l{zlib}{https://zlib.net} and can + \value ZlibCompression Contents are compressed using \l{https://zlib.net}{zlib} and can be decompressed using the qUncompress() function. - \value ZstdCompression Contents are compressed using \l{zstd}{https://zstd.net}. To + \value ZstdCompression Contents are compressed using \l{https://zstd.net}{zstd}. To decompress, use the \c{ZSTD_decompress} function from the zstd library. diff --git a/src/corelib/itemmodels/qitemselectionmodel.cpp b/src/corelib/itemmodels/qitemselectionmodel.cpp index f4402c88dc..e4ac5da299 100644 --- a/src/corelib/itemmodels/qitemselectionmodel.cpp +++ b/src/corelib/itemmodels/qitemselectionmodel.cpp @@ -1627,10 +1627,9 @@ bool QItemSelectionModel::rowIntersectsSelection(int row, const QModelIndex &par QItemSelection sel = d->ranges; sel.merge(d->currentSelection, d->currentCommand); - for (int i = 0; i < sel.count(); ++i) { - QItemSelectionRange range = sel.at(i); + for (const QItemSelectionRange &range : qAsConst(sel)) { if (range.parent() != parent) - return false; + return false; int top = range.top(); int bottom = range.bottom(); int left = range.left(); @@ -1661,11 +1660,13 @@ bool QItemSelectionModel::columnIntersectsSelection(int column, const QModelInde QItemSelection sel = d->ranges; sel.merge(d->currentSelection, d->currentCommand); - for (int i = 0; i < sel.count(); ++i) { - int left = sel.at(i).left(); - int right = sel.at(i).right(); - int top = sel.at(i).top(); - int bottom = sel.at(i).bottom(); + for (const QItemSelectionRange &range : qAsConst(sel)) { + if (range.parent() != parent) + return false; + int top = range.top(); + int bottom = range.bottom(); + int left = range.left(); + int right = range.right(); if (left <= column && right >= column) { for (int j = top; j <= bottom; j++) { const Qt::ItemFlags flags = d->model->index(j, column, parent).flags(); diff --git a/src/corelib/thread/qatomic.cpp b/src/corelib/thread/qatomic.cpp index b1a7edad91..5c3ad9412f 100644 --- a/src/corelib/thread/qatomic.cpp +++ b/src/corelib/thread/qatomic.cpp @@ -234,22 +234,26 @@ \sa QAtomicPointer */ -/*! \fn QAtomicInt::QAtomicInt(int value) +/*! + \fn QAtomicInt::QAtomicInt(int value) Constructs a QAtomicInt with the given \a value. */ -/*! \fn QAtomicInteger<T>::QAtomicInteger(T value) +/*! + \fn template <typename T> QAtomicInteger<T>::QAtomicInteger(T value) Constructs a QAtomicInteger with the given \a value. */ -/*! \fn template <typename T> QAtomicInteger<T>::QAtomicInteger(const QAtomicInteger &other) +/*! + \fn template <typename T> QAtomicInteger<T>::QAtomicInteger(const QAtomicInteger &other) Constructs a copy of \a other. */ -/*! \fn template <typename T> QAtomicInteger &QAtomicInteger<T>::operator=(const QAtomicInteger &other) +/*! + \fn template <typename T> QAtomicInteger &QAtomicInteger<T>::operator=(const QAtomicInteger &other) Assigns \a other to this QAtomicInteger and returns a reference to this QAtomicInteger. @@ -344,19 +348,22 @@ \sa storeRelaxed(), storeRelease() */ -/*! \fn template <typename T> bool QAtomicInteger<T>::isReferenceCountingNative() +/*! + \fn template <typename T> bool QAtomicInteger<T>::isReferenceCountingNative() Returns \c true if reference counting is implemented using atomic processor instructions, false otherwise. */ -/*! \fn template <typename T> bool QAtomicInteger<T>::isReferenceCountingWaitFree() +/*! + \fn template <typename T> bool QAtomicInteger<T>::isReferenceCountingWaitFree() Returns \c true if atomic reference counting is wait-free, false otherwise. */ -/*! \fn template <typename T> bool QAtomicInteger<T>::ref() +/*! + \fn template <typename T> bool QAtomicInteger<T>::ref() Atomically increments the value of this QAtomicInteger. Returns \c true if the new value is non-zero, false otherwise. @@ -394,7 +401,8 @@ \sa ref(), operator++(), operator--(int) */ -/*! \fn template <typename T> bool QAtomicInteger<T>::deref() +/*! + \fn template <typename T> bool QAtomicInteger<T>::deref() Atomically decrements the value of this QAtomicInteger. Returns \c true if the new value is non-zero, false otherwise. @@ -432,18 +440,21 @@ \sa deref(), operator--(), operator++(int) */ -/*! \fn template <typename T> bool QAtomicInteger<T>::isTestAndSetNative() +/*! + \fn template <typename T> bool QAtomicInteger<T>::isTestAndSetNative() Returns \c true if test-and-set is implemented using atomic processor instructions, false otherwise. */ -/*! \fn template <typename T> bool QAtomicInteger<T>::isTestAndSetWaitFree() +/*! + \fn template <typename T> bool QAtomicInteger<T>::isTestAndSetWaitFree() Returns \c true if atomic test-and-set is wait-free, false otherwise. */ -/*! \fn template <typename T> bool QAtomicInteger<T>::testAndSetRelaxed(T expectedValue, T newValue) +/*! + \fn template <typename T> bool QAtomicInteger<T>::testAndSetRelaxed(T expectedValue, T newValue) Atomic test-and-set. @@ -457,7 +468,8 @@ processor to freely reorder memory accesses. */ -/*! \fn template <typename T> bool QAtomicInteger<T>::testAndSetAcquire(T expectedValue, T newValue) +/*! + \fn template <typename T> bool QAtomicInteger<T>::testAndSetAcquire(T expectedValue, T newValue) Atomic test-and-set. @@ -472,7 +484,8 @@ be re-ordered before the atomic operation. */ -/*! \fn template <typename T> bool QAtomicInteger<T>::testAndSetRelease(T expectedValue, T newValue) +/*! + \fn template <typename T> bool QAtomicInteger<T>::testAndSetRelease(T expectedValue, T newValue) Atomic test-and-set. @@ -487,7 +500,8 @@ re-ordered after the atomic operation. */ -/*! \fn template <typename T> bool QAtomicInteger<T>::testAndSetOrdered(T expectedValue, T newValue) +/*! + \fn template <typename T> bool QAtomicInteger<T>::testAndSetOrdered(T expectedValue, T newValue) Atomic test-and-set. @@ -502,19 +516,22 @@ may not be re-ordered. */ -/*! \fn template <typename T> bool QAtomicInteger<T>::isFetchAndStoreNative() +/*! + \fn template <typename T> bool QAtomicInteger<T>::isFetchAndStoreNative() Returns \c true if fetch-and-store is implemented using atomic processor instructions, false otherwise. */ -/*! \fn template <typename T> bool QAtomicInteger<T>::isFetchAndStoreWaitFree() +/*! + \fn template <typename T> bool QAtomicInteger<T>::isFetchAndStoreWaitFree() Returns \c true if atomic fetch-and-store is wait-free, false otherwise. */ -/*! \fn template <typename T> T QAtomicInteger<T>::fetchAndStoreRelaxed(T newValue) +/*! + \fn template <typename T> T QAtomicInteger<T>::fetchAndStoreRelaxed(T newValue) Atomic fetch-and-store. @@ -526,7 +543,8 @@ processor to freely reorder memory accesses. */ -/*! \fn template <typename T> T QAtomicInteger<T>::fetchAndStoreAcquire(T newValue) +/*! + \fn template <typename T> T QAtomicInteger<T>::fetchAndStoreAcquire(T newValue) Atomic fetch-and-store. @@ -539,7 +557,8 @@ be re-ordered before the atomic operation. */ -/*! \fn template <typename T> T QAtomicInteger<T>::fetchAndStoreRelease(T newValue) +/*! + \fn template <typename T> T QAtomicInteger<T>::fetchAndStoreRelease(T newValue) Atomic fetch-and-store. @@ -552,7 +571,8 @@ re-ordered after the atomic operation. */ -/*! \fn template <typename T> T QAtomicInteger<T>::fetchAndStoreOrdered(T newValue) +/*! + \fn template <typename T> T QAtomicInteger<T>::fetchAndStoreOrdered(T newValue) Atomic fetch-and-store. @@ -565,19 +585,22 @@ may not be re-ordered. */ -/*! \fn template <typename T> bool QAtomicInteger<T>::isFetchAndAddNative() +/*! + \fn template <typename T> bool QAtomicInteger<T>::isFetchAndAddNative() Returns \c true if fetch-and-add is implemented using atomic processor instructions, false otherwise. */ -/*! \fn template <typename T> bool QAtomicInteger<T>::isFetchAndAddWaitFree() +/*! + \fn template <typename T> bool QAtomicInteger<T>::isFetchAndAddWaitFree() Returns \c true if atomic fetch-and-add is wait-free, false otherwise. */ -/*! \fn template <typename T> T QAtomicInteger<T>::fetchAndAddRelaxed(T valueToAdd) +/*! + \fn template <typename T> T QAtomicInteger<T>::fetchAndAddRelaxed(T valueToAdd) Atomic fetch-and-add. @@ -591,7 +614,8 @@ \sa operator+=(), fetchAndSubRelaxed() */ -/*! \fn template <typename T> T QAtomicInteger<T>::fetchAndAddAcquire(T valueToAdd) +/*! + \fn template <typename T> T QAtomicInteger<T>::fetchAndAddAcquire(T valueToAdd) Atomic fetch-and-add. @@ -606,7 +630,8 @@ \sa operator+=(), fetchAndSubAcquire() */ -/*! \fn template <typename T> T QAtomicInteger<T>::fetchAndAddRelease(T valueToAdd) +/*! + \fn template <typename T> T QAtomicInteger<T>::fetchAndAddRelease(T valueToAdd) Atomic fetch-and-add. @@ -621,7 +646,8 @@ \sa operator+=(), fetchAndSubRelease() */ -/*! \fn template <typename T> T QAtomicInteger<T>::fetchAndAddOrdered(T valueToAdd) +/*! + \fn template <typename T> T QAtomicInteger<T>::fetchAndAddOrdered(T valueToAdd) Atomic fetch-and-add. @@ -636,7 +662,8 @@ \sa operator+=(), fetchAndSubOrdered() */ -/*! \fn template <typename T> T QAtomicInteger<T>::operator+=(T value) +/*! + \fn template <typename T> T QAtomicInteger<T>::operator+=(T value) \since 5.3 Atomic add-and-fetch. @@ -650,7 +677,8 @@ \sa fetchAndAddOrdered(), operator-=() */ -/*! \fn template <typename T> T QAtomicInteger<T>::fetchAndSubRelaxed(T valueToSub) +/*! + \fn template <typename T> T QAtomicInteger<T>::fetchAndSubRelaxed(T valueToSub) \since 5.3 Atomic fetch-and-sub. @@ -665,7 +693,8 @@ \sa operator-=(), fetchAndAddRelaxed() */ -/*! \fn template <typename T> T QAtomicInteger<T>::fetchAndSubAcquire(T valueToSub) +/*! + \fn template <typename T> T QAtomicInteger<T>::fetchAndSubAcquire(T valueToSub) \since 5.3 Atomic fetch-and-sub. @@ -681,7 +710,8 @@ \sa operator-=(), fetchAndAddAcquire() */ -/*! \fn template <typename T> T QAtomicInteger<T>::fetchAndSubRelease(T valueToSub) +/*! + \fn template <typename T> T QAtomicInteger<T>::fetchAndSubRelease(T valueToSub) \since 5.3 Atomic fetch-and-sub. @@ -697,7 +727,8 @@ \sa operator-=(), fetchAndAddRelease() */ -/*! \fn template <typename T> T QAtomicInteger<T>::fetchAndSubOrdered(T valueToSub) +/*! + \fn template <typename T> T QAtomicInteger<T>::fetchAndSubOrdered(T valueToSub) \since 5.3 Atomic fetch-and-sub. @@ -713,7 +744,8 @@ \sa operator-=(), fetchAndAddOrdered() */ -/*! \fn template <typename T> T QAtomicInteger<T>::operator-=(T value) +/*! + \fn template <typename T> T QAtomicInteger<T>::operator-=(T value) \since 5.3 Atomic sub-and-fetch. @@ -727,7 +759,8 @@ \sa fetchAndSubOrdered(), operator+=() */ -/*! \fn template <typename T> T QAtomicInteger<T>::fetchAndOrRelaxed(T valueToOr) +/*! + \fn template <typename T> T QAtomicInteger<T>::fetchAndOrRelaxed(T valueToOr) \since 5.3 Atomic fetch-and-or. @@ -742,7 +775,8 @@ \sa operator|=() */ -/*! \fn template <typename T> T QAtomicInteger<T>::fetchAndOrAcquire(T valueToOr) +/*! + \fn template <typename T> T QAtomicInteger<T>::fetchAndOrAcquire(T valueToOr) \since 5.3 Atomic fetch-and-or. @@ -758,7 +792,8 @@ \sa operator|=() */ -/*! \fn template <typename T> T QAtomicInteger<T>::fetchAndOrRelease(T valueToOr) +/*! + \fn template <typename T> T QAtomicInteger<T>::fetchAndOrRelease(T valueToOr) \since 5.3 Atomic fetch-and-or. @@ -774,7 +809,8 @@ \sa operator|=() */ -/*! \fn template <typename T> T QAtomicInteger<T>::fetchAndOrOrdered(T valueToOr) +/*! + \fn template <typename T> T QAtomicInteger<T>::fetchAndOrOrdered(T valueToOr) \since 5.3 Atomic fetch-and-or. @@ -790,7 +826,8 @@ \sa operator|=() */ -/*! \fn template <typename T> T QAtomicInteger<T>::operator|=(T value) +/*! + \fn template <typename T> T QAtomicInteger<T>::operator|=(T value) \since 5.3 Atomic or-and-fetch. @@ -804,7 +841,8 @@ \sa fetchAndOrOrdered() */ -/*! \fn template <typename T> T QAtomicInteger<T>::fetchAndXorRelaxed(T valueToXor) +/*! + \fn template <typename T> T QAtomicInteger<T>::fetchAndXorRelaxed(T valueToXor) \since 5.3 Atomic fetch-and-xor. @@ -819,7 +857,8 @@ \sa operator^=() */ -/*! \fn template <typename T> T QAtomicInteger<T>::fetchAndXorAcquire(T valueToXor) +/*! + \fn template <typename T> T QAtomicInteger<T>::fetchAndXorAcquire(T valueToXor) \since 5.3 Atomic fetch-and-xor. @@ -835,7 +874,8 @@ \sa operator^=() */ -/*! \fn template <typename T> T QAtomicInteger<T>::fetchAndXorRelease(T valueToXor) +/*! + \fn template <typename T> T QAtomicInteger<T>::fetchAndXorRelease(T valueToXor) \since 5.3 Atomic fetch-and-xor. @@ -851,7 +891,8 @@ \sa operator^=() */ -/*! \fn template <typename T> T QAtomicInteger<T>::fetchAndXorOrdered(T valueToXor) +/*! + \fn template <typename T> T QAtomicInteger<T>::fetchAndXorOrdered(T valueToXor) \since 5.3 Atomic fetch-and-xor. @@ -867,7 +908,8 @@ \sa operator^=() */ -/*! \fn template <typename T> T QAtomicInteger<T>::operator^=(T value) +/*! + \fn template <typename T> T QAtomicInteger<T>::operator^=(T value) \since 5.3 Atomic xor-and-fetch. @@ -881,7 +923,8 @@ \sa fetchAndXorOrdered() */ -/*! \fn template <typename T> T QAtomicInteger<T>::fetchAndAndRelaxed(T valueToAnd) +/*! + \fn template <typename T> T QAtomicInteger<T>::fetchAndAndRelaxed(T valueToAnd) \since 5.3 Atomic fetch-and-and. @@ -896,7 +939,8 @@ \sa operator&=() */ -/*! \fn template <typename T> T QAtomicInteger<T>::fetchAndAndAcquire(T valueToAnd) +/*! + \fn template <typename T> T QAtomicInteger<T>::fetchAndAndAcquire(T valueToAnd) \since 5.3 Atomic fetch-and-and. @@ -912,7 +956,8 @@ \sa operator&=() */ -/*! \fn template <typename T> T QAtomicInteger<T>::fetchAndAndRelease(T valueToAnd) +/*! + \fn template <typename T> T QAtomicInteger<T>::fetchAndAndRelease(T valueToAnd) \since 5.3 Atomic fetch-and-and. @@ -928,7 +973,8 @@ \sa operator&=() */ -/*! \fn template <typename T> T QAtomicInteger<T>::fetchAndAndOrdered(T valueToAnd) +/*! + \fn template <typename T> T QAtomicInteger<T>::fetchAndAndOrdered(T valueToAnd) \since 5.3 Atomic fetch-and-and. @@ -944,7 +990,8 @@ \sa operator&=() */ -/*! \fn template <typename T> T QAtomicInteger<T>::operator&=(T value) +/*! + \fn template <typename T> T QAtomicInteger<T>::operator&=(T value) \since 5.3 Atomic add-and-fetch. @@ -1287,17 +1334,20 @@ \sa QAtomicInteger */ -/*! \fn template <typename T> QAtomicPointer<T>::QAtomicPointer(T *value) +/*! + \fn template <typename T> QAtomicPointer<T>::QAtomicPointer(T *value) Constructs a QAtomicPointer with the given \a value. */ -/*! \fn template <typename T> QAtomicPointer<T>::QAtomicPointer(const QAtomicPointer<T> &other) +/*! + \fn template <typename T> QAtomicPointer<T>::QAtomicPointer(const QAtomicPointer<T> &other) Constructs a copy of \a other. */ -/*! \fn template <typename T> QAtomicPointer &QAtomicPointer<T>::operator=(const QAtomicPointer &other) +/*! + \fn template <typename T> QAtomicPointer &QAtomicPointer<T>::operator=(const QAtomicPointer &other) Assigns \a other to this QAtomicPointer and returns a reference to this QAtomicPointer. @@ -1369,18 +1419,21 @@ \sa storeRelaxed(), loadRelaxed() */ -/*! \fn template <typename T> bool QAtomicPointer<T>::isTestAndSetNative() +/*! + \fn template <typename T> bool QAtomicPointer<T>::isTestAndSetNative() Returns \c true if test-and-set is implemented using atomic processor instructions, false otherwise. */ -/*! \fn template <typename T> bool QAtomicPointer<T>::isTestAndSetWaitFree() +/*! + \fn template <typename T> bool QAtomicPointer<T>::isTestAndSetWaitFree() Returns \c true if atomic test-and-set is wait-free, false otherwise. */ -/*! \fn template <typename T> bool QAtomicPointer<T>::testAndSetRelaxed(T *expectedValue, T *newValue) +/*! + \fn template <typename T> bool QAtomicPointer<T>::testAndSetRelaxed(T *expectedValue, T *newValue) Atomic test-and-set. @@ -1394,7 +1447,8 @@ processor to freely reorder memory accesses. */ -/*! \fn template <typename T> bool QAtomicPointer<T>::testAndSetAcquire(T *expectedValue, T *newValue) +/*! + \fn template <typename T> bool QAtomicPointer<T>::testAndSetAcquire(T *expectedValue, T *newValue) Atomic test-and-set. @@ -1409,7 +1463,8 @@ be re-ordered before the atomic operation. */ -/*! \fn template <typename T> bool QAtomicPointer<T>::testAndSetRelease(T *expectedValue, T *newValue) +/*! + \fn template <typename T> bool QAtomicPointer<T>::testAndSetRelease(T *expectedValue, T *newValue) Atomic test-and-set. @@ -1424,7 +1479,8 @@ re-ordered after the atomic operation. */ -/*! \fn template <typename T> bool QAtomicPointer<T>::testAndSetOrdered(T *expectedValue, T *newValue) +/*! + \fn template <typename T> bool QAtomicPointer<T>::testAndSetOrdered(T *expectedValue, T *newValue) Atomic test-and-set. @@ -1439,19 +1495,22 @@ may not be re-ordered. */ -/*! \fn template <typename T> bool QAtomicPointer<T>::isFetchAndStoreNative() +/*! + \fn template <typename T> bool QAtomicPointer<T>::isFetchAndStoreNative() Returns \c true if fetch-and-store is implemented using atomic processor instructions, false otherwise. */ -/*! \fn template <typename T> bool QAtomicPointer<T>::isFetchAndStoreWaitFree() +/*! + \fn template <typename T> bool QAtomicPointer<T>::isFetchAndStoreWaitFree() Returns \c true if atomic fetch-and-store is wait-free, false otherwise. */ -/*! \fn template <typename T> T *QAtomicPointer<T>::fetchAndStoreRelaxed(T *newValue) +/*! + \fn template <typename T> T *QAtomicPointer<T>::fetchAndStoreRelaxed(T *newValue) Atomic fetch-and-store. @@ -1463,7 +1522,8 @@ processor to freely reorder memory accesses. */ -/*! \fn template <typename T> T *QAtomicPointer<T>::fetchAndStoreAcquire(T *newValue) +/*! + \fn template <typename T> T *QAtomicPointer<T>::fetchAndStoreAcquire(T *newValue) Atomic fetch-and-store. @@ -1476,7 +1536,8 @@ be re-ordered before the atomic operation. */ -/*! \fn template <typename T> T *QAtomicPointer<T>::fetchAndStoreRelease(T *newValue) +/*! + \fn template <typename T> T *QAtomicPointer<T>::fetchAndStoreRelease(T *newValue) Atomic fetch-and-store. @@ -1489,7 +1550,8 @@ re-ordered after the atomic operation. */ -/*! \fn template <typename T> T *QAtomicPointer<T>::fetchAndStoreOrdered(T *newValue) +/*! + \fn template <typename T> T *QAtomicPointer<T>::fetchAndStoreOrdered(T *newValue) Atomic fetch-and-store. @@ -1502,19 +1564,22 @@ may not be re-ordered. */ -/*! \fn template <typename T> bool QAtomicPointer<T>::isFetchAndAddNative() +/*! + \fn template <typename T> bool QAtomicPointer<T>::isFetchAndAddNative() Returns \c true if fetch-and-add is implemented using atomic processor instructions, false otherwise. */ -/*! \fn template <typename T> bool QAtomicPointer<T>::isFetchAndAddWaitFree() +/*! + \fn template <typename T> bool QAtomicPointer<T>::isFetchAndAddWaitFree() Returns \c true if atomic fetch-and-add is wait-free, false otherwise. */ -/*! \fn template <typename T> T *QAtomicPointer<T>::fetchAndAddRelaxed(qptrdiff valueToAdd) +/*! + \fn template <typename T> T *QAtomicPointer<T>::fetchAndAddRelaxed(qptrdiff valueToAdd) Atomic fetch-and-add. @@ -1526,7 +1591,8 @@ processor to freely reorder memory accesses. */ -/*! \fn template <typename T> T *QAtomicPointer<T>::fetchAndAddAcquire(qptrdiff valueToAdd) +/*! + \fn template <typename T> T *QAtomicPointer<T>::fetchAndAddAcquire(qptrdiff valueToAdd) Atomic fetch-and-add. @@ -1539,7 +1605,8 @@ be re-ordered before the atomic operation. */ -/*! \fn template <typename T> T *QAtomicPointer<T>::fetchAndAddRelease(qptrdiff valueToAdd) +/*! + \fn template <typename T> T *QAtomicPointer<T>::fetchAndAddRelease(qptrdiff valueToAdd) Atomic fetch-and-add. @@ -1552,7 +1619,8 @@ re-ordered after the atomic operation. */ -/*! \fn template <typename T> T *QAtomicPointer<T>::fetchAndAddOrdered(qptrdiff valueToAdd) +/*! + \fn template <typename T> T *QAtomicPointer<T>::fetchAndAddOrdered(qptrdiff valueToAdd) Atomic fetch-and-add. diff --git a/src/corelib/thread/qatomic.h b/src/corelib/thread/qatomic.h index a3b9be0729..aa57ddc610 100644 --- a/src/corelib/thread/qatomic.h +++ b/src/corelib/thread/qatomic.h @@ -50,6 +50,10 @@ QT_BEGIN_NAMESPACE QT_WARNING_PUSH QT_WARNING_DISABLE_GCC("-Wextra") +#ifdef Q_CLANG_QDOC +# undef QT_BASIC_ATOMIC_HAS_CONSTRUCTORS +#endif + // High-level atomic integer operations template <typename T> class QAtomicInteger : public QBasicAtomicInteger<T> @@ -194,7 +198,9 @@ public: #ifdef Q_QDOC T *load() const; T *loadAcquire() const; + T *loadRelaxed() const; void store(T *newValue); + void storeRelaxed(T *newValue); void storeRelease(T *newValue); static Q_DECL_CONSTEXPR bool isTestAndSetNative(); diff --git a/src/corelib/time/qcalendar.cpp b/src/corelib/time/qcalendar.cpp index d308aeba2b..6a4623ce92 100644 --- a/src/corelib/time/qcalendar.cpp +++ b/src/corelib/time/qcalendar.cpp @@ -100,7 +100,7 @@ struct Registry { if (id == QCalendar::System::User) { byId.push_back(calendar); } else { - Q_ASSERT(byId.at(size_t(id)) == nullptr); + Q_ASSERT(byId[size_t(id)] == nullptr); byId[size_t(id)] = calendar; } if (id == QCalendar::System::Gregorian) { @@ -618,7 +618,7 @@ const QCalendarBackend *QCalendarBackend::fromEnum(QCalendar::System system) if (calendarRegistry.isDestroyed() || system == QCalendar::System::User) return nullptr; Q_ASSERT(calendarRegistry->byId.size() >= size_t(system)); - if (auto *c = calendarRegistry->byId.at(size_t(system))) + if (auto *c = calendarRegistry->byId[size_t(system)]) return c; switch (system) { case QCalendar::System::Gregorian: diff --git a/src/gui/configure.json b/src/gui/configure.json index 7f4d7cc6af..4de159d97a 100644 --- a/src/gui/configure.json +++ b/src/gui/configure.json @@ -373,6 +373,7 @@ }, "headers": "jpeglib.h", "sources": [ + { "type": "pkgConfig", "args": "libjpeg" }, { "libs": "-llibjpeg", "condition": "config.msvc" }, "-ljpeg" ] diff --git a/src/gui/doc/src/qtgui.qdoc b/src/gui/doc/src/qtgui.qdoc index c4e7d32de1..392b6040cb 100644 --- a/src/gui/doc/src/qtgui.qdoc +++ b/src/gui/doc/src/qtgui.qdoc @@ -62,7 +62,7 @@ \include module-use.qdocinc using qt module \quotefile overview/using-qt-gui.cmake - See also the \l[QtDoc]{Building with CMake} overview. + See also the \l[QtDoc]{Build with CMake} overview. \section2 Building with qmake diff --git a/src/gui/kernel/qwindow.cpp b/src/gui/kernel/qwindow.cpp index 74e0e6401e..c4c7de1b2e 100644 --- a/src/gui/kernel/qwindow.cpp +++ b/src/gui/kernel/qwindow.cpp @@ -1344,7 +1344,7 @@ Qt::WindowStates QWindow::windowStates() const This is a hint to the window manager that this window is a dialog or pop-up on behalf of the transient parent. - In order to cause the window to be centered above its transient parent by + In order to cause the window to be centered above its transient \a parent by default, depending on the window manager, it may also be necessary to call setFlags() with a suitable \l Qt::WindowType (such as \c Qt::Dialog). diff --git a/src/gui/opengl/qopenglextrafunctions.h b/src/gui/opengl/qopenglextrafunctions.h index a68e269065..faac2dce4e 100644 --- a/src/gui/opengl/qopenglextrafunctions.h +++ b/src/gui/opengl/qopenglextrafunctions.h @@ -54,7 +54,7 @@ // GLES build without having included gl32.h -> GLDEBUGPROC is still need for the protos, define it here #if defined(QT_OPENGL_ES_2) && !defined(QT_OPENGL_ES_3_2) -typedef void (QOPENGLF_APIENTRYP *GLDEBUGPROC)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); +typedef void (QOPENGLF_APIENTRY *GLDEBUGPROC)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); #endif QT_BEGIN_NAMESPACE diff --git a/src/network/ssl/qsslsocket.cpp b/src/network/ssl/qsslsocket.cpp index 690251727d..0828a795f1 100644 --- a/src/network/ssl/qsslsocket.cpp +++ b/src/network/ssl/qsslsocket.cpp @@ -1543,7 +1543,7 @@ bool QSslSocket::addDefaultCaCertificates(const QString &path, QSsl::EncodingFor SSL socket's CA certificate database is initialized to the default CA certificate database. - \sa QSslConfiguration::caCertificates(), QSslConfiguration::addCaCertificates() + \sa QSslConfiguration::addCaCertificates() */ void QSslSocket::addDefaultCaCertificate(const QSslCertificate &certificate) { diff --git a/src/plugins/platforms/android/qandroidassetsfileenginehandler.cpp b/src/plugins/platforms/android/qandroidassetsfileenginehandler.cpp index 26e72a480f..fcc08ea00d 100644 --- a/src/plugins/platforms/android/qandroidassetsfileenginehandler.cpp +++ b/src/plugins/platforms/android/qandroidassetsfileenginehandler.cpp @@ -72,9 +72,10 @@ static inline QString prefixedPath(QString path) struct AssetItem { enum class Type { File, - Folder + Folder, + Invalid }; - + AssetItem() = default; AssetItem (const QString &rawName) : name(rawName) { @@ -92,21 +93,47 @@ using AssetItemList = QVector<AssetItem>; class FolderIterator : public AssetItemList { public: - static QSharedPointer<FolderIterator> fromCache(const QString &path) + static QSharedPointer<FolderIterator> fromCache(const QString &path, bool clone) { QMutexLocker lock(&m_assetsCacheMutex); QSharedPointer<FolderIterator> *folder = m_assetsCache.object(path); if (!folder) { folder = new QSharedPointer<FolderIterator>{new FolderIterator{path}}; - if (!m_assetsCache.insert(path, folder)) { + if ((*folder)->empty() || !m_assetsCache.insert(path, folder)) { QSharedPointer<FolderIterator> res = *folder; delete folder; return res; } } - return *folder; + return clone ? QSharedPointer<FolderIterator>{new FolderIterator{*(*folder)}} : *folder; + } + + static AssetItem::Type fileType(const QString &filePath) + { + const QStringList paths = filePath.split(QLatin1Char('/')); + QString fullPath; + AssetItem::Type res = AssetItem::Type::Invalid; + for (const auto &path: paths) { + auto folder = fromCache(fullPath, false); + auto it = std::lower_bound(folder->begin(), folder->end(), AssetItem{path}, [](const AssetItem &val, const AssetItem &assetItem) { + return val.name < assetItem.name; + }); + if (it == folder->end() || it->name != path) + return AssetItem::Type::Invalid; + if (!fullPath.isEmpty()) + fullPath.append(QLatin1Char('/')); + fullPath += path; + res = it->type; + } + return res; } + FolderIterator(const FolderIterator &other) + : AssetItemList(other) + , m_index(-1) + , m_path(other.m_path) + {} + FolderIterator(const QString &path) : m_path(path) { @@ -118,8 +145,12 @@ public: QJNIEnvironmentPrivate env; jobjectArray jFiles = static_cast<jobjectArray>(files.object()); const jint nFiles = env->GetArrayLength(jFiles); - for (int i = 0; i < nFiles; ++i) - push_back({QJNIObjectPrivate(env->GetObjectArrayElement(jFiles, i)).toString()}); + for (int i = 0; i < nFiles; ++i) { + AssetItem item{QJNIObjectPrivate(env->GetObjectArrayElement(jFiles, i)).toString()}; + insert(std::upper_bound(begin(), end(), item, [](const auto &a, const auto &b){ + return a.name < b.name; + }), item); + } } m_path = assetsPrefix + QLatin1Char('/') + m_path + QLatin1Char('/'); m_path.replace(QLatin1String("//"), QLatin1String("/")); @@ -169,7 +200,7 @@ public: const QString &path) : QAbstractFileEngineIterator(filters, nameFilters) { - m_stack.push_back(FolderIterator::fromCache(cleanedAssetPath(path))); + m_stack.push_back(FolderIterator::fromCache(cleanedAssetPath(path), true)); if (m_stack.last()->empty()) m_stack.pop_back(); } @@ -215,7 +246,7 @@ public: if (!res) return {}; if (res->second.type == AssetItem::Type::Folder) { - m_stack.push_back(FolderIterator::fromCache(cleanedAssetPath(currentFilePath()))); + m_stack.push_back(FolderIterator::fromCache(cleanedAssetPath(currentFilePath()), true)); if (m_stack.last()->empty()) m_stack.pop_back(); } @@ -257,6 +288,7 @@ public: m_assetFile = 0; return true; } + m_isFolder = false; return false; } @@ -305,12 +337,12 @@ public: FileFlags fileFlags(FileFlags type = FileInfoAll) const override { - FileFlags flags(ReadOwnerPerm|ReadUserPerm|ReadGroupPerm|ReadOtherPerm|ExistsFlag); + FileFlags commonFlags(ReadOwnerPerm|ReadUserPerm|ReadGroupPerm|ReadOtherPerm|ExistsFlag); + FileFlags flags; if (m_assetFile) - flags |= FileType; + flags = FileType | commonFlags; else if (m_isFolder) - flags |= DirectoryType; - + flags = DirectoryType | commonFlags; return type & flags; } @@ -341,9 +373,20 @@ public: void setFileName(const QString &file) override { + if (m_fileName == cleanedAssetPath(file)) + return; close(); m_fileName = cleanedAssetPath(file); - m_isFolder = !open(QIODevice::ReadOnly) && !FolderIterator::fromCache(m_fileName)->empty(); + switch (FolderIterator::fileType(m_fileName)) { + case AssetItem::Type::File: + open(QIODevice::ReadOnly); + break; + case AssetItem::Type::Folder: + m_isFolder = true; + break; + case AssetItem::Type::Invalid: + break; + } } Iterator *beginEntryList(QDir::Filters filters, const QStringList &filterNames) override @@ -355,9 +398,9 @@ public: private: AAsset *m_assetFile = nullptr; - AAssetManager *m_assetManager; + AAssetManager *m_assetManager = nullptr; QString m_fileName; - bool m_isFolder; + bool m_isFolder = false; }; diff --git a/src/plugins/platforms/cocoa/qcocoascreen.h b/src/plugins/platforms/cocoa/qcocoascreen.h index 7ec9a2b5af..dcf6f1c753 100644 --- a/src/plugins/platforms/cocoa/qcocoascreen.h +++ b/src/plugins/platforms/cocoa/qcocoascreen.h @@ -53,9 +53,6 @@ class QCocoaIntegration; class QCocoaScreen : public QPlatformScreen { public: - static void initializeScreens(); - static void cleanupScreens(); - ~QCocoaScreen(); // ---------------------------------------------------- @@ -79,7 +76,6 @@ public: // ---------------------------------------------------- NSScreen *nativeScreen() const; - void updateProperties(); void requestUpdate(); void deliverUpdateRequests(); @@ -88,6 +84,7 @@ public: static QCocoaScreen *primaryScreen(); static QCocoaScreen *get(NSScreen *nsScreen); static QCocoaScreen *get(CGDirectDisplayID displayId); + static QCocoaScreen *get(CFUUIDRef uuid); static CGPoint mapToNative(const QPointF &pos, QCocoaScreen *screen = QCocoaScreen::primaryScreen()); static CGRect mapToNative(const QRectF &rect, QCocoaScreen *screen = QCocoaScreen::primaryScreen()); @@ -95,11 +92,23 @@ public: static QRectF mapFromNative(CGRect rect, QCocoaScreen *screen = QCocoaScreen::primaryScreen()); private: - QCocoaScreen(CGDirectDisplayID displayId); + static void initializeScreens(); + static void updateScreens(); + static void cleanupScreens(); + + static bool updateScreensIfNeeded(); + static NSArray *s_screenConfigurationBeforeUpdate; + static void add(CGDirectDisplayID displayId); + QCocoaScreen(CGDirectDisplayID displayId); + void update(CGDirectDisplayID displayId); void remove(); + bool isOnline() const; + bool isMirroring() const; + CGDirectDisplayID m_displayId = kCGNullDirectDisplay; + CGDirectDisplayID displayId() const { return m_displayId; } QRect m_geometry; QRect m_availableGeometry; @@ -116,6 +125,8 @@ private: dispatch_source_t m_displayLinkSource = nullptr; QAtomicInt m_pendingUpdates; + friend class QCocoaIntegration; + friend class QCocoaWindow; friend QDebug operator<<(QDebug debug, const QCocoaScreen *screen); }; diff --git a/src/plugins/platforms/cocoa/qcocoascreen.mm b/src/plugins/platforms/cocoa/qcocoascreen.mm index bd5c95b9d0..e4dd4cf6c6 100644 --- a/src/plugins/platforms/cocoa/qcocoascreen.mm +++ b/src/plugins/platforms/cocoa/qcocoascreen.mm @@ -57,6 +57,7 @@ QT_BEGIN_NAMESPACE namespace CoreGraphics { Q_NAMESPACE enum DisplayChange { + ReconfiguredWithFlagsMissing = 0, Moved = kCGDisplayMovedFlag, SetMain = kCGDisplaySetMainFlag, SetMode = kCGDisplaySetModeFlag, @@ -71,73 +72,165 @@ namespace CoreGraphics { Q_ENUM_NS(DisplayChange) } +NSArray *QCocoaScreen::s_screenConfigurationBeforeUpdate = nil; + void QCocoaScreen::initializeScreens() { - uint32_t displayCount = 0; - if (CGGetActiveDisplayList(0, nullptr, &displayCount) != kCGErrorSuccess) - qFatal("Failed to get number of active displays"); - - CGDirectDisplayID activeDisplays[displayCount]; - if (CGGetActiveDisplayList(displayCount, &activeDisplays[0], &displayCount) != kCGErrorSuccess) - qFatal("Failed to get active displays"); - - for (CGDirectDisplayID displayId : activeDisplays) - QCocoaScreen::add(displayId); + updateScreens(); CGDisplayRegisterReconfigurationCallback([](CGDirectDisplayID displayId, CGDisplayChangeSummaryFlags flags, void *userInfo) { - if (flags & kCGDisplayBeginConfigurationFlag) - return; // Wait for changes to apply - Q_UNUSED(userInfo); - qCDebug(lcQpaScreen).verbosity(0).nospace() << "Display reconfiguration" - << " (" << QFlags<CoreGraphics::DisplayChange>(flags) << ")" - << " for displayId=" << displayId; - - QCocoaScreen *cocoaScreen = QCocoaScreen::get(displayId); + // Displays are reconfigured in batches, and we want to update our screens + // once a batch ends, so that all the states of the displays are up to date. + static int displayReconfigurationsInProgress = 0; + + const bool beforeReconfigure = flags & kCGDisplayBeginConfigurationFlag; + qCDebug(lcQpaScreen).verbosity(0).nospace() << "Display " << displayId + << (beforeReconfigure ? " about to reconfigure" : " was ") + << QFlags<CoreGraphics::DisplayChange>(flags) + << " with " << displayReconfigurationsInProgress + << " display configuration(s) in progress"; + + if (!flags) { + // CGDisplayRegisterReconfigurationCallback has been observed to be called + // with flags unset. This seems like a bug. The callback is not paired with + // a matching "completion" callback either, so we don't know whether to treat + // it as a begin or end of reconfigure. + return; + } - if ((flags & kCGDisplayAddFlag) || !cocoaScreen) { - if (!CGDisplayIsActive(displayId)) { - qCDebug(lcQpaScreen) << "Not adding inactive display" << displayId; - return; // Will be added when activated + if (beforeReconfigure) { + if (!displayReconfigurationsInProgress++) { + // There might have been a screen reconfigure before this that + // we didn't process yet, so do that now if that's the case. + updateScreensIfNeeded(); + + Q_ASSERT(!s_screenConfigurationBeforeUpdate); + s_screenConfigurationBeforeUpdate = NSScreen.screens; + qCDebug(lcQpaScreen, "Display reconfigure transaction started" + " with screen configuration %p", s_screenConfigurationBeforeUpdate); + + static void (^tryScreenUpdate)(); + tryScreenUpdate = ^void () { + qCDebug(lcQpaScreen) << "Attempting screen update from runloop block"; + if (!updateScreensIfNeeded()) + CFRunLoopPerformBlock(CFRunLoopGetMain(), kCFRunLoopCommonModes, tryScreenUpdate); + }; + CFRunLoopPerformBlock(CFRunLoopGetMain(), kCFRunLoopCommonModes, tryScreenUpdate); } - QCocoaScreen::add(displayId); - } else if ((flags & kCGDisplayRemoveFlag) || !CGDisplayIsActive(displayId)) { - cocoaScreen->remove(); } else { - // Detect changes to the primary screen immediately, instead of - // waiting for a display reconfigure with kCGDisplaySetMainFlag. - // This ensures that any property updates to the other screens - // will be in reference to the correct primary screen. - QCocoaScreen *mainDisplay = QCocoaScreen::get(CGMainDisplayID()); - if (QGuiApplication::primaryScreen()->handle() != mainDisplay) { - mainDisplay->updateProperties(); - qCInfo(lcQpaScreen) << "Primary screen changed to" << mainDisplay; - QWindowSystemInterface::handlePrimaryScreenChanged(mainDisplay); - if (cocoaScreen == mainDisplay) - return; // Already reconfigured - } + Q_ASSERT_X(displayReconfigurationsInProgress, "QCococaScreen", + "Display configuration transactions are expected to be balanced"); - cocoaScreen->updateProperties(); - qCInfo(lcQpaScreen).nospace() << "Reconfigured " << - (primaryScreen() == cocoaScreen ? "primary " : "") - << cocoaScreen; + if (!--displayReconfigurationsInProgress) { + qCDebug(lcQpaScreen) << "Display reconfigure transaction completed"; + // We optimistically update now, in case the NSScreens have changed + updateScreensIfNeeded(); + } } }, nullptr); + + static QMacNotificationObserver screenParameterObserver(NSApplication.sharedApplication, + NSApplicationDidChangeScreenParametersNotification, [&]() { + qCDebug(lcQpaScreen) << "Received screen parameter change notification"; + updateScreensIfNeeded(); // As a last resort we update screens here + }); +} + +bool QCocoaScreen::updateScreensIfNeeded() +{ + if (!s_screenConfigurationBeforeUpdate) { + qCDebug(lcQpaScreen) << "QScreens have already been updated, all good"; + return true; + } + + if (s_screenConfigurationBeforeUpdate == NSScreen.screens) { + qCDebug(lcQpaScreen) << "Still waiting for NSScreen configuration change"; + return false; + } + + qCDebug(lcQpaScreen, "NSScreen configuration changed to %p", NSScreen.screens); + updateScreens(); + + s_screenConfigurationBeforeUpdate = nil; + return true; +} + +/* + Update the list of available QScreens, and the properties of existing screens. + + At this point we rely on the NSScreen.screens to be up to date. +*/ +void QCocoaScreen::updateScreens() +{ + uint32_t displayCount = 0; + if (CGGetOnlineDisplayList(0, nullptr, &displayCount) != kCGErrorSuccess) + qFatal("Failed to get number of online displays"); + + QVector<CGDirectDisplayID> onlineDisplays(displayCount); + if (CGGetOnlineDisplayList(displayCount, onlineDisplays.data(), &displayCount) != kCGErrorSuccess) + qFatal("Failed to get online displays"); + + qCInfo(lcQpaScreen) << "Updating screens with" << displayCount + << "online displays:" << onlineDisplays; + + // TODO: Verify whether we can always assume the main display is first + int mainDisplayIndex = onlineDisplays.indexOf(CGMainDisplayID()); + if (mainDisplayIndex < 0) { + qCWarning(lcQpaScreen) << "Main display not in list of online displays!"; + } else if (mainDisplayIndex > 0) { + qCWarning(lcQpaScreen) << "Main display not first display, making sure it is"; + onlineDisplays.move(mainDisplayIndex, 0); + } + + for (CGDirectDisplayID displayId : onlineDisplays) { + Q_ASSERT(CGDisplayIsOnline(displayId)); + + if (CGDisplayMirrorsDisplay(displayId)) + continue; + + // A single physical screen can map to multiple displays IDs, + // depending on which GPU is in use or which physical port the + // screen is connected to. By mapping the display ID to a UUID, + // which are shared between displays that target the same screen, + // we can pick an existing QScreen to update instead of needlessly + // adding and removing QScreens. + QCFType<CFUUIDRef> uuid = CGDisplayCreateUUIDFromDisplayID(displayId); + Q_ASSERT(uuid); + + if (QCocoaScreen *existingScreen = QCocoaScreen::get(uuid)) { + existingScreen->update(displayId); + qCInfo(lcQpaScreen) << "Updated" << existingScreen; + if (CGDisplayIsMain(displayId) && existingScreen != qGuiApp->primaryScreen()->handle()) { + qCInfo(lcQpaScreen) << "Primary screen changed to" << existingScreen; + QWindowSystemInterface::handlePrimaryScreenChanged(existingScreen); + } + } else { + QCocoaScreen::add(displayId); + } + } + + for (QScreen *screen : QGuiApplication::screens()) { + QCocoaScreen *platformScreen = static_cast<QCocoaScreen*>(screen->handle()); + if (!platformScreen->isOnline() || platformScreen->isMirroring()) + platformScreen->remove(); + } } void QCocoaScreen::add(CGDirectDisplayID displayId) { const bool isPrimary = CGDisplayIsMain(displayId); QCocoaScreen *cocoaScreen = new QCocoaScreen(displayId); - qCInfo(lcQpaScreen).nospace() << "Adding " << (isPrimary ? "new primary " : "") << cocoaScreen; + qCInfo(lcQpaScreen) << "Adding" << cocoaScreen + << (isPrimary ? "as new primary screen" : ""); QWindowSystemInterface::handleScreenAdded(cocoaScreen, isPrimary); } QCocoaScreen::QCocoaScreen(CGDirectDisplayID displayId) : QPlatformScreen(), m_displayId(displayId) { - updateProperties(); + update(m_displayId); m_cursor = new QCocoaCursor; } @@ -150,8 +243,6 @@ void QCocoaScreen::cleanupScreens() void QCocoaScreen::remove() { - m_displayId = kCGNullDirectDisplay; // Prevent stale references during removal - // This may result in the application responding to QGuiApplication::screenRemoved // by moving the window to another screen, either by setGeometry, or by setScreen. // If the window isn't moved by the application, Qt will as a fallback move it to @@ -163,7 +254,7 @@ void QCocoaScreen::remove() // QCocoaWindow::windowDidChangeScreen. At that point the window will appear to have // already changed its screen, but that's only true if comparing the Qt screens, // not when comparing the NSScreens. - qCInfo(lcQpaScreen).nospace() << "Removing " << (primaryScreen() == this ? "current primary " : "") << this; + qCInfo(lcQpaScreen) << "Removing " << this; QWindowSystemInterface::handleScreenRemoved(this); } @@ -210,9 +301,14 @@ static QString displayName(CGDirectDisplayID displayID) return QString(); } -void QCocoaScreen::updateProperties() +void QCocoaScreen::update(CGDirectDisplayID displayId) { - Q_ASSERT(m_displayId); + if (displayId != m_displayId) { + qCDebug(lcQpaScreen) << "Reconnecting" << this << "as display" << displayId; + m_displayId = displayId; + } + + Q_ASSERT(isOnline()); const QRect previousGeometry = m_geometry; const QRect previousAvailableGeometry = m_availableGeometry; @@ -350,8 +446,8 @@ struct DeferredDebugHelper void QCocoaScreen::deliverUpdateRequests() { - if (!m_displayId) - return; // Screen removed + if (!isOnline()) + return; QMacAutoReleasePool pool; @@ -562,6 +658,29 @@ QPixmap QCocoaScreen::grabWindow(WId view, int x, int y, int width, int height) return windowPixmap; } +bool QCocoaScreen::isOnline() const +{ + // When a display is disconnected CGDisplayIsOnline and other CGDisplay + // functions that take a displayId will not return false, but will start + // returning -1 to signal that the displayId is invalid. Some functions + // will also assert or even crash in this case, so it's important that + // we double check if a display is online before calling other functions. + auto isOnline = CGDisplayIsOnline(m_displayId); + static const uint32_t kCGDisplayIsDisconnected = int32_t(-1); + return isOnline != kCGDisplayIsDisconnected && isOnline; +} + +/* + Returns true if a screen is mirroring another screen +*/ +bool QCocoaScreen::isMirroring() const +{ + if (!isOnline()) + return false; + + return CGDisplayMirrorsDisplay(m_displayId); +} + /*! The screen used as a reference for global window geometry */ @@ -586,6 +705,12 @@ QList<QPlatformScreen*> QCocoaScreen::virtualSiblings() const QCocoaScreen *QCocoaScreen::get(NSScreen *nsScreen) { + if (s_screenConfigurationBeforeUpdate) { + qCWarning(lcQpaScreen) << "Trying to resolve screen while waiting for screen reconfigure!"; + if (!updateScreensIfNeeded()) + qCWarning(lcQpaScreen) << "Failed to do last minute screen update. Expect crashes."; + } + return get(nsScreen.qt_displayId); } @@ -600,23 +725,34 @@ QCocoaScreen *QCocoaScreen::get(CGDirectDisplayID displayId) return nullptr; } +QCocoaScreen *QCocoaScreen::get(CFUUIDRef uuid) +{ + for (QScreen *screen : QGuiApplication::screens()) { + auto *platformScreen = static_cast<QCocoaScreen*>(screen->handle()); + if (!platformScreen->isOnline()) + continue; + + auto displayId = platformScreen->displayId(); + QCFType<CFUUIDRef> candidateUuid(CGDisplayCreateUUIDFromDisplayID(displayId)); + Q_ASSERT(candidateUuid); + + if (candidateUuid == uuid) + return platformScreen; + } + + return nullptr; +} + NSScreen *QCocoaScreen::nativeScreen() const { if (!m_displayId) return nil; // The display has been disconnected - // A single display may have different displayIds depending on - // which GPU is in use or which physical port the display is - // connected to. By comparing UUIDs instead of display IDs we - // ensure that we always pick up the appropriate NSScreen. - QCFType<CFUUIDRef> uuid = CGDisplayCreateUUIDFromDisplayID(m_displayId); - - for (NSScreen *screen in [NSScreen screens]) { - if (QCFType<CFUUIDRef>(CGDisplayCreateUUIDFromDisplayID(screen.qt_displayId)) == uuid) + for (NSScreen *screen in NSScreen.screens) { + if (screen.qt_displayId == m_displayId) return screen; } - qCWarning(lcQpaScreen) << "Could not find NSScreen for display ID" << m_displayId; return nil; } @@ -651,11 +787,21 @@ QDebug operator<<(QDebug debug, const QCocoaScreen *screen) debug.nospace(); debug << "QCocoaScreen(" << (const void *)screen; if (screen) { - debug << ", geometry=" << screen->geometry(); + debug << ", " << screen->name(); + if (screen->isOnline()) { + if (CGDisplayIsAsleep(screen->displayId())) + debug << ", Sleeping"; + if (auto mirroring = CGDisplayMirrorsDisplay(screen->displayId())) + debug << ", mirroring=" << mirroring; + } else { + debug << ", Offline"; + } + debug << ", " << screen->geometry(); debug << ", dpr=" << screen->devicePixelRatio(); - debug << ", name=" << screen->name(); - debug << ", displayId=" << screen->m_displayId; - debug << ", native=" << screen->nativeScreen(); + debug << ", displayId=" << screen->displayId(); + + if (auto nativeScreen = screen->nativeScreen()) + debug << ", " << nativeScreen; } debug << ')'; return debug; diff --git a/src/sql/doc/src/sql-driver.qdoc b/src/sql/doc/src/sql-driver.qdoc index 9c26c4089c..3a0fcfa1e7 100644 --- a/src/sql/doc/src/sql-driver.qdoc +++ b/src/sql/doc/src/sql-driver.qdoc @@ -171,7 +171,8 @@ \section3 How to Build the QMYSQL Plugin on Windows You need to get the MySQL installation files (e.g. - \e{mysql-installer-web-community-8.0.18.0.msi}). Run the installer, + \l {https://dev.mysql.com/downloads/installer/}{mysql-installer-web-community-8.0.18.0.msi}). + Run the installer, select custom installation and install the MySQL C Connector which matches your Qt installation (x86 or x64). After installation make sure that the needed files are there: @@ -192,9 +193,9 @@ When you distribute your application, remember to include libmysql.dll in your installation package. It must be placed in the same folder - as the application executable. libmysql.dll additionally needs the + as the application executable. \e libmysql.dll additionally needs the MSVC runtime libraries which can be installed with vcredist.exe - (\l {https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads}(vcredist.exe) + (\l {https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads}{vcredist.exe} \target QOCI \section2 QOCI for the Oracle Call Interface (OCI) @@ -356,10 +357,6 @@ Windows NT based systems, this is the default. Note that the ODBC driver and the DBMS must also support Unicode. - Some driver managers and drivers do not support UNICODE. To use the - QODBC plugin with such drivers, it has to be compiled with - Q_ODBC_VERSION_2 defined. - For the Oracle 9 ODBC driver (Windows), it is necessary to check "SQL_WCHAR support" in the ODBC driver manager otherwise Oracle will convert all Unicode strings to local 8-bit. diff --git a/src/testlib/doc/src/qttest-best-practices.qdoc b/src/testlib/doc/src/qttest-best-practices.qdoc index c7fee93c80..8ad67acce6 100644 --- a/src/testlib/doc/src/qttest-best-practices.qdoc +++ b/src/testlib/doc/src/qttest-best-practices.qdoc @@ -278,8 +278,8 @@ \section2 Avoid Fixed Timeouts Avoid using hard-coded timeouts, such as QTest::qWait() to wait for some - conditions to become true. Consider using the \l QtSignalSpy class, - the \l QTRY_VERIFY() or \l QTRY_COMPARE() macros, or the \c QtSignalSpy + conditions to become true. Consider using the \l QSignalSpy class, + the \l QTRY_VERIFY() or \l QTRY_COMPARE() macros, or the \c QSignalSpy class in conjunction with the \c QTRY_ macro variants. The \c qWait() function can be used to set a delay for a fixed period diff --git a/src/widgets/kernel/qapplication.cpp b/src/widgets/kernel/qapplication.cpp index 57771b3e12..3577414713 100644 --- a/src/widgets/kernel/qapplication.cpp +++ b/src/widgets/kernel/qapplication.cpp @@ -142,16 +142,19 @@ QApplicationPrivate *QApplicationPrivate::self = nullptr; static void initSystemPalette() { - if (!QApplicationPrivate::sys_pal) { - QPalette defaultPlatte; - if (QApplicationPrivate::app_style) - defaultPlatte = QApplicationPrivate::app_style->standardPalette(); - if (const QPalette *themePalette = QGuiApplicationPrivate::platformTheme()->palette()) { - QApplicationPrivate::setSystemPalette(themePalette->resolve(defaultPlatte)); - QApplicationPrivate::initializeWidgetPaletteHash(); - } else { - QApplicationPrivate::setSystemPalette(defaultPlatte); - } + if (QApplicationPrivate::sys_pal) + return; // Already initialized + + QPalette defaultPalette; + if (QApplicationPrivate::app_style) + defaultPalette = QApplicationPrivate::app_style->standardPalette(); + + auto *platformTheme = QGuiApplicationPrivate::platformTheme(); + if (const QPalette *themePalette = platformTheme ? platformTheme->palette() : nullptr) { + QApplicationPrivate::setSystemPalette(themePalette->resolve(defaultPalette)); + QApplicationPrivate::initializeWidgetPaletteHash(); + } else { + QApplicationPrivate::setSystemPalette(defaultPalette); } } @@ -379,7 +382,6 @@ QString QApplicationPrivate::styleSheet; // default application styles QPointer<QWidget> QApplicationPrivate::leaveAfterRelease = nullptr; QPalette *QApplicationPrivate::sys_pal = nullptr; // default system palette -QPalette *QApplicationPrivate::set_pal = nullptr; // default palette set by programmer QFont *QApplicationPrivate::sys_font = nullptr; // default system font QFont *QApplicationPrivate::set_font = nullptr; // default font set by programmer @@ -431,13 +433,6 @@ void QApplicationPrivate::process_cmdline() if (styleOverride.isEmpty() && qEnvironmentVariableIsSet("QT_STYLE_OVERRIDE")) styleOverride = QString::fromLocal8Bit(qgetenv("QT_STYLE_OVERRIDE")); - if (!styleOverride.isEmpty()) { - if (app_style) { - delete app_style; - app_style = nullptr; - } - } - // process platform-indep command line if (!qt_is_gui_used || !argc) return; @@ -552,6 +547,12 @@ void QApplicationPrivate::init() // Must be called before initialize() QColormap::initialize(); + if (sys_pal) { + // Now that we have a platform theme we need to reset + // the system palette to pick up the theme colors. + clearSystemPalette(); + initSystemPalette(); + } qt_init_tooltip_palette(); QApplicationPrivate::initializeWidgetFontHash(); @@ -597,8 +598,20 @@ void QApplicationPrivate::initialize() // needed for widgets in QML QAbstractDeclarativeData::setWidgetParent = QWidgetPrivate::setWidgetParentHelper; - if (application_type != QApplicationPrivate::Tty) - (void) QApplication::style(); // trigger creation of application style + if (application_type != QApplicationPrivate::Tty) { + if (!styleOverride.isEmpty()) { + if (auto *style = QStyleFactory::create(styleOverride.toLower())) { + QApplication::setStyle(style); + } else { + qWarning("QApplication: invalid style override '%s' passed, ignoring it.\n" + "\tAvailable styles: %s", qPrintable(styleOverride), + qPrintable(QStyleFactory::keys().join(QLatin1String(", ")))); + } + } + + // Trigger default style if none was set already + Q_UNUSED(QApplication::style()); + } #if QT_CONFIG(statemachine) // trigger registering of QStateMachine's GUI types qRegisterGuiStateMachine(); @@ -789,8 +802,6 @@ QApplication::~QApplication() delete QApplicationPrivate::app_pal; QApplicationPrivate::app_pal = nullptr; clearSystemPalette(); - delete QApplicationPrivate::set_pal; - QApplicationPrivate::set_pal = nullptr; app_palettes()->clear(); delete QApplicationPrivate::sys_font; @@ -1016,55 +1027,45 @@ void QApplication::setStyleSheet(const QString& styleSheet) */ QStyle *QApplication::style() { - if (QApplicationPrivate::app_style) - return QApplicationPrivate::app_style; - if (!qobject_cast<QApplication *>(QCoreApplication::instance())) { - Q_ASSERT(!"No style available without QApplication!"); - return nullptr; - } - if (!QApplicationPrivate::app_style) { - // Compile-time search for default style - // - QStyle *&app_style = QApplicationPrivate::app_style; - - if (!QApplicationPrivate::styleOverride.isEmpty()) { - const QString style = QApplicationPrivate::styleOverride.toLower(); - app_style = QStyleFactory::create(style); - if (Q_UNLIKELY(!app_style)) { - qWarning("QApplication: invalid style override passed, ignoring it.\n" - " Available styles: %s", qPrintable(QStyleFactory::keys().join(QLatin1String(", ")))); - } + // Create default style + if (!qobject_cast<QApplication *>(QCoreApplication::instance())) { + Q_ASSERT(!"No style available without QApplication!"); + return nullptr; } - if (!app_style) - app_style = QStyleFactory::create(QApplicationPrivate::desktopStyleKey()); - if (!app_style) { + auto &defaultStyle = QApplicationPrivate::app_style; + + defaultStyle = QStyleFactory::create(QApplicationPrivate::desktopStyleKey()); + if (!defaultStyle) { const QStringList styles = QStyleFactory::keys(); for (const auto &style : styles) { - if ((app_style = QStyleFactory::create(style))) + if ((defaultStyle = QStyleFactory::create(style))) break; } } - if (!app_style) { + if (!defaultStyle) { Q_ASSERT(!"No styles available!"); return nullptr; } - } - // take ownership of the style - QApplicationPrivate::app_style->setParent(qApp); - initSystemPalette(); + // Take ownership of the style + defaultStyle->setParent(qApp); + + initSystemPalette(); - if (QApplicationPrivate::set_pal) // repolish set palette with the new style - QApplication::setPalette(*QApplicationPrivate::set_pal); + if (testAttribute(Qt::AA_SetPalette)) + defaultStyle->polish(*QGuiApplicationPrivate::app_pal); #ifndef QT_NO_STYLE_STYLESHEET - if (!QApplicationPrivate::styleSheet.isEmpty()) { - qApp->setStyleSheet(QApplicationPrivate::styleSheet); - } else + if (!QApplicationPrivate::styleSheet.isEmpty()) { + qApp->setStyleSheet(QApplicationPrivate::styleSheet); + } else #endif - QApplicationPrivate::app_style->polish(qApp); + { + defaultStyle->polish(qApp); + } + } return QApplicationPrivate::app_style; } @@ -1128,17 +1129,21 @@ void QApplication::setStyle(QStyle *style) // take care of possible palette requirements of certain gui // styles. Do it before polishing the application since the style // might call QApplication::setPalette() itself - if (QApplicationPrivate::set_pal) { - QApplication::setPalette(*QApplicationPrivate::set_pal); - } else if (QApplicationPrivate::sys_pal) { - clearSystemPalette(); + if (testAttribute(Qt::AA_SetPalette)) { + QApplicationPrivate::app_style->polish(*QGuiApplicationPrivate::app_pal); + } else { + if (QApplicationPrivate::sys_pal) + clearSystemPalette(); initSystemPalette(); - QApplicationPrivate::initializeWidgetFontHash(); - } else if (!QApplicationPrivate::sys_pal) { - // Initialize the sys_pal if it hasn't happened yet... - QApplicationPrivate::setSystemPalette(QApplicationPrivate::app_style->standardPalette()); } + // The default widget font hash is based on the platform theme, + // not the style, but the widget fonts could in theory have been + // affected by polish of the previous style, without a proper + // cleanup in unpolish, so reset it now before polishing the + // new style. + QApplicationPrivate::initializeWidgetFontHash(); + // initialize the application with the new style QApplicationPrivate::app_style->polish(qApp); @@ -1389,11 +1394,8 @@ void QApplicationPrivate::setPalette_helper(const QPalette &palette, const char* // Send ApplicationPaletteChange to qApp itself, and to the widgets. qApp->d_func()->sendApplicationPaletteChange(all, className); } + if (!className && (!QApplicationPrivate::sys_pal || !palette.isCopyOf(*QApplicationPrivate::sys_pal))) { - if (!QApplicationPrivate::set_pal) - QApplicationPrivate::set_pal = new QPalette(palette); - else - *QApplicationPrivate::set_pal = palette; QCoreApplication::setAttribute(Qt::AA_SetPalette); emit qGuiApp->paletteChanged(*QGuiApplicationPrivate::app_pal); } @@ -1436,7 +1438,7 @@ void QApplicationPrivate::setSystemPalette(const QPalette &pal) else *sys_pal = pal; - if (!QApplicationPrivate::set_pal) + if (!testAttribute(Qt::AA_SetPalette)) QApplication::setPalette(*sys_pal); } diff --git a/src/widgets/kernel/qapplication_p.h b/src/widgets/kernel/qapplication_p.h index 3167bd423f..79d06ed98c 100644 --- a/src/widgets/kernel/qapplication_p.h +++ b/src/widgets/kernel/qapplication_p.h @@ -162,7 +162,6 @@ public: static QWidgetList *popupWidgets; static QStyle *app_style; static QPalette *sys_pal; - static QPalette *set_pal; protected: void notifyThemeChanged() override; diff --git a/src/widgets/styles/qstyleoption.cpp b/src/widgets/styles/qstyleoption.cpp index 1af839c841..5292d971ea 100644 --- a/src/widgets/styles/qstyleoption.cpp +++ b/src/widgets/styles/qstyleoption.cpp @@ -1453,7 +1453,7 @@ QStyleOptionTab::QStyleOptionTab(int version) \value None A normal tab button. \value HasFrame The tab button is positioned on a tab frame - \sa features + \sa QStyleOptionToolBar::features */ /*! diff --git a/tests/auto/corelib/itemmodels/qitemselectionmodel/tst_qitemselectionmodel.cpp b/tests/auto/corelib/itemmodels/qitemselectionmodel/tst_qitemselectionmodel.cpp index ccb6a457a6..6b59a6f1af 100644 --- a/tests/auto/corelib/itemmodels/qitemselectionmodel/tst_qitemselectionmodel.cpp +++ b/tests/auto/corelib/itemmodels/qitemselectionmodel/tst_qitemselectionmodel.cpp @@ -2037,12 +2037,16 @@ void tst_QItemSelectionModel::rowIntersectsSelection3() QModelIndex parent; QVERIFY(!selectionModel.rowIntersectsSelection(0, parent)); + QVERIFY(!selectionModel.columnIntersectsSelection(0, parent)); parent = model.index(0, 0, parent); QVERIFY(selectionModel.rowIntersectsSelection(0, parent)); + QVERIFY(selectionModel.columnIntersectsSelection(0, parent)); parent = model.index(0, 0, parent); QVERIFY(!selectionModel.rowIntersectsSelection(0, parent)); + QVERIFY(!selectionModel.columnIntersectsSelection(0, parent)); parent = model.index(0, 0, parent); QVERIFY(!selectionModel.rowIntersectsSelection(0, parent)); + QVERIFY(!selectionModel.columnIntersectsSelection(0, parent)); } void tst_QItemSelectionModel::unselectable() |