2012-02-08 29 views
6

Tôi đang cố thiết kế cửa sổ chính và QDialog và tìm cách tốt nhất để trả lại dữ liệu từ QDialog.Làm cách nào để trả lại dữ liệu từ QDialog?

Ngay bây giờ tôi đang bắt tín hiệu accepted() từ hộp thoại, sau đó tôi gọi chức năng của hộp thoại trả về dữ liệu. Có cách nào tốt hơn không?

Dưới đây là đoạn code làm việc mà tôi bây giờ có:

class MainWindow : public QMainWindow 
{ 
// ... 

public slots: 
    void showDialog() 
    { 
     if (!myDialog) 
     { 
      myDialog = new Dialog(); 
      connect(myDialog, SIGNAL(accepted()), this, SLOT(GetDialogOutput())); 
     } 
     myDialog->show(); 
    } 
    void GetDialogOutput() 
    { 
     bool Opt1, Opt2, Opt3; 
     myDialog->GetOptions(Opt1, Opt2, Opt3); 
     DoSomethingWithThoseBooleans (Opt1, Opt2, Opt3); 
    } 

private: 
    void DoSomethingWithThoseBooleans (bool Opt1, bool Opt2, bool Opt3); 
    Dialog * myDialog; 

}; 

Và Dialog:

class Dialog : public QDialog 
{ 
// ... 

public: 
    void GetOptions (bool & Opt1, bool & Opt2, bool & Opt3) 
    { 
     Opt1 = ui->checkBox->isChecked(); 
     Opt2 = ui->checkBox_2->isChecked(); 
     Opt3 = ui->checkBox_3->isChecked(); 
    } 
}; 

Điều đó có vẻ lộn xộn. Có thiết kế tốt hơn không? Tui bỏ lỡ điều gì vậy?

+4

Sẽ tìm một chút ít lộn xộn nếu bạn đã tạo một cấu trúc đơn giản để đóng gói những ba dữ liệu boolean, và trở về mà từ GetOptions; nhưng ngoài kỹ thuật đó là tốt. – Mat

Trả lời

4

Bằng cách đó là tốt, nhưng bạn cũng có thể nhìn vào có Dialog phát ra một tín hiệu như myDialogFinished(bool, bool, bool) để một khe cắm trên MainWindow, tiết kiệm phải gọi lại để Dialog sau khi nó kết thúc như vậy.

3

Một tùy chọn khác là chuyển hộp thoại đến nơi lưu trữ dữ liệu khi hoàn thành. Thông thường, tôi sẽ làm điều này trong quá trình khởi tạo hộp thoại.

class Dialog : public QDialog 
{ 
public: 
    Dialog(DialogResult* a_oResult) : m_oResult(a_oResult) {} 

signals: 
    void accepted() 
    { 
     DialogResult result; 
     // get results into 'result' 
     *m_oResult = result; 
    } 
private: 
    DialogResult *m_oResult; 
} 
+0

i am không chắc chắn nếu bạn có thể ghi đè lên 'chấp nhận' tín hiệu của' QDialog' ?? – scmg

14

Tôi thường làm điều này:

myDialog = new Dialog(); 
if(myDialog->exec()) 
{ 
    bool Opt1, Opt2, Opt3; 
    myDialog->GetOptions(Opt1, Opt2, Opt3); 
    DoSomethingWithThoseBooleans (Opt1, Opt2, Opt3); 
} 
Các vấn đề liên quan