Skip to main content
تخط المحتوى

إعداد ويندوز

تجهيز تطبيق C++ الخاص بك لويندوز

مقدمة

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

ثلاثة أشياء مطلوبة:

مخطط كرافت ضروري لضم جميع التبعيات مع التطبيق لتوليد ملف تنفيذي.

يمكن استخدام توجيه المعالج المسبق #ifdef Q_OS_WIN لكتابة كود يُطبق فقط عند بناء التطبيق على ويندوز. هذا ضروري مرة واحدة على الأقل لفرض نمط بريز على التطبيق ليبدو جيدًا على ويندوز، لكن حسب التطبيق قد يتطلب المزيد.

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

مخطط كرافت

للبدء، يجب أولًا اتباع بناء برمجيات كيدي على ويندوز باستخدام كرافت لتحصل على مخطط كرافت وظيفي وتستطيع على الأقل بناء تطبيقك على ويندوز.

بمجرد أن تتمكن من بناء المشروع، ستحصل على أخطاء ترجمة وتشغيل ستساعدك في إصلاح أي مشكلات توافق مع ويندوز.

نمط بريز

من المفترض أن يكون دليل كيريغامي متوافقًا مع ويندوز في الغالب، لكن الخطوات اللازمة لتحقيق ذلك تحتاج إلى توضيح.

التعديلان اللذان يجب إجراؤهما لضمان استخدام نمط بريز هما ضبط QStyle على breeze وضبط نمط عناصر تحكم كيوت كويك على org.kde.desktop.

QStyle هو ما يتحكم في معظم مظهر تطبيق كيوت ويدجتس. هذا ضروري في تطبيق كيوت كويك لدينا لأننا نهيئ التطبيق باستخدام QApplication (المستخدم تقليديًا مع كيوت ويدجتس).

من ناحية أخرى، نمط عناصر تحكم كيوت كويك يتحكم في معظم مظهر تطبيق كيوت كويك. هذا يؤثر على شكل عناصر تحكم كيوإمإل. نمط كيدي org.kde.desktop (المعروف أيضًا باسم qqc2-desktop-style) مميز ويحاول إزالة التكرار باشتقاق عناصر التنسيق من QStyle الخاص بالتطبيق (ولهذا يُستخدم QApplication). بهذه الطريقة، يمكن لتطبيقات كيوت ويدجتس وكيوت كويك أن تبدو متشابهة في الغالب وتعيد استخدام مكونات التنسيق.

تطبيقات كيوت كويك/كيريغامي تحتاج إلى ضبط كليهما في كود سي++. لضبط QStyle، يجب إضافته في مكانين.

في كرافت:

def setDependencies(self):
    self.runtimeDependencies["kde/plasma/breeze"] = None

وفي سي++:

QApplication::setStyle("breeze");

هذا ما يُستخدم في دليل كيريغامي. يمكنك بدلًا من ذلك تحميل نمط بريز فقط على ويندوز حيث يكون هذا الأكثر صلة باستخدام ifdef:

#ifdef Q_OS_WIN
    QApplication::setStyle("breeze");
#endif

نمط عناصر تحكم كيوت كويك يحتاج إلى الإضافة في ثلاثة أماكن.

في كرافت:

def setDependencies(self):
    self.runtimeDependencies["kde/frameworks/tier3/qqc2-desktop-style"] = None

في سي++، حيث يحتاج إلى أن يكون شرطيًا:

if (qEnvironmentVariableIsEmpty("QT_QUICK_CONTROLS_STYLE"))
{
    QQuickStyle::setStyle("org.kde.desktop");
}

واختياريًا في سيمايك، بإحدى طريقتين:

find_package(KF6 REQUIRED COMPONENTS QQC2DesktopStyle)
# or
ecm_find_qmlmodule(org.kde.desktop REQUIRED)

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

الأمر find_package() يبحث تحديدًا عن ملفات تهيئة سيمايك لـ qqc2-desktop-style، بينما ecm_find_qmlmodule() أقل صرامة ويبحث فقط عن وحدة كيوإمإل. الأخير يتطلب تضمين ECMFindQmlModule:

include(ECMFindQmlModule)

شحن الأيقونات

أول شيء مطلوب لجعل التطبيق يستخدم أيقونات بريز هو تضمين KIconThemes في مشروعك.

بعد ذلك، بعض أوامر سيمايك مطلوبة لضم أيقونة تطبيقك مع التطبيق.

كي أيقونة ثيمات

يمكن القيام بذلك بالخطوات الثلاث التالية:

  • إضافته كتبعية في كرافت:
def setDependencies(self):
    self.runtimeDependencies["kde/frameworks/tier3/kiconthemes"] = None
  • إضافته كتبعية في سيمايك:
find_package(KF6 REQUIRED COMPONENTS IconThemes)

# ...

target_link_libraries(myapp
    PRIVATE
    # ...
    KF6::IconThemes
)
  • استخدامه في شيفرة C++، في ملف main.cpp:
#include <KIconTheme>

// ...
int main(int argc, char* argv[])
{
    KIconTheme::initTheme();
    QApplication app(argc, argv);
    // ...
}

لاحظ أنه على الرغم من أن اسم المشروع واستدعاء CMake يستخدمان صيغة الجمع (KIconThemes, KF6IconThemes)، فإن استدعاء C++ يستخدم صيغة المفرد (KIconTheme).

يجب تهيئة KIconThemes قبل التطبيق.

أيقونة التطبيق

إذا كان لتطبيقك أيقونة، فيجب إضافتها إلى مشروعك كمورد QML وكجزء من تثبيت الأيقونة.

عادةً على لينكس، يمكن ببساطة تثبيت أيقونة التطبيق في الدليل الصحيح، وسيتم جلب الأيقونة بواسطة التطبيق عند الحاجة. تتكون أيقونة التطبيق عادةً من أيقونة SVG رئيسية، مقترنة بأحجام أيقونات PNG متعددة.

يتم تثبيت أيقونة SVG هكذا في CMake:

install(FILES ${PROJECT_SOURCE_DIR}/icons/org.kde.myapp.svg DESTINATION ${KDE_INSTALL_FULL_ICONDIR}/hicolor/scalable/apps)

ويتم تثبيت أيقونات PNG هكذا:

ecm_install_icons(ICONS
    16-apps-myapp.png
    24-apps-myapp.png
    32-apps-myapp.png
    48-apps-myapp.png
    64-apps-myapp.png
    128-apps-myapp.png
    256-apps-myapp.png
    512-apps-myapp.png    
    DESTINATION share/icons)

عند تثبيت أيقونة التطبيق على لينكس، تذهب أيقونة PNG مثل 48-apps-myapp.png إلى ${INSTALL_PREFIX}/share/icons/hicolor/48x48/apps/myapp.png، وتذهب أيقونة SVG إلى ${INSTALL_PREFIX}/share/icons/hicolor/scalable/apps/org.kde.myapp.svg، حيث ${INSTALL_PREFIX} عادةً ما يمثل /usr أو /usr/local أو ~/.local. لاحظ كيف يُترجم اسم الأيقونة في حالة PNG إلى المسار الذي سيكون له في نظام الملفات.

يمكنك قراءة المزيد عن تثبيت الملفات في بناء برمجيات كيدي يدويًا: خطوة التثبيت.

بمجرد تثبيت الأيقونة بهذه الطريقة، في شيفرة QML، يمكن استدعاؤها ببساطة بـ myapp أو org.kde.myapp، كما سيتم استدعاؤها من QIcon::fromTheme(). يمكن استخدام هذا مع أي عنصر تحكم QML له خاصية icon.name.

لا يوجد لدى ويندوز مثل هذا الدليل القياسي، وتثبيت الأيقونة ليس له تأثير؛ يجب تضمينها مع التطبيق. للقيام بذلك، يمكن إرسال PNG إلى دليل التثبيت الخاص بها باستخدام ecm_add_app_icon() ويمكن تضمين ملف PNG أو SVG في التطبيق كملف مورد Qt في ecm_add_qml_module() أو ecm_target_qml_sources().

يتم تثبيت أيقونة تطبيق PNG بـ:

ecm_add_app_icon(myapp ICONS ${PROJECT_SOURCE_DIR}/icons/256-apps-myapp.png)

ويتم تضمين أيقونة التطبيق الرئيسية كمورد Qt بـ:

ecm_add_qml_module(myapp URI org.kde.myapp)
ecm_target_qml_sources(myapp SOURCES Main.qml RESOURCES ../icons/org.kde.myapp.svg)

سيجعل هذا أيقونة التطبيق متاحة كمورد Qt تحت qrc:/qt/qml/org/kde/myapp/org.kde.myapp.svg. يمكن استخدام هذا مع أي عنصر تحكم QML له خاصية icon.source.

يعتمد مسار RESOURCES على مكان وجود الأيقونات. تقليديًا، يتم إنشاء مجلد icons/ في جذر المشروع لتخزين جميع الأيقونات، لأنها لا تُعتبر حقًا ملفات مصدر.

بعد تثبيت الأيقونات (لنظام لينكس) وتضمينها (لويندوز وأندرويد)، يمكنك ضبطها في الشيفرة. في شيفرة QML، للتوافق مع كل من ويندوز وأندرويد، يجب استخدام الأيقونة المضمنة؛ في شيفرة C++، ولا سيما عند ضبط أيقونة النافذة، يمكنك استخدام أيقونة السمة مبدئيًا والأيقونة المضمنة كبديل احتياطي مع QIcon::fromTheme() في استدعاء QGuiApplication::setWindowIcon():

QGuiApplication::setWindowIcon(QIcon::fromTheme("org.kde.myapp", QIcon(":/qt/qml/org/kde/myapp/org.kde.myapp.svg")));

أيقونات كيريغامي

بينما لا يوجد لدى ويندوز دليل قياسي لتثبيت أيقونات من سمة أيقونات، فمن الممكن تضمين أيقونات بريز الضرورية مع تطبيق ويندوز الخاص بك.

يتم هذا بواسطة كرافت تلقائيًا عندما يتم إعداد KIconThemes بشكل صحيح للمشروع ويتم تضمين أيقونات بريز كاعتمادية في مشروعك.

لإعداد KIconThemes، راجع القسم أعلاه KIconThemes.

لإضافة أيقونات بريز كاعتمادية لمشروعك، أضف هذا إلى مخطط كرافت الخاص بك:

def setDependencies(self):
    # ...
    self.runtimeDependencies["kde/frameworks/tier1/breeze-icons"] = None

بهذه الطريقة، لن تحتاج إلى تضمين أي أيقونات بريز يدويًا في تطبيقك كمورد: يمكنك فقط استخدام اسم QIcon::fromTheme()، مثل kde أو application-exit-symbolic.

البناء

لبناء تطبيقك على ويندوز، اتبع بناء برمجيات كيدي على ويندوز مع كرافت: بناء مشاريعك الخاصة على ويندوز.

بنيات CI

إذا تم تكوين المشروع بشكل صحيح للبناء على ويندوز ويستخدم بنية كيدي التحتية لاستضافة الشيفرة (كيدي إنفنت)، فمن الممكن تكوين وظائف CI/CD لويندوز.

للقيام بذلك، ستحتاج إلى إضافة قوالب CI ذات الصلة لويندوز مع ملف .gitlab-ci.yaml وسرد اعتمادياتك في ملف .kde-ci.yaml كما هو مذكور في نظام التكامل المستمر.

استكشاف الأخطاء وإصلاحها

إذا كانت لديك مشاكل في تكييف تطبيقك مع ويندوز، يمكنك زيارة الغرف التالية على ماتريكس: