صدر مؤخرًا إصدار جديد طويل الأمد الدعم، وهو 6.5، من إطار عمل Qt. يقدم العديد من الإصلاحات والتحسينات والميزات الجديدة مقارنة بالإصدار السابق. قد يكون بعضها مفيدًا لتطبيقك (إن لم يكن الآن، فربما في المستقبل)، لذا من الجيد ترحيل تطبيقك إلى أحدث إصدار من إطار العمل. 

أعلم أن العديد من التطبيقات لا تزال تستخدم Qt 5، لذا لن يكون الانتقال مباشرة إلى أحدث إصدار من الإطار سهلاً. في هذه المقالة، أريد الإشارة إلى الخطوات الأكثر أهمية للانتقال السلس من Qt 5 إلى Qt 6.

Qt 5 مقابل Qt 6 – الترحيل؟ لماذا؟ 

نحن نعلم أن Qt هي واحدة من أفضل التقنيات عندما يتعلق الأمر بـتطوير واجهة المستخدم و واجهات الإنسان والآلة. قد تقول إن Qt 5 جيدة بما يكفي بالنسبة لك. فالتطبيق الخاص بك يعمل بشكل مثالي، ولا ترى أي فوائد للترحيل. بل على العكس، تفكر في العيوب، مثل المشكلات المتعلقة ببناء التطبيقات وتشغيلها أو ساعات لا حصر لها من الوقت المهدر. أريد أن أعرّفك على المزايا الرئيسية لـ Qt 6، وأن أُظهر لك لاحقاً في هذه المقالة أن الترحيل لا يجب أن يكون رحلة عبر الجحيم.

إذن، لماذا Qt 6؟

  1. تحسين الأداء: يقدم Qt 6 خط أنابيب عرض جديد يحسّن الأداء ويقلل استخدام الذاكرة، مما يؤدي إلى تطبيقات أسرع وأكثر استجابة.
  2. تحسين QML: تم تحسين QML بأداء أفضل، ودعم محسّن لتصدير فئات C++ إلى QML، وأدوات أقوى لتصحيح أكواد QML. يتيح لك مترجم Qt Quick Compiler الجديد ترجمة ملفات QML مسبقاً لتحقيق أوقات تشغيل أسرع.
  3. وحدات محسّنة. وقد أُعيدت كتابة بعض الوحدات وتحسينها، مثل Qt Quick 3D وQt Multimedia وQt WebEngine. سيضمن استخدام أحدث إصدار من هذه الوحدات أن يكون تطبيقك مواكبًا للمعايير الحالية.
  4. وحدات إضافية: ستكون العديد من الوحدات متاحة كإضافات. سيجعل ذلك ملف Qt الثنائي أصغر ويسمح لك بتنزيل الوحدة فقط عند الحاجة إليها في المشروع.
  5. الواجهة الخلفية الموحدة: يوفر Qt 6 واجهة برمجة تطبيقات واحدة للوصول إلى الوظائف الخاصة بكل منصة عبر عدة بيئات. يشمل ذلك الرسومات والوسائط المتعددة وأنظمة الإدخال والنوافذ.
  6. دعم طويل الأمد: لقد وصل Qt 5 بالفعل إلى نهاية عمره الافتراضي، وبينما لا تزال هناك إصلاحات أمنية وإصلاحات للأخطاء متاحة لبعض الإصدارات الأقدم، فإن أي ميزات أو وظائف جديدة ستكون متاحة فقط في Qt 6. إذا كنت لا تريد أن يصبح تطبيقك قديمًا بسرعة كبيرة، فيجب عليك البدء في عملية الترحيل.

هذه هي الأمور الرئيسية التي ستضمن أن استخدام أحدث إصدار من Qt 6 سيبقي تطبيقك محدثًا بأحدث الميزات. سيكون أداء تطبيقك أفضل من قبل، وسيكون من الأسهل صيانة التطبيق في المستقبل.

مسار الترحيل إلى Qt 6

إذا كنت تبدأ هذا الفصل، فمن المحتمل أنك قررت منح Qt 6 فرصة. الآن سأوضح الخطوات التي يجب اتخاذها لجعل عملية الترحيل سهلة قدر الإمكان.

الخطوة 1. نقل Qt إلى Qt 5.15 

قد تقول: "لماذا؟ لا أريد نقل تطبيقي إلى Qt 5.15! أريد نقله إلى Qt 6". أنت محق، لكن في بعض الأحيان يكون اتخاذ خطوتين صغيرتين أسهل من خطوة واحدة كبيرة. في حالتنا، نقل التطبيق إلى الإصدار الأخير من Qt 5 ثم الانتقال إلى Qt 6 أسهل بكثير. وذلك لأن Qt لم تطلق آليات لتسهيل الانتقال إلى Qt 6 إلا في الإصدار 5.15. ما هي هذه الآليات، وكيف أستخدمها؟ هذا موضح في الخطوة 4. يجب أن يكون الانتقال من الإصدار السابق من Qt 5 إلى الإصدار الأخير من Qt 5 مباشرًا وسهلًا.

الخطوة 2. التحقق من تغييرات الوحدات 

في Qt 6، لم تعد بعض الوحدات المتاحة في Qt 5 متوفرة. فقد أُزيلت هذه الوحدات أو أُعيدت تسميتها أو دُمجت في وحدة مختلفة. وقد جرى بالفعل تحديث العديد من الوحدات المُزالة وإضافتها إلى إطار العمل في الإصدارات الأخيرة.

من خلال التحقق من تغييرات الوحدة، يمكنك التأكد من أن تطبيقك سيعمل كما هو متوقع بعد الترحيل. قد تختلف الحلول الممكنة حول كيفية التعامل عندما لا تكون الوحدة موجودة بعد الآن. فيما يلي بعض الأمثلة على الوحدات المهملة وكيفية تحديث الكود الذي يستخدمها.

  • Qt Quick Controls 1 → استخدم Qt Quick Controls 2 الجديدة
  • Qt Multimedia Widgets ← استخدم QML API من Qt Multimedia
  • تأثيرات Qt الرسومية ← استخدم وحدة Qt5Compat (Qt Quick MultiEffect منذ Qt 6.5)

إذن، كما ترى، تعتمد إجراءاتك على الوحدة التي تحتاج إلى استبدالها. يمكن العثور على القائمة الكاملة للوحدات المحذوفة والتغييرات الأخرى فيوثائق Qt. 

«هل أحتاج إلى التحقق من التغييرات في كل وحدة في الوثائق؟»

لا، ليس عليك ذلك. يمكن أن يساعدك في العثور على البديل الصحيح لواجهة API المهملة، لكن أدوات Qt يمكنها إعلامك بجميع أجزاء الكود التي لم تعد مدعومة. ستجد المزيد حول هذا في الخطوة 4.

الخطوة 3. نقل Qt: تحقق من بيئتك 

يتطلب Qt 6 مترجمًا من C++17 أو أعلى (على سبيل المثال، لنظام Windows – MinGW 8.1.0 أو msvc 2019)، لذا إذا كنت تستخدم إصدارًا أقدم، فقد حان وقت الترقية. كما تدعم الأدوات التي طورتها شركة Qt إصدار Qt 6 بدءًا من إصدارات محددة. بالنسبة لـ Qt Creator، فهو الإصدار 4.14، وبالنسبة لـ Qt Design Studio، فهو الإصدار 2.0.

إذا تم تثبيت المترجم والأدوات الصحيحة، فينبغي أن يُبنى التطبيق المُعدّ لـ Qt 6 ويعمل بشكل صحيح بعد النقل.

الخطوة 4. تنفيذ النقل إلى Qt 6 

التخلص من الميزات المهملة. 

في Qt 5.15، يتم وضع علامة مهجورة على جميع الأشياء التي لن يتم تضمينها في Qt 6. بشكل افتراضي، سيظهر استخدام هذا الكود كتحذير من المترجم. لكن لديك خيار التعامل معه كخطأ.

لضمان ذلك، تحتاج إلى تحديد QT_DISABLE_DEPRECATED_BEFORE. يجب ضبطه على0x050F00. عند تحديد الماكرو، سيتم تعطيل الدوال المهملة (في إصدار معين من Qt أو أي إصدار أقدم).

إذا رأيت أي أخطاء أثناء البناء، يجب عليك إعادة هيكلة ذلك الجزء.

//qmake project file DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x050F00 //CMakeLists.txt add_compile_definitions(QT_DISABLE_DEPRECATED_BEFORE=0x050F00) 
الإخراج بدون ماكرو. تم بناء التطبيق بشكل صحيح.
الإخراج باستخدام الماكرو. لا يمكن بناء التطبيق.

تشغيل clazy وتخلص من هذه التحذيرات. 

Clazy هي أداة تحليل ثابت متاحة كإضافة في QtCreator. يمكن لـ Clazy تحليل الكود وإظهار ما ينبغي تحسينه. ومن الممكن إخبار Clazy صراحةً بما يجب فحصه أثناء التنفيذ. وهناك خيارات خاصة يجب تفعيلها يمكنها الإشارة إلى الجزء من الكود غير المدعوم في Qt 6. كما أن Clazy قادر على إصلاح هذه التحذيرات بنفسه، لذا كل ما عليك فعله هو تشغيل المحلّل.

خيارات Clazy المفيدة أثناء النقل:

  • qt6-deprecated-api-fixes
  • qt6-header-fixes
  • qt6-qhash-signature
  • qt6-fwd-fixes
  • missing-qobject-macro
يمكن تغيير إعدادات Clazy في Preferences → Analyzer → Clang tools → Diagnostic configuration.
خيارات Clazy المفيدة أثناء نقل الكود.
مثال على المخرجات.

استخدم وحدة Qt5Compat عند الحاجة. 

في الخطوة 2، ذكرت شيئاً يُسمى وحدة Qt5Compat. ما هي؟

تم تقديم هذه الوحدة لمساعدتك في عملية الترحيل. فهي توفر بعض الفئات التي لم تعد موجودة في Qt 6، مثل QRegExp وQStringRef، ولكن بفضل ذلك لا يزال بإمكانك استخدامها في تطبيقات Qt 6. على سبيل المثال، وحدة GraphicalEffects. لم تعد متاحة في Qt 6، ولكن إذا كان تطبيقك يستخدم الكثير من التأثيرات، فسيكون من الصعب الترحيل بسهولة دون أي تراجعات. لهذا السبب تتيح لك Qt استخدام واجهة البرمجة القديمة.

هذا لا يعني أنها الطريقة الصحيحة. يجب استبدال واجهة API القديمة على أي حال. لكن وحدة Qt5Compat تمنحك الوقت للعثور على بديل لأي شيء مهمل.

يُعد استخدام وحدة Qt Graphical Effects المثال الأمثل على ذلك. فقد اختفت هذه الوحدة في Qt 6، لكنها ستُعاد تقديمها باسم MultiEffect في أحد الإصدارات القادمة. لذا، في الوقت الحالي يمكننا استخدام وحدة Qt5Compat لضمان التوافق. ولكن عندما تتوفر وحدة MultiEffect، ينبغي إعادة كتابة الكود للتخلص من واجهة API القديمة.

كيفية استيراد الوحدة إلى مشروعك:

//qmake project file QT += core5compat //CMakeLists.txt find_package(Qt6 REQUIRED COMPONENTS Core5Compat) target_link_libraries(mytarget PRIVATE Qt6::Core5Compat) 

آخر شيء تحتاج إلى تغييره هو تغيير عبارات الاستيراد (import) في كود C++ أو QML.

// Qt 5 #include <QtCore/QRegExp> // Qt 6 #include <QtCore5Compat/QRegExp> 

الخطوة 5. اختبار التطبيق 

يجب إجراء اختبار التطبيق كخطوة أخيرة. ينبغي تنفيذ اختبارات الوحدة والتحقق من المخرجات المرئية للتطبيق. تستخدم تطبيقات QML في Qt 6 خلفية رسومية جديدة، لذا يُعد إجراء فحوصات الانحدار جزءًا مهمًا من عملية الترحيل. 

بالطبع، قد يستغرق مقارنة جميع العناصر المرئية في التطبيق بعض الوقت، لذا من الممارسات الجيدة أتمتة هذه الاختبارات. يمكن مقارنة لقطة شاشة لكل عرض في التطبيق بكسل بكسل مع أحدث مخرجات، ويمكن إخطارك إذا كان هناك خطأ ما. 

لا تقلق إذا بدا شيء ما مختلفًا بعد الترحيل. لا يزال لديك خيار استخدام استدعاءات OpenGL يدويًا (وحدة Qt OpenGL) التي كانت مستخدمة افتراضيًا في Qt 5. 

استفد من نقل Qt 

قد تبدو عملية الانتقال من Qt 5 إلى Qt 6 شاقة، لكن الخطوات المذكورة أعلاه من شأنها تسهيل هذه العملية. تشمل هذه الخطوات فهم التغييرات والميزات الجديدة في Qt 6، وتحديد مشكلات التوافق المحتملة، وإعادة هيكلة الكود اللازم، وتحديث الأدوات وأنظمة البناء، واختبار التطبيق بعناية.

الانتقال إلى Qt 6 يستحق بالتأكيد الوقت المستغرق فيه. يوفر Qt 6 العديد من التحسينات والميزات الجديدة غير المتوفرة في الإصدار الأقدم. سيجعل تطبيقك أسهل في الصيانة والتطوير لسنوات قادمة.

يمكننا مساعدتك في الترحيل. اطّلع على عرض Qt لمزيد من المعلومات.