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