0

我希望能够执行文本搜索,用户可以在执行搜索之前选择要设置的标志。目前,我有一堆 if/else 语句,它们根据设置的标志执行不同的搜索。有没有办法简化这个?

这是我到目前为止所拥有的:

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 语句。我该如何改变这一点?

4

1 回答 1

3

if您可以将树折叠成这样:

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

我也会考虑重命名areaand dir,因为仅仅从他们的名字来看,它们的含义并不明显。

于 2013-03-09T04:26:20.037 回答