2011-12-24 34 views
7

Gần đây tôi đã gặp phải sự cố với mã do các hành vi nhất định phụ thuộc vào thứ tự kết nối khe tín hiệu trong một đối tượng cụ thể. Đây là một lỗ hổng thiết kế thay cho tôi (các kết nối luôn có nghĩa là năng động nên lỗ hổng này là không thể tránh khỏi), nhưng nó khiến tôi suy nghĩ.Thay đổi thứ tự kết nối khe cắm tín hiệu

Có thể sắp xếp lại các kết nối khe tín hiệu trong một đối tượng không? Và/hoặc chỉ định "chỉ mục" của kết nối khi tạo kết nối?

Tôi đánh giá cao mà bạn có thể mô phỏng hiệu ứng này bằng cách tiêu diệt tất cả các kết nối và tái tạo chúng trong một trật tự mới, nhưng đó không phải là những gì tôi yêu cầu. Tôi không thể tìm thấy bất cứ điều gì trong API hoặc tài liệu chung, vì vậy tôi nghi ngờ câu trả lời là không, nhưng tôi nghĩ rằng tôi nên hỏi anyway ...

Trả lời

10

Trái với những gì seemed to be the past understanding, tôi ngạc nhiên khi đọc một bản cập nhật (tại ít nhất trong các phiên bản gần đây) Qt đã không để lại thứ tự của các cuộc gọi khe như undefined:

Nếu một số khe được kết nối với một tín hiệu, các khe sẽ được thực hiện cái khác, theo thứ tự chúng đã được kết nối, khi tín hiệu được phát ra.

http://doc.qt.io/qt-4.8/signalsandslots.html#signals

(Mặc dù người ta có thể tranh luận rằng một câu trong đó một tài liệu là không đủ để đại diện cho một sự đảm bảo "mạnh" cho tất cả các phiên bản Qt 4.X khứ và tương lai.)

Có vẻ như không phải API để sắp xếp lại các tín hiệu và vị trí. Ngay cả khi có, tôi cảm thấy dựa vào thứ tự không phải là một ý tưởng hay. Tôi muốn đề nghị xem xét lại thiết kế.

Một điều bạn có thể điều tra là làm cho nó để các vị trí của bạn xếp hàng hành động thay vì thực hiện hành động trực tiếp. Sau đó, khi tất cả các khe đã được gọi, bạn sẽ xử lý hàng đợi đó ... xem xét một số thuộc tính ưu tiên.

+0

Đồng ý. Giống như tôi đã lưu ý trong câu hỏi của mình, tôi nhận ra rằng đó là lỗi thiết kế, nhưng các nhà phát triển API nên cung cấp cho chúng tôi mọi thứ chúng tôi cần để thoát khỏi tình huống dính cho dù có sang trọng hay không. Tôi đã nghĩ rằng đây sẽ là một điều hiển nhiên, nhưng xét đoán bởi việc thiếu truy vấn thậm chí về nó trên internet, cho thấy tôi rõ ràng là sai ở đó! – cmannett85

+0

Cũng giống như có hai loại quyền tự do chính trị ("tự do" và "tự do") có hai loại tính mạnh mẽ trong thiết kế API. Trong trường hợp này, tôi nghĩ rằng không có khả năng sắp xếp lại các tín hiệu, nó có vẻ không phù hợp với một khẳng định rằng có một thứ tự hợp đồng. * nhún vai * http://hostilefork.com/2005/07/04/freedom-to-and-freedom-from/ – HostileFork

0

QObject lưu trữ nội bộ các kết nối dưới dạng danh sách. Đó là một vấn đề đơn giản để sử dụng tiêu đề <private/qobject_p.h> để có được một khóa trên danh sách kết nối của người gửi và sắp xếp lại các mục nhập của nó. Một API công khai sẽ làm cho chi tiết này được cố định trong suốt thời gian của mỗi phiên bản Qt chính, và điều này được xem là quá hạn chế.

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