2011-12-24 39 views
7

Belirli bir nesnede belirli bir davranışın sinyal yuvası bağlantı sırasına bağlı olmasından kaynaklanan kodumla ilgili bir sorunla karşılaştım. Bu benim adıma bir tasarım hatasıdır (bağlantılar her zaman dinamik olmalıydı, bu yüzden bu kusur kaçınılmazdı), ama beni düşünmeye başladı.Sinyal yuvası bağlantı sırasını değiştirin

Sinyal yuvası bağlantılarını bir nesnede yeniden sipariş etmek mümkün mü? Ve/veya bir bağlantı oluştururken "dizin" belirtin?

Sana tüm bağlantıları tahrip ve yeni bir sırayla yeniden oluşturarak bu etki taklit edebilir takdir, ama bu Soruyorum ne değildir. API veya genel belgelerinde hiçbir şey bulamadım, bu yüzden cevabın hayır olduğunu sanıyorum, ama yine de sormam gerektiğini düşündüm ...

cevap

10

seemed to be the past understanding'un tersine, (en son sürümlerinde) Qt olarak tanımlanmamış çağıran yuvasının sırasını bırakmamış:

birkaç yuvaları tek sinyale bağlıysanız

, yuvaları onlar bağlandıktan sırayla, birbiri ardına idam edilecek, sinyal verildiğinde. (Bir o bir belgede bir cümle geçmiş ve gelecek tüm Qt 4.X sürümleri için "güçlü" bir garanti temsil etmek yeterli olmadığını iddia edebilir rağmen.) http://doc.qt.io/qt-4.8/signalsandslots.html#signals

Sinyalleri ve yuvaları yeniden sıralamak için bir API görünmemektedir. Olsa bile, siparişe güvenmenin çok iyi bir fikir olmadığını hissediyorum. Tasarımı yeniden düşünmeyi öneririm.

Soruşturmanız gereken bir şey, yuvalarınızın doğrudan harekete geçmek yerine eylemlerini sıralamasını sağlamaktır. Sonra, tüm yuvalar çağrıldığında, bazı öncelik özelliklerini hesaba katarak o sıraya göre işlem yaparsınız. QObject, bağlantıları bir liste olarak depolar.

+0

Anlaşmalı. Sorumu belirttiğim gibi, tasarım kusuru olduğunu biliyorum, ancak API geliştiricileri, ister şık olsun olmasın, yapışkan durumlardan kurtulmamız için gereken her şeyi bize vermelidir. Bunun açık bir şey olacağını düşünürdüm, ama internette bile bu konuda sorgulama eksikliğinden yola çıkarak, orada açıkça yanlış olduğumu gösterir! – cmannett85

+0

İki çeşit politik özgürlük olduğu gibi ("özgürlük" ve "özgürlükten"), API tasarımında iki tür güçlülük vardır. Bu durumda ben sinyalleri yeniden sıralamak için bir olanağı sunmuyoruz ince olduğunu düşünüyorum, sadece bir sözleşmeye düzen var ki, bir iddia ile yersiz görünüyor. * silkmek * http://hostilefork.com/2005/07/04/freedom-to-and-freedom-from/ – HostileFork

0

Gönderenin bağlantı listesine bir kilit almak ve girdilerini yeniden düzenlemek için <private/qobject_p.h> başlığını kullanmak basit bir meseledir. Bir kamu API'sı, her bir önemli Qt revizyonunun süresi boyunca bu detayı sabitleştirecektir ve bu durumun çok sınırlayıcı olduğu görülmüştür.