2010-08-27 3 views
6

Trong Qt, cách nào tốt nhất để truyền dữ liệu từ một lớp con QDialog đến thành phần đã bắt đầu hộp thoại trong các trường hợp bạn cần truyền một thứ phức tạp hơn mã boolean hoặc mã trả về số nguyên?Làm cách nào để chuyển dữ liệu từ QDialog?

Tôi đang nghĩ phát ra tín hiệu tùy chỉnh từ vị trí accept() nhưng có điều gì khác không?

Trả lời

9

QDialog có vòng lặp thông điệp riêng của mình và kể từ khi nó dừng lại công việc ứng dụng của bạn, tôi thường sử dụng sơ đồ sau:

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

Điều này đúng nếu hộp thoại là phương thức ... Trong trường hợp của tôi, nhưng tôi chỉ nghĩ bạn sẽ làm điều này như thế nào trong một hộp thoại không có phương thức? Tôi đoán kết nối tín hiệu được chấp nhận của hộp thoại với một khe nơi bạn làm như vậy ở trên. – teukkam

+0

Vì vậy, không cần phát ra tín hiệu tùy chỉnh từ vị trí 'accept()'. Tín hiệu 'connect' có vẻ là tín hiệu thích hợp. – tibur

5

Trong trường hợp tổng quát, nếu dữ liệu là khá đơn giản, tôi muốn tạo một hoặc nhiều các tín hiệu tùy chỉnh và phát ra các tín hiệu đó khi cần thiết. Dữ liệu đơn giản hoặc phức tạp, tôi thường sẽ cung cấp cho người truy cập dữ liệu. Trong trường hợp phức tạp, sau đó, tôi sẽ kết nối một khe với tín hiệu accepted và nhận thông tin mong muốn trong vùng đó. Nhược điểm của điều này là bạn thường cần phải dựa vào việc lưu trữ một con trỏ vào hộp thoại, hoặc sử dụng hack sender() để tìm ra đối tượng nào đã kích hoạt khe.

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. 
}