Qt way - 3 นาทีกับการเขียนโปรแกรม GUI ง่ายๆบนลินุกซ์

อัดรูปดิจิตอล ทำสมุดภาพของคุณเอง
รอรับได้. ท่องเที่ยว แต่งงาน ฯลฯ

www.tanabutr.co.th/photobook


ว่าจะไม่เขียน Blog ต่อแล้วแต่อดไม่ได้. เขียนหน่อยแล้วกัน, เป็นการแบ่งความรู้สำหรับคนที่ต้องการเริ่มเขียนโปรแกรมด้วย Qt. อันนี้พอจะเป็นจุดเริ่มต้น (きっかけ) ได้ครับ.

ตัวอย่างต่อไปนี้เป็นการเขียนโปรแกรมด้วยภาษา C++ โดยใช้ Qt library. ในระบบที่ต้องการลองต้องมี Qt library 3.x อยู่. ถ้าเป็น Gentoo ก็ติดตั้ง Qt ได้ด้วยคำสั่ง emerge.

# USE=doc emerge qt

อันนี้ใช้ USE=doc เพื่อที่จะติดตั้งเอกสารด้วย.

โปรแกรมตัวอย่าง Hello Qt

โปรแกรมตัวอย่างใช้บรรณาธิกรณ์อะไรเขียนก็ได้. ให้มีชื่อเป็น hello.cpp แล้วเก็บไว้ในไดเรกทอรีที่ชื่อ hello ครับ.

     1  #include <qapplication.h>
     2  #include <qpushbutton.h>
     3
     4  int main( int argc, char* argv[])
     5  {
     6          QApplication app(argc, argv);
     7          QPushButton *button = new QPushButton("Hello Qt!", 0);
     8          button->show();
     9          app.setMainWidget( button);
    10          button->connect( button, SIGNAL(clicked()), button, SLOT(close()));
    11          app.exec();
    12  }

อธิบายทีละบรรทัดเลยแล้วกัน. บรรทัดที่ 1 เป็นไฟล์ header สำหรับการสร้าง Qt application. ส่วนบรรทัดที่สองเป็นไฟล์ header สำหรับใช้วิดเจด (widget) QPushButton.

บรรทัดที่ 4 เริ่มฟังก์ชัน main เหมือนโปรแกรม C/C++ ทั่วไป. บรรทัดที่ 6 สร้าง instance ของ QApplication ชื่อโดยใส่อาร์กิวเมนต์เป็น argc และ argv. คลาส QApplication จะเป็นตัวจัดการควบคุมโปรแกรม.

บรรทัดที่ 7 สร้าง QPushButton คือปุ่มกด. Constructor ของคลาสนี้มีหลายแบบ. ในที่นี้จะตั้งค่าสายอักษรที่จะแสดงบนปุ่ม (Hello Qt!), ตัววิดเจดพ่อแม่ (parent widget) และ ชื่อวิดเจด. ตรง panrent widget เป็น 0 หมายถึงปุ่มนี้ไม่ได้อยู่ในวิดเจดอื่น. เสร็จแล้วเรียก method show() ในบรรทัดที่ 8.

ในบรรทัดที่ 9 ใช้ app จัดการตั้งวิดเจดหลักด้วยฟังก์ชัน setMainWidget( button). บรรทัดที่ 10 เป็นการเขื่อม signal กับ slot ด้วยฟังก์ชัน connect ที่กำหนดไว้ในคลาส QObject. QPushButton สืบทอดมาจาก QWidget เลยมีฟังก์ชันนี้ด้วย. ฟังก์ชัน connect มีรูปแบบเป็น

connect( sender, SIGNAL(signal ), receiver, SLOT(slot));

ในตัวอย่างเป็นการส่ง signal ชื่อ clicked() โดยปุ่ม button หาตัวเองโดยต่อกับ slot ชื่อ close(). ในความเป็นจริงแล้ว Slot ก็คือ method ของคลาสนั้น. ชื่อ signal และ slot ต้องเขียนในแมคโคร (macro) SIGNAL() และ SLOT(). moc (meta-object compiler) จะเป็นตัวจัดการแปลงเป็นไวยกรณ์ C++ มาตรฐานให้ภายหลัง.

บรรทัดที่ 11 เป็นบรรทัดสุดท้ายสั่งให้โปรแกรมวน loop. ถ้ามีการกดปุ่ม, ตัวปุ่มซึ่งเป็นวิดเจดหลักจะรับสัญญาณแล้วปิด (close) ตัวเองทำให้โปรแกรมจบการทำงาน.

ลองคอมไพล์

คราวนี้เรียกว่า Qt way เป็นวิธีที่ Qt ใช้คอมไพล์โปรแกรมตามตัวอย่างต่อไปนี้.

$ pwd 
/home/poonlap/qt/hello
$ ls 
hello.cpp
$ qmake -project
$ ls
 hello.cpp  hello.pro
$ qmake hello.pro
$ ls
Makefile  hello.cpp  hello.pro
$ make
g++ -c -pipe -Wall -W -O3 -march=pentium4 -fprefetch-loop-arrays -pipe  
-DQT_NO_DEBUG -I/usr/qt/3/mkspecs/linux-g++ -I. -I. -I/usr/qt/3/include 
-o hello.o hello.cpp
g++ -Wl,-rpath,/usr/qt/3/lib -o hello hello.o    -L/usr/qt/3/lib 
-L/usr/X11R6/lib -lqt -lXext -lX11 -lm
$ ls
Makefile  hello*  hello.cpp  hello.o  hello.pro

คำสั่ง qmake เป็นคำสั่งสำหรับสร้างไฟล์ project (.pro) สร้าง Makefile. พอได้ Makefile แล้วก็สร้างโปรแกรมได้. รันแล้วจะได้ผลเหมือนในรูป. ว่างๆกฌดูเนื้อหาไฟล์ .pro และ Makefile ที่สร้างด้วยแล้วกันว่าเป็นอย่างไร.

หลังจากที่กดปุ่มแล้วก็จะจบการทำงาน.

เริ่มต้น Qt

ต่อจากนี้ก็อ่านเอกสารของ Qt เองครับที่ doc.trolltech.com หรือใช้โปรแกรม assistant จะแสดงเบราว์เซอร์ดูคู่มือที่อยู่ในเครื่องได้.

Comments: blogger