Thứ Tư, 18 tháng 4, 2012

[Qt] Bắt một sự kiện giao diện bất kỳ cho một đối tượng control

Ban đầu mình cố gắng connect sự kiện của một đối tượng QLineEditBox nhưng tìm mãi không thấy.
Lên mạng tìm hiểu thì ra nó không có hỗ trợ sự kiện đó nhưng có một cách thay thế đó là viết hàm bắt tất cả sự kiện trên control đó rồi chọn ra sự kiện muốn xử lý bằng cách overide lại hàm eventFilter().

Ví dụ mình muốn bắt sự kiện focus trong QLineEditBox:
class MainWindow : public QMainWindow

 {

 public:

     MainWindow();

 protected:

    //Khai báo là sẽ override hàm eventFilter()

     bool eventFilter(QObject *obj, QEvent *ev);

 private:

     QLineEdit *textEdit;

 };

 MainWindow::MainWindow()

 {

     textEdit = new QLinEdit;

     setCentralWidget(textEdit);

   

    // Câu lệnh này cài đặt eventFilter cho đối tượng textEdit

    //và đối tượng xử lý eventFilter là đối tượng hiện tại (MainWindow)

     textEdit->installEventFilter(this);

 }

 /*

    Obj là đối tương phát sinh sự kiện

    Event là loại sự kiện

 */

 bool MainWindow::eventFilter(QObject *obj, QEvent *event)

 {

    // Nếu đối tượng là textEdit

     if (obj == textEdit) {

        // Nếu sự kiện là focus

         if (event->type() == QEvent::FocusIn) {

            // mỗi lần click vào sẽ chọn tất cả nội dung trong textEdit box.

             textEdit->selectAll();

             // Trả về true nếu sự kiện xử lý thành công

             return true;

         } else {

             return false;

         }

     } else {

         // Nếu không phải là sự kiện cần bắt, trả về cho thằng cha xử lý

         return QMainWindow::eventFilter(obj, event);

     }

 }

Không có nhận xét nào:

Đăng nhận xét