2010-08-27 27 views
6

Qt'de, bir QDialog alt sınıfından, boole veya tamsayı dönüş kodundan daha karmaşık bir şeyleri iletmeniz gereken durumlarda iletişim kutusunu başlatan bileşene veri iletmenin en zarif yolu nedir?QDialog verileri nasıl aktarılır?

accept() yuvasından özel bir sinyal yaymayı düşünüyorum ama başka bir şey var mı?

cevap

9

QDialog kendi ileti döngüsü vardır ve başvurunuzun iş akışını durdurur beri, ben genellikle aşağıdaki şemayı kullanın: Veriler oldukça basit olup olmadığını bir veya daha fazla oluşturmak ister, genel durumda

MyQDialog dialog(this); 
dialog.setFoo("blah blah blah"); 
if(dialog.exec() == QDialog::Accepted){ 
    // You can access everything you need in dialog object 
    QString bar = dialog.getFoo(); 
} 
+0

Bu, iletişim kipliyse, doğrudur ... Benim durumumda, ama sadece bunu modal olmayan bir iletişimde nasıl yaparsınız diye düşünüyordum. İletişim kutusunun kabul edilen sinyalini, yukarıdakiyle aynı şeyi yaptığınız bir yuvaya bağladım. – teukkam

+0

Yani, 'accept()' yuvasından özel bir sinyal göndermeye gerek yok. 'Connect' sinyali uygun olanı gibi görünüyor. – tibur

5

Özel sinyaller ve bunları gerektiği gibi yayar. Basit veya karmaşık veriler, genellikle veriler için erişim sağlayıcıları temin ederim. Karmaşık durumda, o zaman, accepted sinyaline bir yuva bağlar ve istenen bilgiyi o yuvaya alırdım. Bunun dezavantajı genellikle, diyaloğa bir işaretçiyi saklamaya ya da yuvanın hangi nesnenin tetiklendiğini bulmak için sender() hack'in kullanılmasına güvenmeniz gerektiğidir.

void Foo::showDialog() 
{ 
    if (!m_dlg) 
    { 
     m_dlg = new Dialog(this); 
     connect(m_dlg, SIGNAL(accepted()), SLOT(onDialogAccepted())); 
    } 
    m_dlg->Setup(m_bar, m_bat, m_baz); 
    m_dlg->show(); 
} 

void Foo::onDialogAccepted() 
{ 
    m_bar = m_dlg->bar(); 
    m_bat = m_dlg->bat(); 
    m_baz = m_dlg->baz(); 
    // optionally destroy m_dlg here. 
} 
İlgili konular