תבנית סטארטר פשוטה ליישום QtQuick
למרות ש Qt Creator מגיע עם אוסף מרשים של תבניות התחלה לפרויקטים, לא כולנו עובדים בכלי זה וממילא עדיין לא מצאתי שם את התבנית המושלמת ליישום Qt Quick המשלב גם קוד C++, אז החלטתי לכתוב אחת.
1. מבנה התבנית
את קוד הסטארטר תוכלו למצוא בגיטהאב בקישור:
https://github.com/ynonp/qtquick-starter
התבנית הבסיסית של Qt Creator עבור יישומי Qt Quick היא די טובה וכבר כוללת קובץ main.qml וקוד C++ שמפעיל אותו, אבל יש עדיין מספר בעיות:
- לא ניתן לכתוב C++11
- הקוד לא מחולק לתיקיות
- אין קוד שמחבר בין 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. בינתיים זה לא נראה שינוי גדול אבל יש לו שני יתרונות:
- ככל שהתוכנית גדלה יהיה גם יותר קוד אתחול. כשהקוד כתוב במחלקה נפרדת יותר קל לשבור אותו לפונקציות או תתי מחלקות.
- ניתן להגדיר 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, להגדרת שם היישום.