2010-05-03 32 views
24

Tôi đã tự tiêm vào ứng dụng Qt và tôi đang cố gắng tìm ra tín hiệu nào cho một khe nhất định được kết nối, nhưng không thể tìm thấy bất kỳ thông tin nào về việc này. Có một cơ chế để làm điều này ra khỏi hộp? Nếu vậy, điều này có tiếp xúc với QtScript không? (Nếu không, tôi có thể quấn nó đủ dễ dàng.)Xác định các tín hiệu được kết nối với một khe nhất định trong Qt

Nếu không có cơ chế như vậy, cách tốt nhất để thêm nó là gì? Tôi không thể thao tác các ứng dụng hiện có bên ngoài của hooking đơn giản, nhưng tôi có thể móc QObject :: kết nối và lưu trữ các kết nối bản thân mình, chỉ không chắc chắn nếu đó là cách tốt nhất để đi về nó.

Trả lời

3

Sau khi đào xung quanh cơ sở mã Qt và tài liệu (tôi nhận được nhiều lời khuyên hữu ích từ đây và ở nơi khác), tôi đã kết thúc việc cài đặt QObject :: connect (quá tải tĩnh). Tại sao? Vâng, các giải pháp khác yêu cầu bạn biết những gì các đối tượng đang cung cấp các tín hiệu, đào sâu vào các trường riêng, hoặc phải có một bản xây dựng gỡ rối của Qt. Cuối cùng, việc kết nối QObject :: hooking mang đến cho bạn mọi thứ được kết nối trong ứng dụng và bạn có thể ánh xạ trở lại các khe.

26

Tôi nghĩ Qt lưu trữ các khe một tín hiệu cho trước được kết nối với, để khi bạn phát ra nó tất cả thu được gọi là, do đó bạn có thể truy cập vào danh sách các người nhận:

Đối với mục đích gỡ lỗi, bạn phải:

trống QObject :: dumpObjectInfo()

Dumps thông tin về tín hiệu kết nối, vv cho đối tượng này để gỡ lỗi đầu ra.

Chức năng này hữu ích để gỡ lỗi, nhưng không có gì nếu thư viện có được biên dịch ở chế độ phát hành (tức là không có thông tin gỡ lỗi).

Và danh sách các khe một tín hiệu được kết nối:

int QObject :: thu (const char * tín hiệu) const [bảo vệ]

Trả về số thu kết nối với tín hiệu.

metaObject() cung cấp cho bạn QMetaMethod cho vị trí nhưng không có thông tin về kết nối của nó. Tuy nhiên, nếu bạn biết các đối tượng, bạn có thể đi qua tất cả các tín hiệu (sử dụng đối tượng meta, kiểm tra loại phương thức cho tín hiệu) và xây dựng một chỉ số ngược với các bộ thu khe() cho bạn.

+0

Cảm ơn thông tin. Có cơ sở nào để làm điều này mà không biết các vật thể không? Đó thực sự là vấn đề tôi đang gặp phải vào lúc này. –

+6

Phần thứ hai của câu trả lời này là khá sai. –

6

Không có cách nào để lặp lại một cách an toàn danh sách các kết nối khe cắm tín hiệu mà không giữ các mutexes/semaphor nội bộ của Qt. Các tín hiệu và khe có thể đến và đi bất cứ lúc nào, vì vậy tốt nhất bạn nên có một danh sách không được bảo đảm là chính xác - và do đó vô dụng.

Bất cứ điều gì mà bạn làm trong số QObject::connect cũng không đủ. Dữ liệu bạn nhận được từ các móc như vậy sẽ bị như sau:

  1. Bạn có thể có con trỏ đến các đối tượng đã bị xóa khi bạn cố gắng truy cập chúng.Bạn có thể giảm thiểu điều này bằng cách sử dụng QPointer, nhưng điều này chỉ hoạt động cho các đối tượng sống trong chuỗi nơi bạn chạy mã của mình. Bạn sẽ cần phải tiêm đối tượng của bạn vào các chủ đề khác để thu thập danh sách đối tượng ở đó.

  2. Bạn có thể có các kết nối không còn tồn tại nữa. Thậm chí hooking QObject::disconnect sẽ không đủ, vì các kết nối sẽ bị xóa khi các đối tượng ngừng tồn tại.

Sự cố bạn gặp phải khá phức tạp và mọi giải pháp mạnh mẽ sẽ không chỉ giới hạn ở "hooking" QObject::connect.

Than ôi, bạn chưa nói lý do tại sao bạn cần danh sách các tín hiệu được đính kèm vào một vị trí. công dụng của nó là gi?

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