Calculadora

Como se explica anteriormente, calculadora tiene por objetivo mostrar el manejo de datos numérico a partir de cadenas de texto ingresadas mediante objetos de la clase QLineEdit. Esta aplicación no es trivial, ya que los datos ingresados son cadenas de texto, debiendo ser convertidos a variables numéricas antes de ser utilizados, y posterior al procesamiento, deben ser re-convertidos a cadenas de caracteres para ser mostrados al usuario. La generación gráfica de la interfaz se realiza siguiendo el mismo procedimiento mostrado en el ejemplo anterior, creando la aplicación mostrada en la figura 5.

Figura 5: Interfaz de calculadora
\includegraphics[scale=0.4]{fig/calculadora.ps}

Así los nombres dados a los objetos incluidos son los mostrados a continuación, y representan la funcionalidad de cada uno:


Clase de Widget Nombre Objeto
QLineEdit entrada
QPushButton clear
QPushButton div
QPushButton mult
QPushButton resta
QPushButton suma
QPushButton igual
QPushButton uno
QPushButton dos
QPushButton tres
QPushButton cuatro
QPushButton cinco
QPushButton seis
QPushButton siete
QPushButton ocho
QPushButton nueve
QPushButton cero

Una vez creada la interfaz gráfica, se debe generar la funcionalidad de esta. La lógica implementada para el ingreso de datos al objeto entrada, consiste en que cuando un botón de número se presiona, todo el texto en en él se almacena en una variable temporal, para posteriormente agregar el número correspondiente y volver a escribirlo en entrada. Para ello se crea un slot para cada botón, el que es ``lanzado'' al presionarlos. Este proceso es mostrado en el cuadro 8, dando como ejemplo el botón uno.


Tabla 8: Ingreso de valores a calculadora
\begin{table}
\begin{center}
\lstset{
%aboveskip=8pt,
backgroundcolor=\color{...
...).data());
ui->entrada->setFocus();
}
\end{lstlisting}
\end{center}\end{table}


Una vez finalizado el ingreso del primer número, se debe presionar el botón asociado a la operación requerida, para luego ingresar el segundo. Para esto se utilizan dos atributos privados de la clase calculadora, numero1 y numero2. Así, al presionar el botón de operación se almacena el valor en la variable numero1, permitiendo el ingreso del próximo. Para mostrar esto, se utiliza como ejemplo el operador ``+'', mostrando su implementación en el cuadro 9


Tabla: Ingreso segundo valor de una operación
\begin{table}
\begin{center}
\lstset{
%aboveskip=8pt,
backgroundcolor=\color{...
... = ui->entrada->text().toInt(ok,10);
}
\end{lstlisting}
\end{center}\end{table}


De esta forma, a través del método privado guardar_datos() se almacena el primer valor en numero1, ya que el atributo privado operador es inicializado previamente como NULL. Luego de esto se indica que la operación a realizar es SUM, se borran los datos en entrada y se ``entrega el foco'' a entrada para el ingreso del segundo número. En el método guardar_datos(), se utiliza la función toInt(...) de la clase QObject (el método text() retorna un objeto de la clase QObject) para convertir los caracteres en una variable de tipo int.


Tabla: Cálculo de la operación y exposición del resultado
\begin{table}
\begin{center}
\lstset{
%aboveskip=8pt,
backgroundcolor=\color{...
...LL;
}
\par
ui->entrada->setFocus();
}
\end{lstlisting}
\end{center}\end{table}


Una vez finalizada la inserción del segundo valor, se presiona el botón igual, por lo que, como se muestra en el cuadro 10, se almacena el segundo valor mediante el método guardar_datos(). En este caso, ya que operador contiene el valor SUM, es almacenado en la variable numero2. Luego, se realiza la operación correspondiente, y se muestra el resultado en entrada, para lo que debe convertirse la variable numérica n_resultado en una cadena de caracteres. Así, este proceso se realiza desde la línea 12 a la 16 del cuadro 10. Para ello se utiliza una variable temporal de tipo char *, la que almacena el valor retornado por el método privado itoa()8 a partir de la variable de tipo int, n_resultado. Luego se crea el objeto resultado de la clase QString, para almacenar el valor, en caracteres, del resultado obtenido e ingresarlo a entrada para que el usuario puede visualizarlo. El detalle del método itoa() es mostrado en el cuadro 11.


Tabla: Conversión int to char*, método itoa()
\begin{table}
\begin{center}
\lstset{
%aboveskip=8pt,
backgroundcolor=\color{...
...rd)] = (char)NULL;
\par
return word;
}
\end{lstlisting}
\end{center}\end{table}


Así, luego de la implementación es posible ingresar valores mediante los botones generados para ello o mediante el teclado. La implementación completa se encuentra anexada al tutorial y se muestra el código para las operaciones de suma y resta, para cada botón numérico, para el botón igual y para el botón clear. Las operaciones de multiplicación y división son dejadas como trabajo personal para el lector.

Cristian Duran-Faundez 2013-07-23