2012-03-29 24 views

Trả lời

8

Bạn không thể trong Qt phiên bản < Qt 5.

Để sử dụng tín hiệu/khe trình biên dịch đối tượng meta phải được gọi. Để thực hiện điều này lớp học của bạn phải đáp ứng các yêu cầu sau:

  • Kế thừa từ QObject hay bất kỳ lớp con khác (ví dụ QWidget, QPushButton vv)
  • vĩ mô Q_OBJECT cần được xác định trong phần private của lớp theo thứ tự để cho phép các tính năng meta-đối tượng như khe
  • Sử dụng Qt từ khóa slotssignals để tuyên bố mà chức năng nên xử lý bởi trình biên dịch meta như khe hoặc tín hiệu

Để biết thêm chi tiết kiểm tra các trang tài liệu tương ứng về và signals & slots

Ngoài ra kiểm tra tài liệu QObject:

Chú ý rằng Q_OBJECT vĩ mô là bắt buộc đối với bất kỳ đối tượng mà thực hiện tín hiệu, khe hoặc tính chất. Bạn cũng cần chạy Trình đối tượng meta trên tệp nguồn. Chúng tôi khuyên bạn nên sử dụng của macro này trong tất cả các lớp con của QObject bất kể có hay không không thực sự sử dụng tín hiệu, vị trí và thuộc tính, vì không thực hiện được một số chức năng nhất định.

Chỉnh sửa: Vì biểu thức Qt 5, functors và lambda có thể được sử dụng làm vị trí. Xem New Signal Slot Syntax in Qt 5

+1

Quan trọng, tuy nhiên, trong khi điều này là không thể trong Qt 4, nó sẽ để có thể trong Qt 5, sử dụng cơ chế tín hiệu/khe cắm mới. http://qt-project.org/wiki/New_Signal_Slot_Syntax – leinir

+0

Bạn nói đúng, nhưng IMHO nó chỉ nên được sử dụng trong những trường hợp hiếm hoi. Sử dụng các khe cắm thanh lịch hơn bằng cách sử dụng tr1 :: liên kết với các hàm đơn giản. – pnezis

+0

tôi hoàn toàn đồng ý, họ phải là một sự xuất hiện hiếm có. Rất giống như cirquit ngắn nếu phát biểu, chúng rất hữu ích trong một số trường hợp rất hẹp, và trong những trường hợp đó tăng khả năng đọc và dễ bảo trì. Nhưng, họ chỉ nên được sử dụng sau đó, không phải là một quy tắc chung. – leinir

0

Không chắc chắn. Qt-meta-object-compiler (moc) kết thúc tốt chức năng, được đánh dấu là khe -s, trong trình bao bọc mã tương đối lớn. Các tệp, được tạo bởi moc, bắt đầu bằng moc_, xem chúng.

4

Trong Qt 5, bạn có thể. Xem http://qt-project.org/wiki/New_Signal_Slot_Syntax

Trong Qt 4, điều này không được hỗ trợ trực tiếp nhưng có một vài thư viện cung cấp chức năng này bằng cách ủy quyền tín hiệu qua khe trong QObject ẩn, sau đó gọi chức năng không có khe của bạn. Nỗ lực của tôi tại đây có thể được tìm thấy tại https://github.com/robertknight/qt-signal-tools. Có các liên kết đến các triển khai khác ở dưới cùng của README.

8

Vì biểu thức Qt 5, functors và lambda có thể được sử dụng làm vị trí (như đã đề cập ở đây: http://qt-project.org/wiki/New_Signal_Slot_Syntax).

Như tôi đã không thể tìm thấy mã ví dụ, tôi đã thêm như sau:

Ví dụ này sử boost::function cho thành viên lớp ClassName::classMember() không có tham số.

boost::function<void()> f= boost::bind(&ClassName::classMember, classInstance); 
    connect(QObjectInstance, &QObject::signalName, f); 

Khi tín hiệu và đẳng cấp thành viên Qt có thông số (ví dụ ClassName::classMember(int)), chức năng tăng nên được điều chỉnh như sau:

boost::function<void(int)> f= boost::bind(&ClassName::classMember, classInstance, _1); 

Thông tin thêm về boost :: ràng buộc có thể được tìm thấy trong tài liệu: http://www.boost.org/doc/libs/1_55_0/libs/bind/bind.html

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