פתיחה: קורס Qt

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

1. קצת היסטוריה

QT שוחררה לראשונה לציבור ב 1995, אך פיתוחה החל הרבה קודם. בשנת 1990, במהלך לימודיהם במכון הטכנולוגי הנורבגי, הווארד נורד ואריק צ'אמב-אנג עבדו על מערכת לאחסון תמונות. כשהגיעו לרגע שהיה צריך לפתח ממשק משתמש למערכת, שצריכה לרוץ על כל שלושת הפלטפורמות (יוניקס, חלונות ומק) הם קצת נתקעו. מספרים שבאחד מימי השמש הבודדים בקיץ הנורבגי, בעודם יושבים על ספסל ומתחרדנים, הווארד הציע שיבנו מערכת Object Oriented לתצוגה, שתרוץ על כל הפלטפורמות ובעזרתה יממשו את אפליקציית התמונות שלהם. מאז אפליקצית התמונות קצת נשכחה, אבל את העבודה על Qt הם החלו ב 1991, וב 1993 הם סיימו לפתח גירסא ראשונה לגרעין המערכת הגרפי. בשנתיים שלאחר מכן (1993 עד 1995) הם עבדו במרץ לשפר את המוצר ולמצוא לקוחות, בעוד נשותיהם עובדות במרץ לפרנס מאחר והמוצר עדיין לא הכניס שקל. החל מיומה הראשון בשוק, Qt הופצה ברשיון כפול - רשיון חופשי לשימוש בפרויקטי קוד פתוח, ורשיון מסחרי לשימוש בפרויקטים מסחריים. לאחר רכישת החברה בידי נוקיה בשנת 2008 נוסף רשיון שלישי לתמונה - ה LGPL, שהפך אותה לסביבה אטרקטיבית בהרבה עבור מפתחים קטנים. נחזור להווארד ואריק, שהמשיכו לעבוד מאוד קשה כדי למצוא לקוחות. ב 1995 הם אומנם הצליחו להשיג חוזה ראשון מול חברת מטיס (דרך חברים-של-חברים) לשירותי פיתוח ב Qt, אך עדיין חיפשו לקוחות שירכשו את הרשיון המסחרי לשימוש ב Qt.

לשמחתם, ולשמחתנו, ב 1996 סוכנות החלל האירופאית רכשה את הרשיון המסחרי, והפכה ללקוח השני שלהם. מכאן הדרך הפכה לקלה בהרבה, ובסוף אותה שנה כבר היו לשני הסטודנטים הנורווגים 8 לקוחות משלמים, ופרויקט אחד מרכזי (KDE) שהפך אותם לספריית ה GUI הסטנדרטית בעולם הלינוקס. נדלג עשר שנים קדימה. ב 2008, לאחר שנוקיה לא הצליחה להעמיד תחרות ראויה לאפל בתחום ממשק המשתמש, החליטה החברה לרכוש את TrollTech ולשלב את טכנולוגיית Qt במכשירים הניידים שלה. נוקיה השקיעה את השנתיים הבאות בהתאמת הפלטפורמה לטלפונים ניידים מתוצרתה המריצים Symbian או Maemo, וגם כאלה המריצים Windows Mobile. המטרה היתה להרים סביבת פיתוח אחידה לכל מכשירי נוקיה, לאחר שהם ראו כמה חשוב נושא האפליקציות ופיתוח האפליקציות לרווחיות בשוק הסמארטפונים.

כיום החברה שמפתחת את Qt נקראת The Qt Company לאחר שנוקיה מכרה את אחזקותיה בחברה ל Digia, וזו האחרונה הקימה את The Qt Company כחטיבה נפרדת. במאי 2016 החטיבה התפצלה וכיום נסחרת כחברה עצמאית.

מפתחים הבוחרים להשתמש בספריית Qt למוצרים שלהם עומדים בפני שלוש אפשרויות רישוי: הרשיון הפופולרי ביותר הוא LGPLv3, רשיון שבקצרה אומר שאתם יכולים לפתח ב Qt מה שאתם רוצים כל עוד אתם לא משנים את ספריית Qt עצמה ולהפיץ את המוצר שלכם כמוצר מסחרי לכל דבר. המגבלה המשמעותית היחידה היא שאם המוצר שלכם הוא מוצר חומרה יש לאפשר למשתמשים אפשרות לשנות או לשדרג את ספריית Qt עצמה המותקנת על המכשיר.

אפשרות שניה היא רשיון GPLv3, רשיון המחייב אתכם להפיץ את המוצר שכתבתם גם כן ברשיון חופשי ובקוד פתוח.

והאפשרות השלישית היא רכישה של רשיון מסחרי Qt Commercial. זוהי האפשרות היקרה ביותר אך מאפשרת את הגמישות הגדולה ביותר מבחינת המוצרים שאתם מפתחים ותמיכה מסחרית.

מבחינת הקוד בכל אפשרויות הרישוי שתבחרו תקבלו את אותה ספרית Qt ותוכלו להשתמש בכל יכולות הספריה. בחירת הרשיון רלוונטית רק לאופן הפצת המוצר הסופי שלכם.

2. תוכנית ראשונה ב Qt: ״שלום עולם״

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

תוכנית Qt היא תוכנית C++ רגילה לגמרי הנעזרת בפונקציות מספריית Qt כדי להציג ממשק משתמש ולהפעיל אותו. הקוד הבא בקובץ main.cpp מספיק בשביל להציג תיבת טקסט על המסך:

#include <QtWidgets>

int main(int argc, char **argv)
{
  QApplication app(argc, argv);

  QLabel l("Hello World");
  l.show();

  return app.exec();
}

בשביל לכתוב את הקוד נפעיל את Qt Creator, נפתח פרויקט חדש מסוג Qt Widgets Application ונדביק את הקוד הנ״ל בתוך הקובץ main.cpp בפרויקט שנוצר. לחיצה על Play תריץ את התוכנית ותציג את התווית. על שאר הקבצים בפרויקט שנוצר נדבר בשעורים הבאים.

כל תוכנית גרפית ב Qt מורכבת לפחות מיצירה של QApplication והפעלת המתודה exec שלו. המתודה exec מעבירה ל Qt את השליטה והיא זו שמציגה את הממשק וממתינה לאירועים מהמשתמש. אפשר לחשוב על קריאה זו ככניסה ללולאה אין סופית שהדרך היחידה לסיים אותה היא יציאה יזומה, למשל על ידי סגירת החלון או בקשה יזומה שלנו מהקוד. בלי הפעלת exec התוכנית תסתיים מיד ושום ממשק גרפי לא יוצג למשתמש, ולכן קריאה זו כל כך חשובה.

חלק חשוב מכל תוכנית גרפית הוא האינטרקציה עם המשתמש, וב Qt מימוש אינטרקציה כזו הוא ממש פשוט. בואו נרחיב את התוכנית כך שתכלול כפתור שלחיצה עליו תשנה את הטקסט. הקלידו את הקוד הבא בקובץ main.cpp במקום התוכנית הקודמת:

#include <QtWidgets>

int main(int argc, char **argv)
{
  QApplication app(argc, argv);

  QPushButton btn("Hello World");
  QObject::connect(&btn, &QPushButton::clicked, [&]() {
      btn.setText("Ouch!");
  });
  btn.show();

  return app.exec();
}

הפעם התוכנית מציגה כפתור ומשתמשת ב Lambda Function כדי לחבר קוד פעולה לכפתור. התחביר עבור Lambda Function הוא תחביר חדש שהגיע מ C++11. ספריית Qt עושה שמוש נרחב ב C++11 ובקורס נלמד גם על יכולות חדשות של תקן זה וכיצד לשלב אותן עם Qt.

דברים נוספים שנלמד בהמשך הקורס כוללים שמוש ב Qt Designer, כלי גרפי המאפשר דרך ממשק גרירה ידידותי לבנות ממשקים ולחבר פעולות וכיצד לחלק את התוכנית שלנו למספר קבצים ולחבר בין מתודות של מחלקות לאירועים בתוכנית.

3. יתרונות וחסרונות מרכזיים מול ספריות UI מתחרות

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

הבחירה ב Qt מתאימה לתוכניות שצריכות להראות ממשק גרפי טבעי ואחיד על מערכות הפעלה שונות. רכיבי Qt לוקחים בחשבון באופן אוטומטי את השוני בין מערכות ההפעלה, כך שלדוגמא תפריט עליון בתוכנית חלונות נראה בתוך חלון היישום אך ב mac הוא מופיע מחוץ לחלון היישום בשורת התפריטים כמקובל במערכת זו.

הבחירה ב Qt מתאימה גם לממשקי Embedded כאשר כח העיבוד של המכונה מוגבל או שרוצים לתקשר ישירות עם החומרה.

העובדה שהספריה כתובה ב C++ שמה אותה כבחירה מצוינת למי שרוצה להוסיף ממשק גרפי ליישום C++ קיים.

פיתוחים של הספריה בשנים האחרונות שמים דגש על תמיכה במובייל, וכיום ניתן לכתוב גם יישומי אייפון ואנדרואיד ב Qt ולשתף קוד בין יישום Desktop ליישומי המובייל, באמצעות ממשק QML. אנו נראה דוגמא ליישומים כאלה לקראת סוף הקורס.

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

בסיכומו של דבר הייתי ממליץ להשתמש ב Qt כשיש לכם צורך בבניית ממשק משתמש חוצה פלטפורמות המשתמש ביכולות של מערכת ההפעלה או שצריך להיראות ״טבעי״ בתוך מערכת ההפעלה בה הוא רץ. מקרה נוסף הוא כאשר אתם רצים על מכונה עם משאבים מוגבלים ורוצים לנצל בצורה מיטבית את יכולות המכשיר, למשל עבור מכונות Embedded.