2013-03-09 32 views
0

我希望能够执行文本搜索,用户可以在执行搜索之前选择要设置哪个flags。目前,我有一堆if/else语句根据set标志执行不同的搜索。有没有办法简化这个?如何在Qt中更高效地将标志传递给此函数?

这是我到目前为止有:

void FindDialog::on_btn_find_clicked() 
{ 
    const QString find_term = ui->le_find->text(); 
    bool found; 
    getConditions(); 

    //direction: true -> go backward, false -> go forward 
    if(dir) 
    { 
     //area: true -> description area, false -> example area 
     if(area) 
      found = te_desc_ptr->find(find_term, QTextDocument::FindBackward); 
     else 
      found = te_code_ptr->find(find_term, QTextDocument::FindBackward); 
    } else { 
     if(area) 
      found = te_desc_ptr->find(find_term); 
     else 
      found = te_code_ptr->find(find_term); 
    } 

    this->close(); 

} 

void FindDialog::getConditions() 
{ 
    //check conditions 
    //Area: True = Description, False = Example 
    //Direction: True = Up, False = Down 
    area = ui->rbtn_desc->isChecked(); 
    dir = ui->rbtn_up->isChecked(); 
    case_sen = ui->cbx_case->isChecked(); 
    whole = ui->cbx_whole->isChecked(); 
    regx = ui->cbx_reg->isChecked(); 
} 

的代码看起来,如果用户选择的复选框,并选择搜索类型要执行的。我真的想简化代码,以减少find()语句。显然,如果我添加更多选项,那么会有更多的if/else语句。我怎样才能改变这一点?

回答

3

您可以向下折叠if树这样的:

auto textArea = area ? te_desc_ptr : te_code_ptr; 
auto findFlags = dir ? QTextDocument::FindBackward : QTextDocument::FindFlags(0); 
textArea->find(find_term, findFlags); 

我还会考虑重新命名areadir,因为它都不明显,他们从自己的名字只是意味着什么。

+0

谢谢,但Qt不喜欢“0”作为标志。 – Ci3 2013-03-09 04:49:36

+0

@克里斯:啊,当然,对不起。现在修复。 – Cameron 2013-03-09 05:16:21