2015-01-22 27 views
5
đang

Ví dụ:Cần xóa QValidator theo cách thủ công?

QDoubleValidator *validator = new QDoubleValidator(); 
myInputLineEdit->setValidator(validator); 

// delete validator; 

Lưu ý: myInputLineEdit là một con trỏ QLineEdit và sẽ bị xóa với mẹ của nó.

Câu hỏi của tôi là, khi nào tôi nên xóa trình xác thực vì nó được tạo thủ công và setValidator() dường như không sở hữu con trỏ này theo tài liệu? Nếu tôi không xóa nó, nó sẽ bị rò rỉ bộ nhớ?

Tôi đã cố xóa nó ngay sau đó, như mã nhận xét và tôi nhận thấy trình xác thực của myInputLineEdit đã trở thành 0 sau đó. Vì vậy, tôi nghĩ rằng tôi có thể cần phải xóa nó sau khi myInputLineEdit bị xóa.

Một ý nghĩ khác là, tôi có thể cung cấp cho trình xác thực một phụ huynh để nó sẽ bị xóa cùng với người phụ trách của nó, đây có phải là cách hay để làm điều đó không? Điều gì xảy ra nếu không có một ứng cử viên tốt để làm cha mẹ?

Cảm ơn

+1

Nếu bạn quan tâm đến lý do tại sao 'setValidator' không nắm quyền sở hữu: có thể vì bạn có thể sử dụng cùng trình xác thực cho nhiều tiện ích con đầu vào, do đó, đó là quyền sở hữu * chia sẻ *.Nhưng QObjects không có quyền sở hữu chung nhưng thay vào đó * duy nhất * quyền sở hữu cha mẹ, vì vậy bạn cần đặt cha mẹ thành * some * widget (chỉnh sửa dòng hoặc cha mẹ của nó, bất kỳ điều gì có ý nghĩa nhất). – leemes

Trả lời

6

Tôi đã cố gắng xóa ngay sau đó, như mã nhận xét và tôi nhận thấy trình xác thực của myInputLineEdit đã trở thành 0 sau đó. Vì vậy, tôi nghĩ rằng tôi có thể cần xóa nó sau khi myInputLineEdit bị xóa.

Đó là vì QLineEdit sử dụng QPointer nội bộ, theo dõi đối tượng QValidator nếu nó đã bị xóa.

và setValidator() dường như không mất quyền sở hữu của con trỏ này theo các tài liệu

setValidator() thực sự không đặt phụ huynh của QValidator.

Một ý nghĩ khác là, tôi có thể cung cấp cho người xác thực một phụ huynh để bị xóa cùng với người giám hộ của nó, đây có phải là cách hay để làm điều đó không? Điều gì sẽ xảy ra nếu không có một ứng cử viên tốt để làm cha mẹ?

Bạn có thể xóa nó bằng tay, sử dụng con trỏ thông minh hoặc làm như @crayzeewulf nói - thiết myInputLineEdit như cha mẹ (sử dụng QValidator constructor hoặc setParent()). Cha mẹ chăm sóc về việc xóa con của nó, vì vậy nó là một cách để đi. Thường là đối tượng mà trình duyệt tính hợp lệ được chỉ định là một phụ huynh tốt.

Nếu tôi không xóa, nó có bị rò rỉ bộ nhớ không?

Nếu bạn không đặt bố mẹ hoặc xóa, sẽ bị rò rỉ bộ nhớ.

+0

Xin cảm ơn các bạn. Tôi đã không sử dụng myInputLineEdit làm cha mẹ vì tôi muốn sử dụng trình xác nhận này cho một số đối tượng QLineEdit, như được đề cập bởi @leemes. Vì vậy, sẽ có một vấn đề khi một trong số họ bị xóa. Tôi đoán tôi có hai lựa chọn ở đây: 1, người tạo một trình xác thực cho mỗi QLineEdit; 2, vì tất cả các đối tượng QLineEdit này là các thành viên của một lớp chung, cũng là một lớp QObject, tôi có thể sử dụng nó làm cha mẹ. – vlursk

+0

@Leo Đi với tùy chọn 2. – thuga

2

Sử dụng mInputLineEdit như parent của validator như trong ví dụ here. Các destructor của một phụ huynh phá hủy tất cả các đối tượng con (xem this). Đây là "cách qt" để xử lý ownership trees.

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