Mục đích:
Bài viết này hướng dẫn cách sử dụng Qt Creator:
- Tạo một project mới
- Thiết kế giao diện ứng dụng sử dụng các điều khiển (widgets) của Qt
- Sử dụng kỹ thuật lay out để sắp đặt các điều khiển trên form. (Cho phép giao diện ứng dụng thay đổi kích thước linh hoạt)
- Sử dụng cơ chế signal và slot trong lập trình Qt
Chương trình minh họa tên là TextFinder thực hiện tìm kiếm từ khóa (keyword) trong nội dung của một file text.
1. Tạo Project TextFinder
- Chọn File > New File or Project > Qt C++ Project > Qt Gui Application > Choose.
- Chọn phiên bản Qt cho project (Ứng dụng cho nền tảng Desktop, FriendlyArm , …)
- Điền thông tin tên lớp sẽ tạo ra trong khung chương trình mẫu, chọn lớp cơ sở (base class) cho form chính là Qwidget. Các file mã nguồn tương ứng sẽ được tự động đặt tên và cập nhật.
Thanh Panel Projects quản lý các tệp tin của project gồm:
- Tệp TextFinder.pro
- Tệp textfinder.ui (Giao diện/form chính của project)
- Tệp textfinder.h và textfinder.cpp (Các file mã nguồn project)
- Tệp main.cpp (Chứa chương trình chính main, điểm bắt đầu thực thi của ứng dụng)
2. Thiết kế giao diện ứng dụng
- Trong chế độ soạn thảo (Edit), double-click textfinder.ui để mở chế độ thiết kế (Qt Designer). Hoặc sử dụng phím tắt Ctrl + 3
- Chọn kéo/thả các điều khiển (widget) từ thanh công cụ bên trái gồm:
· Label
· Line Edit
· Pushbutton
(Có thể tìm các widget này bằng các gõ tên gợi nhớ vào ô Filter)
- Double-click lên TextLabel để đặt tên là Keyword
- Double-click lên Pushbutton để đặt tên là Find
- Trong cửa sổ Properties, đặt tên (objectName) cho Pushbutton này là findButton
Sử dụng kỹ thuật Layout
- Chọn tất cả các widgets trên (Ctrl + A hoặc drag chuột), và chọn Layout Horizontally (phím tắt Ctrl + H) để căn chỉnh các widgets này theo chiều ngang.
- Thêm điều khiển Text Edit vào form.
- Chọn cả form và Click Layout Vertically (phím tắt Ctrl + L) để căn chỉnh các widgets theo chiều thẳng đứng
Chú ý:
- Việc sắp xếp các điều khiển widget trên form sử dụng layouts cho phép giao diện (UI) của ứng dụng có thể co giãn linh hoạt theo các kích thước màn hình (kích thước các điều khiển sẽ được thay đổi theo kích thước form chứa).
- Có thể sử dụng các kiểu layout (horizontal, vertical, grid, form)
- Kết hợp sử dụng các thuộc tính sizePolicy, minimumSize, maximumSize (trong cửa sổ Properties) để thiết lập các ràng buộc về kích thước cho điều khiển (widget) khi được layout.
3. Sử dụng cơ chế signal và slot
- Để gọi hàm xử lý tìm kiếm (Find) khi người dùng chọn nút nhấn Find, Qt cung cấp cơ chế signal/slot (xử lý sự kiện event-handler). Một tín hiệu (signal) sẽ được phát sinh (emit) khi một sự kiện xảy ra và slot là một hàm sẽ được gọi để đáp ứng sự kiện đó.
- Để tạo cơ chế signal/slot có thể add từ chế độ Designer hoặc viết mã.
- Qt widgets định nghĩa các signals và slots có thể add trực tiếp trong chế độ Designer. Để thêm slot trong trường hợp của nút Find như sau:
· Right-click lên nút Find để mở context-menu
· Chọn Go to Slot > click(), và chọn OK
- Trong file mã nguồn textfinder.h sẽ xuất hiện một private slot tên là on_findButton_clicked()
và trong file mã nguồn textfinder.cpp tương ứng xuất hiện khung của hàm TextFinder::on_findButton_clicked().
4. Viết mã cho ứng dụng TextFinder
File textfinder.h đã chứa các thư viện #include cần thiết, hàm tạo, hàm hủy và các đối tượng ui. Cần thêm một hàm private đặt tên là loadTextFile() để đọc và hiện nội dung của một file text lên điều khiển TextEdit (lớp QtextEdit)
- Trong panel Projects chế độ Edit, double-click lên file textfinder.h để mở nội dung mã nguồn file này.
- Thêm một hàm có phạm vi truy xuất private, như mô tả sau:
private slots:
void on_findButton_clicked();
private:
Ui::TextFinder *ui;
void loadTextFile();
Trong file textfinder.cpp
- Mở nội dung file mã nguồn này.
- Viết mã đọc nội dung file text (ví dụ input.txt) sử dụng lớp Qt hỗ trợ là QFile, sử dụng QTextStream để đọc file và hiện nội dung lên điều khiển textEdit sử dụng phương thức setPlainText của điều khiển này. Minh họa mã nguồn như sau:
void TextFinder::loadTextFile()
{
QFile inputFile("input.txt”);
inputFile.open(QIODevice::ReadOnly);
QTextStream in(&inputFile);
QString line = in.readAll();
inputFile.close();
ui->textEdit->setPlainText(line);
QTextCursor cursor = ui->textEdit->textCursor();
cursor.movePosition(QTextCursor::Start, QTextCursor::MoveAnchor, 1);
}
- Để sử dụng QFile và QTextStream, thêm thư viện #includes vào textfinder.cpp:
#include <QtCore/QFile>
#include <QtCore/QTextStream>
- Trong hàm slot on_findButton_clicked(), thêm mã nguồn để lấy keyword muốn tìm và sử dụng hàm find() để tìm kiếm keyword trong file text đã có. Mã nguồn minh họa:
void TextFinder::on_findButton_clicked()
{
QString searchString = ui->lineEdit->text();
ui->textEdit->find(searchString, QTextDocument::FindWholeWords);
}
- Sau khi đã viết sau các hàm trên, gọi hàm loadTextFile() trong hàm tạo để nạp nội dung file text lên điều khiển TextEdit ngay khi ứng dụng được chạy.
TextFinder::TextFinder(QWidget *parent)
: QWidget(parent), ui(new Ui::TextFinder)
{
ui->setupUi(this);
loadTextFile();
}
- Slot on_findButton_clicked() được gọi tự động trong file uic (ui_textfinder.h) được tạo ra bởi dòng lệnh:
QMetaObject::connectSlotsByName(TextFinder);
Bạn có đam mê ngành thiết kế vi mạch và bạn muốn có mức lương 1000 usd cùng lúc bạn
đang muốn tìm một Trung tâm để học vậy hãy đến với ngành vi mạch tại SEMICON
HotLine: 0972 800 931 Ms Duyên