תבנית סטארטר פשוטה ליישום QtQuick

08/02/2016
C++

למרות ש Qt Creator מגיע עם אוסף מרשים של תבניות התחלה לפרויקטים, לא כולנו עובדים בכלי זה וממילא עדיין לא מצאתי שם את התבנית המושלמת ליישום Qt Quick המשלב גם קוד C++, אז החלטתי לכתוב אחת.

1. מבנה התבנית

את קוד הסטארטר תוכלו למצוא בגיטהאב בקישור:
https://github.com/ynonp/qtquick-starter

התבנית הבסיסית של Qt Creator עבור יישומי Qt Quick היא די טובה וכבר כוללת קובץ main.qml וקוד C++ שמפעיל אותו, אבל יש עדיין מספר בעיות:

  1. לא ניתן לכתוב C++11
  2. הקוד לא מחולק לתיקיות
  3. אין קוד שמחבר בין QML ל C++

בשביל לאפשר קוד C++11 כל שצריך הוא להוסיף את השורה הבאה לקובץ ה pro של הפרויקט:

CONFIG += c++11

חלוקה לתיקיות היא גם כן עניין טכני ברובו. שימו לב לקובץ ה qrc שם הוספתי alias לרכיב ה qml הראשי כדי שיהיה קל לטעון אותו מהקוד:

<RCC>
    <qresource prefix="/">
        <file alias="main.qml">qml/main.qml</file>
    </qresource>
</RCC>

 

2. מחלקה Startup

שינוי נוסף בקוד הוא השמוש במחלקה שנקראת Startup במקום לכתוב את קוד האתחול ב main. בינתיים זה לא נראה שינוי גדול אבל יש לו שני יתרונות:

  1. ככל שהתוכנית גדלה יהיה גם יותר קוד אתחול. כשהקוד כתוב במחלקה נפרדת יותר קל לשבור אותו לפונקציות או תתי מחלקות.
  2. ניתן להגדיר Signals ו Slots פשוטים במחלקה זו (מה שאי אפשר לעשות עם פוקנציית main רגילה).

אוביקט Startup נוצר בתחילת ה main וכל הקוד עובר לבנאי של אוביקט זה. הריסתו בסוף ה main תביא למחיקת כל האוביקטים שיצר דרך מנגנון ניהול הזכרון הרגיל של Qt Objects.

3. מחלקה View Manager

המחלקה האחרונה ברשימה היא ה View Manager: זוהי המחלקה שמחברת בין Qt ל C++. מדובר במחלקת C++ רגילה לגמרי אותה אנו חושפים ל QML דרך הקריאה:

m_engine.rootContext()->setContextProperty("MainViewMgr", &m_viewMgr);

מהקובץ startup.cpp. מתוך QML אפשר לקרוא ל Slots ול Properties של אותה מחלקה ולהירשם ל Signals שלה דרך ציון שמה. הקוד כולל דוגמא ל Property שמוגדר ב C++ ומשותף ל QML בשם appName, להגדרת שם היישום.