Com o projeto do Ice Cream aberto no Qt Designer:
$ designer icecream.pro &
O menu acesse o menu "File/New" e escolha em seguida "Dialog":
A dialog abaixo foi desenhada:
E o código abaixo foi adicionado para o SLOT editFind() que já estava pré-definido como ação do clique do ícone Find na Toolbar da tela principal.
// Cabeçalho para a nova dialog nomeada como find.ui.h
#include "find.h"
// Criamos uma referência pública para o mainForm, uma vez
// que ele está declarado de forma global
findWindow *findDlg;
void mainForm::init()
{
// Instanciaremos o novo formulário, que nada mais é que
// uma classe, e devolveremos para nossa referencia global
findDlg = new findWindow( this );
// Conectaremos o SIGNAL "clicked" do objeto findDlg ao
// SLOT findText() da mainForm, ou seja, quando o botão
// "Find" for clicado a rotina findText() é disparada
connect( findDlg->findText, SIGNAL( clicked( ) ),
this, SLOT( findText( ) ) );
}
// Exibe a dialog Find. Nesse caso, foi pensado exatamente
// em somente se mostrar a dialog, pois se ele fosse instanciada
// localmente poderíamos ter várias instâncias da janela Find abertas.
// Além disso, sempre quando a dialog fosse fechada, perderíamos a
// referencia da última palavra digitada.
void mainForm::editFind()
{
findDlg->show();
}
// Por fim, eis onde a mágica da busca acontece. Na dialog "Find Text"
// ao se clicar no botão de busca, esse método é chamado
void mainForm::findText()
{
// currentEditor() é um método que mais tarde será explicado.
// Ele devolve uma referencia para o componente "Editor" da aba
// selecionada. Tal componente, chama-se QScintilla, e será explicado
// no próximo artigo.
// Como pode-se ver, ele chama o método findFirst(), que aceita como
// parâmetros a chave de busca, o segundo parâmetro booleano se a
// busca será baseada em expressão regular ou somente string, o
// próximo determina a busca não case sensitive, o próximo determina
// que a busca somente deve retornar resultados Iguais da string e não
// apenas partes dela (algo similar a busca de "chave1 chave2" no Google),
// o próximo parâmetro determina a quebra de texto, o próximo parâmetro
// determina que a próxima busca deve ser a partir da posição atual - caso
// contrario a busca é iniciada no começo do texto, e por fim é a indicação
// do índice da linha de onde a busca deve iniciar (Se for negativo, começa
// da posição atual, caso contrario inicia a primeira linha).
currentEditor()->findFirst (findDlg->findString->text(), FALSE, FALSE, TRUE, TRUE, TRUE, -1);}
Para finalizar adicionaremos o evento "close()" ao botão "Close" da dialog:
void findWindow::closeDialog()
{
close();
}
Ao clicar sob o ícone Find, eis o resultado:
Ao procurarmos pela string "Viva o
Linux" em meio ao texto, ele encontra a primeira ocorrência, em seguida a próxima e a próxima, e caso não haja próxima para baixo ele volta ao início.