2012-06-11 32 views
14

Tôi đang sử dụng một tín hiệu và kết nối khe trong một khối. Mã của tôi như sauKhe được gọi nhiều lần mỗi lần phát ra tín hiệu

trong a.cpp

{ 
QObject::connect(m_ptheFlange2Details,SIGNAL(GetFlang1DimAfterAnalysis()), 
       this,SLOT(GetFlang1DimAftrAnalysis())); 

m_ptheFlange2Details->get();// one function inside which i am emiting 
          // GetFlang1DimAfterAnalysis() signal ; 

QObject::disconnect(m_ptheFlange2Details,SIGNAL(GetFlang1DimAfterAnalysis()), 
        this,SLOT(GetFlang1DimAftrAnalysis())); 

} 

Bên trong get() chức năng khi tuyên bố Emit này thực hiện, các khe cắm được gọi rất nhiều lần. Nơi mà theo tôi nó nên gọi chỉ một lần.

+4

Bạn có chắc chắn rằng 'kết nối' không được gọi là nhiều lần ?? !!! Vui lòng cho chúng tôi biết thêm một chút mã. Trong đó chức năng 'connect' và' disconnect' đã được viết? – Ammar

+2

Có bao nhiêu lần 'emit' được gọi trong' get() '? – cmannett85

+2

Mã này có vẻ tốt.Bây giờ đăng phần xấu xí của mã của bạn! – ScarCode

Trả lời

26

Như đã nêu trong một số nhận xét, điều này thường xảy ra khi gọi kết nối thêm một lần. Khe sẽ được gọi một lần cho mỗi lần kết nối được thực hiện. Ví dụ, mã sau đây sẽ cho kết quả là slot() được gọi 3 lần khi signal() được phát ra một lần.

connect(obj, SIGNAL(signal()), obj2, SLOT(slot())); 
connect(obj, SIGNAL(signal()), obj2, SLOT(slot())); 
connect(obj, SIGNAL(signal()), obj2, SLOT(slot())); 

Nếu bạn đang làm connect trong mã mà có thể chạy nhiều hơn một lần, nó thường là một ý tưởng tốt để sử dụng Qt::UniqueConnection như tham số thứ 5. Đoạn mã sau sẽ cho kết quả là slot() được gọi 1 lần khi signal() được phát ra một lần.

connect(obj, SIGNAL(signal()), obj2, SLOT(slot()), Qt::UniqueConnection); 
connect(obj, SIGNAL(signal()), obj2, SLOT(slot()), Qt::UniqueConnection); 
connect(obj, SIGNAL(signal()), obj2, SLOT(slot()), Qt::UniqueConnection); 

Tôi đoán lý do mã của bạn không hoạt động một cách chính xác là bởi vì bạn đang bỏ qua tham số thứ 5 và kết nối mặc định là Qt::DirectConnection (đối với các chương trình đơn luồng). Điều này ngay lập tức gọi khe như thể đó là một cuộc gọi hàm. Điều này có nghĩa là có thể kết nối được gọi lại trước khi ngắt kết nối xảy ra (nếu có các vòng lặp trong chương trình của bạn).

+0

nếu bạn đang phát ra tín hiệu, thì chỉ có khe được gọi đúng không ?? nó không quan trọng bao nhiêu lần bạn đã sử dụng tuyên bố kết nối .. bạn có thể vui lòng mô tả một cái gì đó trên Qt :: uniqueconnection .. kể từ khi tôi mới đến qt, do đó, không có ý tưởng về nó .. – Kenta

+1

Nó * không * vấn đề như thế nào nhiều lần bạn gọi kết nối * trừ khi * bạn sử dụng Qt :: UniqueConnection. Nếu bạn đang thực hiện kết nối trong một hàm và bạn gọi hàm đó nhiều lần, bạn cần sử dụng Qt :: UniqueConnection hoặc vị trí của bạn sẽ được gọi nhiều lần. Tôi đã chỉnh sửa bài đăng của mình để cố gắng thể hiện tốt hơn một chút. –

+0

@ Rick - Thankxxx – Kenta

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