2012-03-25 19 views
12

Sinyalleri yuvalara bağlamak için, bildiğim kadarıyla sinyal parametrelerinin yuva parametrelerine uygun olması gerekir. Yani, örneğin:Sinyalleri sabit değerlere sahip yuvalara bağlayın

connect(dockWidget->titleBarWidget(), SIGNAL(closeButtonClicked()), ui->sideControls, SLOT(closeDockWidget())); 

Ama bir sinyal çağrısı parametrelerinin farklı bir miktar olan bir yuva var, ama her zaman yuvaya sabit bir değer geçmek istiyorsan ne. düğmesine basıldığında

connect(dockWidget->titleBarWidget(), SIGNAL(closeButtonClicked()), ui->sideControls, SLOT(setDockWidget(false))); 

Veya başka bir deyişle

, yanlış parametre setDockWidget() işlevini çağırır: Örneğin, yukarıdaki kod parçası kullanılarak. Mümkün mü?

cevap

8

Hayır, bu mümkün değil. Sadece karşılık gelen sinyalden daha az veya eşit argüman sayısına sahip slotları bağlamanız mümkün. (bkz. documentation)

İstenen birini arayacak proxy yuvası oluşturmanız gerekmektedir.

+1

Bu yanıt artık geçerli değil, çünkü C++ 11'deki Qt5 sözdizimi bu amaç için bir lambda kullanmayı oldukça kolaylaştırıyor. –

+1

@ André, Diğer tarafta ise, sadece istediğinizi arayacak olan vekil yuva yaratabilirsiniz. Artık yerinde – Lol4t0

+1

yapabilirsiniz. Ancak, ekstra bir yuva, istemediğiniz başlıkta daha fazla şey ifade etmekte, dışarıdan gelen çağrılara (evet, özel bir yuva dışarıdan çağrılabiliyorsa bile) ve kodunuzun etrafını birden fazla yere yaymaktadır. Geçmek istediğiniz değerleri içerecek şekilde ek üye değişkenlerine gereksiniminiz olabilir, böylece sınıfınızda ek durum eklenebilir. Lambda çözümü çok daha zariftir ve bir çözüm IMO'su olarak bir proxy yuvasının girişini diskalifiye eder. –

6

Bir şekilde, evet, yapabilirsiniz. Ama çok güçlü değil: sadece setDockWidget bu şekilde beyan:

[virtual] void setDockWidget(bool state=false) ; 

ve bağlantı bu şekilde beyan: argümanlar olmadan denilen

connect(emitter, SIGNAL(closeButtonClicked()), receiver, SLOT(setDockWidget())); 

setDockWidget varsayılan olanları alır.

8

ile birlikte lambda'yı numaralı sabit bağımsız değişkeni ile kullanabilirsiniz. Örnek: https://wiki.qt.io/New_Signal_Slot_Syntax: Yeni bağlantı sözdizimi hakkında

connect(obj, &ObjType::signalName, [this]() { desiredCall(constantArgument); }); 

Daha.

+0

Sizin durumunuzda değişkeni değişken ile karıştırmak mümkün mü? –

+0

@AlekseyKontsevich: Eğer sizi doğru anlarsam, bir değişkeni de sinyalden yuvaya geçirmek istersiniz? Tabi ki yapabilirsin. Bunu lambda için bir argüman haline getirin ve bu argümanı işlev çağırma işleminde kullanın. Ancak, bağlam argümanını 'bu' değeriyle de kullanmanızı öneririz. Bu şekilde, alıcı nesne imha edilirse bağlantının imha edildiğinden emin olabilirsiniz. Aksi halde, tanımlanmamış davranışlarda son bulabilirsin. –

İlgili konular