2012-02-17 27 views
16

Thật khó để tôi hiểu sự khác biệt giữa tín hiệu và sự kiện trong Qt, ai đó có thể giải thích?Sự khác biệt giữa sự kiện và tín hiệu trong Qt

+7

Tôi nghĩ đây là câu hỏi thực và không nên đóng. Đây là câu trả lời từ Tài liệu Cộng đồng Qt: Một sự kiện trong Qt là một đối tượng đại diện cho điều gì đó thú vị đã xảy ra; sự khác biệt chính giữa sự kiện và tín hiệu là các sự kiện được nhắm mục tiêu đến một đối tượng cụ thể trong ứng dụng của chúng tôi (quyết định việc cần làm với sự kiện đó), trong khi tín hiệu được phát ra “trong tự nhiên”. Từ một điểm mã, tất cả các sự kiện là các cá thể của một số lớp con của QEvent [doc.qt.nokia.com] và tất cả các lớp có nguồn gốc QObject đều có thể ghi đè phương thức ảo QObject :: event() để xử lý sự kiện. – Dmitriy

+1

Bản sao có thể có của [Sự kiện Qt và Tín hiệu/Thời điểm] (http://stackoverflow.com/questions/3794649/qt-events-and-signal-slots) – Andrea

Trả lời

4

Sự kiện là điều đã xảy ra đến hoặc trong một đối tượng. Nói chung, bạn sẽ đối xử với chúng trong mã lớp riêng của đối tượng.

Tín hiệu là phát ra bởi một đối tượng được phát ra. Đối tượng là cơ bản thông báo cho các đối tượng khác rằng một cái gì đó đã xảy ra. Các đối tượng khác có thể làm một cái gì đó như là một kết quả hay không, nhưng đây không phải là công việc của emitter để đối phó với nó.

2

Sự kiện được chuyển trực tiếp đến phương thức xử lý sự kiện của một lớp học. Chúng có sẵn cho bạn quá tải trong các lớp con của bạn và chọn cách xử lý sự kiện một cách khác nhau. Các sự kiện cũng truyền chuỗi từ trẻ này sang cha khác cho đến khi một người nào đó xử lý nó hoặc nó rơi khỏi phần cuối.

Tín hiệu mặt khác được phát ra công khai và bất kỳ thực thể nào khác có thể chọn kết nối và nghe chúng. Chúng đi qua các vòng lặp sự kiện và được xử lý trong một hàng đợi (chúng cũng có thể được xử lý trực tiếp nếu chúng nằm trong cùng một luồng).

9

Một kiện là một thông điệp đóng gói trong một lớp học (QEvent) mà được xử lý trong một vòng lặp sự kiện và cử đến người nhận mà có thể chấp nhận các tin nhắn hoặc vượt qua nó cùng với những người khác để xử lý. Chúng thường được tạo ra để đáp ứng với các sự kiện hệ thống bên ngoài như nhấp chuột.

Tín hiệu và Slots là một cách thuận tiện cho việc QObject s để liên lạc với nhau và tương tự hơn để chức năng gọi lại. Trong hầu hết trường hợp, khi một "tín hiệu" được phát ra, bất kỳ chức năng khe nào được kết nối với nó đều được gọi trực tiếp. Ngoại lệ là khi các tín hiệu và khe cắm vượt qua các ranh giới của luồng. Trong trường hợp này, tín hiệu về cơ bản sẽ được chuyển đổi thành một sự kiện.

2

ấn tượng của tôi về sự khác biệt là như sau:

enter image description here

Giả sử bạn có một thiết bị máy chủ, chạy một vòng lặp vô hạn, nghe một số khách hàng sự kiện bên ngoài và phản ứng đối với họ bằng cách thực hiện một số mã.

(Có thể là CPU, nghe ngắt quãng từ thiết bị hoặc mã trình duyệt Javascript phía máy khách, cho phép người dùng nhấp chuột hoặc mã trang web phía máy chủ, lắng nghe người dùng yêu cầu trang web hoặc dữ liệu).

Hoặc nó có thể là ứng dụng Qt của bạn, chạy vòng lặp chính của nó.

Tôi sẽ giải thích với giả định rằng bạn đang chạy Qt trên Linux với máy chủ X được sử dụng để vẽ.

tôi có thể phân biệt 2 khác biệt chính, mặc dù một giây là hơi mơ hồ:

  1. Sự kiện đại diện cho phần cứng của bạn và là một tập hợp hữu hạn nhỏ. Các tín hiệu đại diện cho logic lớp Widget của bạn và có thể tùy ý phức tạp và vô số.

Sự kiện là thông điệp cấp thấp, đến với bạn từ khách hàng. Tập hợp sự kiện là tập hợp giới hạn nghiêm ngặt (~ 20 loại sự kiện khác nhau), được xác định bằng phần cứng (ví dụ: nhấp chuột/doubleclick/press/release, di chuyển chuột, phím bàn phím được nhấn/phát hành/giữ vv) và được chỉ định trong giao thức tương tác (ví dụ giao thức X) giữa ứng dụng và người dùng.

Ví dụ: tại thời điểm giao thức X được tạo ra không có cử chỉ đa cảm ứng, chỉ có chuột và bàn phím để giao thức X sẽ không hiểu cử chỉ của bạn và gửi chúng đến ứng dụng, nó sẽ chỉ giải thích chúng là nhấp chuột. Do đó, các mở rộng cho giao thức X được giới thiệu theo thời gian.

X sự kiện không biết gì về tiện ích, tiện ích chỉ tồn tại trong Qt. X sự kiện chỉ biết về các cửa sổ X, là các hình chữ nhật rất cơ bản mà các tiện ích của bạn bao gồm. Sự kiện Qt của bạn chỉ là một trình bao bọc mỏng xung quanh sự kiện X/sự kiện Windows/sự kiện Mac, cung cấp lớp tương thích giữa các sự kiện gốc của Hệ điều hành khác nhau để thuận tiện cho các tác giả lớp logic cấp Widget.

Giao dịch logic cấp tiện ích con với Tín hiệu, vì chúng bao gồm ý nghĩa cấp Widget về hành động của bạn. Hơn nữa, một tín hiệu có thể được kích hoạt do các sự kiện khác nhau, ví dụ: hoặc nhấp chuột vào nút "Lưu" hoặc một phím tắt như Ctrl-S.

  1. Nói rõ ràng (điều này không chính xác về Qt!), Sự kiện không đồng bộ về bản chất của chúng, trong khi Tín hiệu (hoặc móc theo thuật ngữ khác) là đồng bộ.

Giả sử, bạn có hàm foo(), có thể kích hoạt Tín hiệu HOẶC phát ra Sự kiện. Nếu nó phát tín hiệu, Tín hiệu được thực hiện trong cùng một chuỗi mã với chức năng gây ra nó, ngay sau hàm.

Mặt khác, nếu nó phát ra Sự kiện, Sự kiện được gửi đến vòng lặp chính và nó phụ thuộc vào vòng lặp chính, khi nó mang sự kiện đó đến bên nhận và những gì xảy ra tiếp theo.

Do đó, 2 sự kiện liên tiếp thậm chí có thể được phân phối theo thứ tự đảo ngược, trong khi 2 tín hiệu liên tiếp bị gián đoạn vẫn tiếp tục.

Mặc dù, thuật ngữ không nghiêm ngặt. "Singals" trong Unix như một phương tiện của Interprocess Communication nên được gọi là sự kiện tốt hơn, vì chúng không đồng bộ: bạn gọi một tín hiệu trong một quá trình và không bao giờ biết, khi vòng lặp sự kiện sẽ chuyển sang quá trình nhận và thực hiện xử lý tín hiệu .

P.S. Xin hãy tha thứ cho tôi, nếu một số ví dụ của tôi không hoàn toàn chính xác về chữ cái. Họ vẫn còn tốt về tinh thần.

Các vấn đề liên quan