Translate

Mostrando las entradas con la etiqueta Qt. Mostrar todas las entradas
Mostrando las entradas con la etiqueta Qt. Mostrar todas las entradas

domingo, 11 de abril de 2021

QT 6 soporta C++ 17


The Qt Company ha liberado Qt 6.0, ya hace rato pero me acabo de enterar, si no lo conocen a qt salgan del termo, dado que no solo es la base tecnológica de KDE Plasma y LXQt, sino también de destacadas aplicaciones como VirtualBox, VLC, Shotcut y muchas otras.

Qt 6 ha llegado sobre todo con la intención de adaptar el framework a las tecnologías que han emergido o evolucionado en los últimos tiempos, manteniendo en el proceso sus principales virtudes, que son el desarrollo multiplataforma para escritorio, móviles y sistemas embebidos; la “escalabilidad desde dispositivos de un solo propósito y de gama baja hasta aplicaciones de escritorio complejas de gama alta”; sus API, herramientas y documentación; además de su mantenibilidad, estabilidad y compatibilidad para permitir a los usuarios “mantener grandes bases de código con un mínimo esfuerzo.”

La primera novedad que encontramos es el requerimiento de usar un compilador compatible C++ 17, la última versión del popular lenguaje de propósito general y orientado a objetos. La empresa ha intentado con este movimiento permitir el uso de construcciones de lenguaje C++ más modernas al desarrollar con Qt y puntos de integración en el lado de la API.

En lo que respecta a las bibliotecas principales y las API del framework, Qt 6 incorpora un nuevo sistema de propiedad y binding, mejoras en el soporte de Unicode, la unificación de ‘QList’ y ‘QVector’ en una misma clase y que ahora “‘QMetaType’ y ‘QVariant’ son fundamentales para el funcionamiento del sistema de metaobjetos de Qt”. También se han introducido una gran cantidad de cambios en componentes que no están relacionados con los gráficos, como el hecho de que Qt Concurrent haya “experimentado una reescritura casi completa para hacer que el desarrollo de las aplicaciones multiproceso sea más sencillo que nunca.”

La GPU ha ganado mucho protagonismo durante el transcurso de la última década (2011-2020), y obviamente Qt no iba a quedarse atrás en ese aspecto. Qt 5 se apoyó en su momento en OpenGL para dotarse de características de aceleración por hardware, pero surgió la necesidad de adaptarse mejor a las API propietarias de Microsoft y Apple: DirectX y Metal. En Qt 6 se ha introducido y habilitado por defecto Rendering Hardware Interface (RHI), que es una nueva capa de abstracción para gráficos 3D que se encarga de que Qt Quick se apoye en Direct3D en Windows y en Metal en macOS. Sobre Linux no se comenta de si esta característica ha llegado o no, o si se sigue apoyando en OpenGL o se ha iniciado la transición a Vulkan.

Qt Quick 3D es un módulo relativamente reciente con el que se ha pretendido ofrecer una API con soporte completo para la “creación de escenas complejas en 3D”, todo con la intención de que sea “tan fácil de usar como las partes existentes de Qt Quick” y permitir una integración perfecta entre los contenidos en 2D y en 3D. Qt Quick 3D ha sido mejorado en Qt 6 gracias a la introducción de RHI, la mejora de la integración de los contenidos en 2D y en 3D y la mejora del soporte para glTF2 y la renderización basada en físicas.



sábado, 21 de octubre de 2017

Juego de Serie en c++ con QT


Vamos a tomar el juego : http://emanuelpeg.blogspot.com.ar/2017/10/juego-de-serie-en-c.html y lo llevaremos a qt.

Para eso debemos hacer un nuevo proyecto qt y llevar nuestras clases. Y ahora vamos a programar las pantallas, Vamos a hacer una ventana que se llame MainWindows (original lo mio) :

MainWindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "juego.h"

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();


private slots:
    void on_pushButton_clicked();

private:
    Ui::MainWindow *ui;
    Juego juego;
    void dibujar();
};

#endif // MAINWINDOW_H

Como vemos hemos agregado una propiedad de tipo juego. Veamos el cpp : 

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>
#include <QString>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    this->dibujar();
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::dibujar() {
    ui->label->setText(QString::number(juego.getValor0()));
    ui->label_2->setText(QString::number(juego.getValor1()));
    ui->label_3->setText(QString::number(juego.getValor3()));
    ui->spinBox->setValue(0);
}

void MainWindow::on_pushButton_clicked()
{   QString msg;

    if (juego.validar(ui->spinBox->value())) {
        msg = "ganaste  Puntaje:"+ QString::number(juego.getPuntos());
    } else {
        msg = "perdio Puntaje:"+ QString::number(juego.getPuntos());
    }

    QMessageBox::warning(this, tr("Resultado"),
                                       msg,
                                       QMessageBox::Ok  ,
                                       QMessageBox::Ok);


    this->dibujar();
}

Ya se no se entiende bien por que falta el diseño de la pantalla : 

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>496</width>
    <height>105</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>Secuencia</string>
  </property>
  <widget class="QWidget" name="centralWidget">
   <layout class="QHBoxLayout" name="horizontalLayout">
    <item>
     <widget class="QLabel" name="label">
      <property name="text">
       <string>TextLabel</string>
      </property>
     </widget>
    </item>
    <item>
     <widget class="QLabel" name="label_2">
      <property name="text">
       <string>TextLabel</string>
      </property>
     </widget>
    </item>
    <item>
     <widget class="QSpinBox" name="spinBox">
      <property name="minimum">
       <number>-9999999</number>
      </property>
      <property name="maximum">
       <number>9999999</number>
      </property>
     </widget>
    </item>
    <item>
     <widget class="QLabel" name="label_3">
      <property name="text">
       <string>TextLabel</string>
      </property>
     </widget>
    </item>
    <item>
     <widget class="QPushButton" name="pushButton">
      <property name="text">
       <string>verificar</string>
      </property>
     </widget>
    </item>
   </layout>
  </widget>
  <widget class="QMenuBar" name="menuBar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>496</width>
     <height>25</height>
    </rect>
   </property>
  </widget>
  <widget class="QToolBar" name="mainToolBar">
   <attribute name="toolBarArea">
    <enum>TopToolBarArea</enum>
   </attribute>
   <attribute name="toolBarBreak">
    <bool>false</bool>
   </attribute>
  </widget>
  <widget class="QStatusBar" name="statusBar"/>
 </widget>
 <layoutdefault spacing="6" margin="11"/>
 <resources/>
 <connections/>
</ui>

Ahora si, como vemos agregamos unos labels que muestran los números y un spinBox que permite ingresar números. Y luego con un botón los validamos. 

Como se puede apreciar el diseño del juego permite generar una interfaz de consola o en qt o en otra tecnología esta es la mayor ventaja de separar nuestros objetos de la capa de presentación. 

lunes, 16 de marzo de 2015

Instalar QtCreator 5.4 en Windows

Primero vamos a descargar el software. Vamos a necesitar cmake y qt que se encuentran en las
siguientes URL:
http://www.cmake.org/files/v3.2/cmake-3.2.1-win32-x86.exe
http://download.qt-project.org/official_releases/qt/5.4/5.4.1/qt-opensource-windows-x86-mingw491
_opengl-5.4.1.exe

Un punto importante es descargar la versión que utiliza MinGW
Primero vamos a instalar cmake, es bastante fácil la instalación solo hay que recordar indicarle a
cmake que agregue a cmake en el PATH.








Luego vamos a instalar Qt, esta versión trae todo integrado, es decir que instalamos el sdk y el
entorno de desarrollo, todo en un solo instalador.



En esta pantalla se debe seleccionar MinGW









Y eso es todo ahora podemos utilizar qtCretor con CMake. 


lunes, 9 de marzo de 2015

Utilizar cin en una aplicación de consola ejecutada en QtCreator

Si hacemos una aplicación de consola en QtCreator vamos a tener problemas si esta aplicación utiliza el comando cin. Esto es porque hay un bug en la consola de QtCreator. Pero no hay problema lo que debemos hacer es indicarle a QtCreator que ejecute el programa en una consola aparte (no la integrada) para ello vamos a :


Lo que también puede pasar es que no encuentre la consola para cambiar la consola se debe ir a Tools->Options->Environment->General y en esta pantalla se puede cambiar la consola:



domingo, 8 de marzo de 2015

Ejecutar un programa de consola en modo Debug en QtCreator

Luego de crear el proyecto de consola. Podemos ejecutarlo en modo debug pero esto lanzara un error:


Esto sucede dado que Cmake no creo las carpetas de Debug. Tenemos que ejecutar a Cmake con el siguiente comando: -DCMAKE_BUILD_TYPE=Debug


Para hacer esto vamos al proyecto y haciendo menú contextual, seleccionamos “run Cmake”



Luego podemos ejecutar nuestro programa en modo debug.

Si queremos que se detenga en una linea determinada ponemos un breakpoint haciendo doble click en el panel que tiene el numero de lineas.   


domingo, 1 de marzo de 2015

Crear Proyecto de consola en Qt creator

Vamos hacer un proyecto de consola en Qt Creator.

Abrimos Qt creator y vamos a:

File → New File or Project

Y se mostrara la siguiente pantalla:



Elegir Non-Qt Project/Plain C++ Project. Luego se debe ingresar el nombre de la aplicación y donde se va a guardar. 


Luego se debe indicar, donde se van a generar los archivos de compilación.


Luego se debe indicar si se va utilizar algún software de control de versión. 


Luego se debe programar:


Para correr el software se debe utilizar el botón triangular verde:


Para correr el software en modo debug se debe utilizar el botón:


viernes, 26 de diciembre de 2014

Papa noel nos trajo a Qt 5.4


Si bien el release de Qt 5.4 es anterior a navidad no tuve tiempo de hacer el post que le correspondía.

Qt 5,4 viene con varias mejoras entre las que podemos nombrar, muchas mejoras en el área de tecnología web:

  • Qt WebEngine: basado en Chromium, los widgets pueden embeber HTML y renderizarlo
  • Qt WebChannel: Permite por ejemplo desarrollar clientes web que soporten comunicación WebSocket con el servidor. 
  • Qt WebView: Una API que permite embeber un browser en la aplicación de forma nativa.  

Además soporte completo para el runtime de windows lo que se conoce como "Qt for WinRT" esta integración es tanto para Windows phone como Windows 8.

Una nueva licencia! Qt ha decidido moverse a  LGPLv3 .

Nuevas funciones para manejo gráfico... Y más y más!!!

Y como si fuera poco ha anunciado Qt creator 3.3, que permitirá crear aplicaciones para Android y iOS.

Dejo link:
http://qt-project.org/wiki/Qt-5.4-release

jueves, 4 de diciembre de 2014

Primeros pasos en Qt: Creación de widgets customs

Los widgets customs o componentes visuales pueden ser creados a partir de un componente existente o simplemente extendiendo de QWidget.

En este post vamos a extender uno existente. Supongamos que debemos crear un QSpinBox que permita trabajar con hexadecimales:

#ifndef HEXSPINBOX_H
#define HEXSPINBOX_H
#include <QSpinBox>
class QRegExpValidator;
class HexSpinBox : public QSpinBox
{
Q_OBJECT
public:
HexSpinBox(QWidget *parent = 0);
protected:
QValidator::State validate(QString &text, int &pos) const;
int valueFromText(const QString &text) const;
QString textFromValue(int value) const;
private:
QRegExpValidator *validator;
};
#endif

HexSpinBox hereda la mayoría de los métodos, pero sobreescribe, los que necesita. A la vez sobreescribe el constructor:

#include <QtGui>
#include "hexspinbox.h"
HexSpinBox::HexSpinBox(QWidget *parent)
: QSpinBox(parent)
{
setRange(0, 255);
validator = new QRegExpValidator(QRegExp("[0-9A-Fa-f]{1,8}"), this);
}

Setamos el rango desde 0 a 255 es decir 0 a FF. También debemos modificar los botones de tal manera que cuando sea presionados permitan ir navegando entre los números en hexadecimales, es decir luego del 10 siga con A.

Para validar este componente usa el metodo validate que es llamado por  QSpinBox.

QValidator::State HexSpinBox::validate(QString &text, int &pos) const
{
return validator->validate(text, pos);
}

Validate solo utiliza la expresión regular para validar. Ahora debemos escribir los métodos que pasen nuestros números a String y viceversa.

QString HexSpinBox::textFromValue(int value) const
{
return QString::number(value, 16).toUpper();
}

QString HexSpinBox::textFromValue(int value) const
{
return QString::number(value, 16).toUpper();
}

Y eso es todo tenemos nuestro primer componente!

sábado, 25 de octubre de 2014

Primeros pasos en Qt: Emitir una señal

En los post anteriores estuvimos viendo el mecanismo de signals y slots que permitían manejar una señal emitida por un componente.

Además estuvimos haciendo una ventana de dialogo que permitía, para buscar un texto determinado. Este dialogo no puede hacer la acción porque no conoce el texto donde se debe realizar la búsqueda.

Resumiendo:

  • Tenemos 2 ventanas una con todo el texto donde se debe realizar la búsqueda y la otra que permite ingresar el texto a buscar. 
  • Por lo tanto la ventana main o padre debe realizar la búsqueda.
  • La ventana de dialog debe enviar una señal con el texto ingresado.
  • Esta señal va a ser procesada por la ventana main que realizará la búsqueda.
Vamos a conectar las ventana como dijimos:

connect(ventanaBusqueda, SIGNAL(aceptar(QString)), this, SLOT(busqueda(QString));

En la ventana padre debemos conectar nuestra ventana de búsqueda con el proceso de búsqueda. Noten el detalle de que indicamos el tipo de parámetro de las funciones.

Si probamos esto no va a suceder nada porque nuestra pantalla de dialog no emite la señal, veamos como podemos hacer esto:

emit aceptar(text)

En el botón del dialog debemos emitir la señal. Con emit emitimos una señal, en este caso emitimos la señal aceptar y le pasamos un testo como parámetro.

Dejo link:
http://qt-project.org/doc/qt-4.8/signalsandslots.html


domingo, 21 de septiembre de 2014

Primeros pasos en Qt: Qt Designer


Qt designer es una herramienta pensada para el diseño de interfaces de forma cómoda y fácil.

Una de las ventajas de la utilización de Qt Designer es que permite a los programadores una gran libertad para modificar sus diseños sin ser forzados a cambiar su código fuente. Al desarrollar escribiendo solo código C++, los cambios en el diseño pueden llevar mucho tiempo. Con Qt Designer, no se pierde tiempo, simplemente regenera el código fuente que ha cambiado.
Las Interfaz de usuario (ventanas) se guarda en un archivo .ui (un formato de archivo basado en XML), mientras que la funcionalidad personalizada se implementa mediante subclases.

Supongamos que debamos acceder a cualquier componente que hemos diseñado desde el diseñar. Debemos llamarlos desde un objeto generado, que se construye en el constructor y es de igual tipo que la ventana, no estoy siendo muy claro, veamos un poco de código para expresarme mejor:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{
    ui->pushButton->setText("Chau!!");
}

En el ejemplo para acceder a pushButton tuvimos que utilizar el objeto ui que es la ventana.


domingo, 14 de septiembre de 2014

Primeros pasos en Qt: Signals y Slots a fondo

El mecanismo de signals y slots es fundamental para qt. Los Slots son muy similares a las funciones comunes, pueden ser virtuales, sobrecargados, privados, protegidos y públicos. Además pueden ser invocados como cualquier otra función de c++ y sus parámetros pueden ser de cualquier tipo. La diferencia con las funciones es que los Slots pueden ser invocados automáticamente desde una señal.

La conexión entre signal y slot es así:

connect(sender, SIGNAL(signal), receiver, SLOT(slot));

Donde sender y receiver son objetos de tipo QObjects, además signal y slot se pasan como parámetro sin parámetros, solo el nombre de la función.

Una signal puede llamar a diferentes slots y un slot puede ser llamado por diferentes funciones. Veamos unos ejemplos:

Una signal puede llamar a diferentes slots:

connect(slider, SIGNAL(valueChanged(int)), spinBox, SLOT(setValue(int)));
connect(slider, SIGNAL(valueChanged(int)), this, SLOT(updateStatusBarIndicator(int)));

Un slot es llamado por diferentes signal: 
connect(lcd, SIGNAL(overflow()), this, SLOT(handleMathError()));
connect(calculator, SIGNAL(divisionByZero()), this, SLOT(handleMathError()));

Una signal puede conectar otra signal:
connect(lineEdit, SIGNAL(textChanged(const QString &)), this, SIGNAL(updateRecord(const QString &)));
Cuando la primera señal es emitida, la segunda es emitida.

Una conexión puede ser removida: 
disconnect(lcd, SIGNAL(overflow()), this, SLOT(handleMathError()));

Algo muy importante es que la signal y el slot o signal a la que es conectada debe tener la misma cantidad de parámetros y del mismo tipo. Si el slot o signal a la que es conectada tiene más parámetros, simplemente sera ignorados. Si los parámetros son de diferente tipo qt lanzara una advertencia cuando se compila y un error en tiempo de ejecución.

El mecanismo de signals y slots, no esta limitado a el diseño de interfaces de usuarios, también se puede usar en el modelado heredando de QObject.

sábado, 6 de septiembre de 2014

Primeros pasos en Qt: Creación de diálogos

Ahora vamos a ver como crear ventanas de diálogos con Qt. En este ejemplo vamos a programar una ventana de búsqueda. Las ventanas de diálogos le permiten al usuario definir una configuración o definir una acción. Además crearemos este dialogo de dos formas diferentes, una con solo código y la otra utilizando en diseñador de interfaces de Qt.

El código fuente se encontrará en 2 archivos finddialog.h y finddialog.cpp. Veamos finddialog.h:

#ifndef FINDDIALOG_H
#define FINDDIALOG_H
#include <QDialog>
class QCheckBox;
class QLabel;
class QLineEdit;
class QPushButton;

En la primera parte incluimos QDialog, clase que vamos a extender y definimos los componentes que vamos a utilizar.

class FindDialog : public QDialog
{
Q_OBJECT
public:
FindDialog(QWidget *parent = 0);

Q_OBJECT es una macro que es necesario agregar para que Qt incluya nuestro componente y nos permita utilizar SIGNAL y SLOT. Además extendemos de QDialog que a la vez extiende de QWidget. También definimos un constructor que permite asignar un componente contenedor, por defecto este puntero es nulo.

signals:
void findNext(const QString &str, Qt::CaseSensitivity cs);
void findPrevious(const QString &str, Qt::CaseSensitivity cs);

Con la palabra clave signals indicamos las señales de nuestro componente, en este caso definimos dos. Estas señales van a ser emitidas cuando el usuario presione el botón de buscar.

La palabra clave signals, también es una macro. El compilador en la etapa de preprocesamiento utiliza estas palabras claves para introducir código y transforma nuestro código en C++ estándar, aumentando nuestra producción y ahorrándonos escribir código repetitivo.

private slots:
void findClicked();
void enableFindButton(const QString &text);

private:
QLabel *label;
QLineEdit *lineEdit;
QCheckBox *caseCheckBox;
QCheckBox *backwardCheckBox;
QPushButton *findButton;
QPushButton *closeButton;
};

#endif

En la sección private slot declaramos 2 slots. Para implementar estos slots es necesario acceder a los componentes que son contenidos por el dialogo, por lo que debemos mantener punteros a los mismos. Slot es una palabra clave similar a signal y que es una extensión del lenguaje a través de macros.

Ahora vamos a ver finddialog.cpp:

#include <QtGui>
#include "finddialog.h"

Primero, nosotros incluimos <QtGui> este archivo es un archivo de cabecera que contiene todas las definiciones de los componentes visuales de Qt. Qt esta formado por diferentes módulos, los módulos más importantes son: QtCore, QtGui, QtNetwork, QtOpenGL, QtSql, QtSvg y QtXml. El archivo <QtGui> contiene las definiciones de los módulos QtCore y QtGui.

En el archivo de cabecera finddialog.h solo incluimos <QDialog> y luego utilizamos declaraciones de QCheckBox, QLabel, QLineEdit y QPushButton, tal vez simplemente podríamos haber incluido <QtGui>. Sin embargo, en general no es buena práctica incluir un archivo de cabecera tan grande de otro archivo de cabecera.

FindDialog::FindDialog(QWidget *parent) : QDialog(parent)
{
label = new QLabel(tr("Find &what:"));
lineEdit = new QLineEdit;
label->setBuddy(lineEdit);
caseCheckBox = new QCheckBox(tr("Match &case"));
backwardCheckBox = new QCheckBox(tr("Search &backward"));
findButton = new QPushButton(tr("&Find"));
findButton->setDefault(true);
findButton->setEnabled(false);
closeButton = new QPushButton(tr("Close"));

En el constructor nos encargamos de crear los diferentes componentes. La función tr es una función que esta declarada en QObject y se utiliza para que la aplicación se pueda traducir fácilmente. Con '&’ indicamos el shortcut que permite lanzar la funcionalidad. Por ultimo indicamos el botón por defecto, es la acción que se va a llamar si se presiona enter.

Luego, conectamos los eventos o señales con funcionalidad que debe ejecutarse:

connect(lineEdit, SIGNAL(textChanged(const QString &)), this, SLOT(enableFindButton(const QString &)));
connect(findButton, SIGNAL(clicked()), this, SLOT(findClicked()));
connect(closeButton, SIGNAL(clicked()), this, SLOT(close()));

Como se puede ver si cambia el texto de lineEdit se ejecutara la función enableFindButton, y a la vez si se ejecuta clicked de findButton y closeButton se ejecutara la función asignada. Dado que nuestro dialogo de busqueda es un QObject, no necesitamos llamar a la función connect con el prefijo QObject:: por ultimo organizamos la aplicación con layouts y agregamos el titulo de nuestra ventana:

QHBoxLayout *topLeftLayout = new QHBoxLayout;
topLeftLayout->addWidget(label);
topLeftLayout->addWidget(lineEdit);

QVBoxLayout *leftLayout = new QVBoxLayout;
leftLayout->addLayout(topLeftLayout);
leftLayout->addWidget(caseCheckBox);
leftLayout->addWidget(backwardCheckBox);

QVBoxLayout *rightLayout = new QVBoxLayout;
rightLayout->addWidget(findButton);
rightLayout->addWidget(closeButton);
rightLayout->addStretch();

QHBoxLayout *mainLayout = new QHBoxLayout;
mainLayout->addLayout(leftLayout);
mainLayout->addLayout(rightLayout);
setLayout(mainLayout);
setWindowTitle(tr("Find"));
setFixedHeight(sizeHint().height());
}

Ahora debemos programar las señales:

void FindDialog::findClicked()
{
QString text = lineEdit->text();
Qt::CaseSensitivity cs =
caseCheckBox->isChecked() ? Qt::CaseSensitive : Qt::CaseInsensitive;
if (backwardCheckBox->isChecked()) {
    emit findPrevious(text, cs);
} else {
    emit findNext(text, cs);
}
}

void FindDialog::enableFindButton(const QString &text)
{
findButton->setEnabled(!text.isEmpty());
}

findClicked() es un Slot que se llama cuando presionamos el botón findButton y este método llama a la función  findPrevious o findNext dependiendo si backwardCheckBox fue checkeado. La palabra clave emit no es estándar de C++, es utilizada por Qt y por macros se transforma a C++ estándar.  Con emit se lanzaran las señales  findNext o  findPrevious.

enableFindButton() es llamado cuando se cambia el texto cambia y activa el botón findButton.

Veamos main.cpp:

#include <QApplication>
#include "finddialog.h"

int main(int argc, char *argv[])
{
QApplication app(argc, argv);
FindDialog *dialog = new FindDialog;
dialog->show();
return app.exec();
}

Si probamos nuestra ventana de dialogo, vamos a ver que no busca en ningún lado y eso porque solo lanza las señales  findPrevious y findNext pero ningún objeto intercepta estas señales y hace algo con ellas. Más adelante vamos a utilizar este dialogo...


domingo, 31 de agosto de 2014

Primeros pasos en Qt: Layouts


Ahora vamos a hacer un ejemplo que nos permita utilizar en más profundidad las señales y vamos a introducirnos en el uso de layout.

La aplicación consiste en 3 widget un QSpinBox, un QSlider y un QWidget.  Qwidget va a ser la ventana de la aplicación. Como es de esperar QSpinBox y QSlider  se van a dibujar dentro de QWidget. Por lo tanto podemos afirmar que  QWidget es contenedor de  QSpinBox y QSlider. Veamos el código:

#include <QApplication>
#include <QHBoxLayout>
#include <QSlider>
#include <QSpinBox>

int main(int argc, char *argv[])
{
  QApplication app(argc, argv);
  QWidget *window = new QWidget;
  window->setWindowTitle("Enter Your Age");
  QSpinBox *spinBox = new QSpinBox;
  QSlider *slider = new QSlider(Qt::Horizontal);
  spinBox->setRange(0, 130);
  slider->setRange(0, 130);
 
  QObject::connect(spinBox, SIGNAL(valueChanged(int)), slider, SLOT(setValue(int)));
  QObject::connect(slider, SIGNAL(valueChanged(int)), spinBox, SLOT(setValue(int)));
 
  spinBox->setValue(35);
 
  QHBoxLayout *layout = new QHBoxLayout;
  layout->addWidget(spinBox);
  layout->addWidget(slider);
  window->setLayout(layout);

  window->show();
  return app.exec();
}

Luego de crear la ventana se puede ver que se puede establecer el texto de la barra de titulo. Después creamos los dos componentes QSpinBox y QSpinBox y configuramos el rango de 0 a 130. Además indicamos a Qt que si spinBox lanza la señal valueChanged (que indica que el valor del componente ha cambiado) ejecute la función setValue de slider.

QHBoxLayout es un layout, los layouts nos permiten configurar fácilmente la disposición de los componentes en una ventana. QHBoxLayout es un layout que organiza los componentes de forma horizontal. Agregamos  QSpinBox y QspinBox al layout y luego agregamos el layout a la ventana para que se muestre.

Qt nos brinda 3 grandes tipos de layouts:

  • QHBoxLayout que permite organizar los componentes de forma horizontal y de izquierda a derecha.
  • QVBoxLayout que permite organizar los componentes de forma vertical y de arriba a abajo.
  • QGridLayout organiza los componentes como una grilla. 


Con el método setLayout indicamos el layout a la ventana. Como se deben imaginar es posible indicar un árbol de componentes y de esta forma una ventana puede tener diferentes layouts.

Primeros pasos en Qt

Vamos a empezar con un programa de Qt muy simple. Primero estudiaremos línea por línea.

#include <QApplication>
#include <QLabel>

int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QLabel *label = new QLabel("Hello Qt!");
label->show();
return app.exec();
}

En la linea 1 y 2 incluimos las clases QAplication y Qlabel. En QT todas las clases comienzan con la letra Q en mayúscula.   En la linea 5 creamos la aplicación qt y le pasamos como parámetro, los parámetros de main dado que la aplicación se puede ejecutar desde la linea de comandos con algún parámetro.

En la linea 6 se crea el widget QLabel el cual muestra “Hello Qt!”, los widget en la terminología Qt y unix son elementos visuales. Un botón, menú, scroll son ejemplos de widget. Además un widget puede contener a otro widget.

En la linea 7 se hace visible el componente, dado que todos los componentes nacen invisibles.

Línea 8 pasa el control de la aplicación a Qt. En este punto, el programa entra en el bucle de eventos. Esta es una especie de modo de espera, donde el programa espera de las acciones del usuario tales como clics del ratón y las pulsaciones de teclas. Las acciones del usuario generan eventos (también llamados "mensajes") a los que el programa puede responder, por lo general se ejecutan una o más funciones.

Si ejecutamos la aplicación, se vera un label con la fase “Hello Qt!". Podemos escribir HTML en el label para eso vamos a cambiar la linea 6 por:

QLabel *label = new QLabel("<h2><i>Hello</i><font color=red>Qt!</font></h2>");

El label tomara el estilo igual que html.

Vamos a agregar un botón para salir de la aplicación:

#include <QApplication>
#include <QPushButton>

int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QPushButton *button = new QPushButton("Quit");
QObject::connect(button, SIGNAL(clicked()),
&app, SLOT(quit()));
button->show();
return app.exec();
}

En este ejemplo agregamos un botón el cual emite la señal clicked cuando el usuario hace click en el componente.

Los widgets de Qt emiten señales para indicar que se ha producido una acción del usuario o de un cambio de estado. Por ejemplo, QPushButton emite una señal clicked() cuando el usuario hace clic en el botón. Una señal se puede conectar a una función (utilizando la función SLOT), de modo que cuando se emite la señal, la función se ejecuta automáticamente.


martes, 22 de julio de 2014

Programación con Qt4

Por motivos personales decidí aprender un poco más de qt plataforma que siempre me gusto pero nunca le pude dedicar tiempo. Estuve buscando algunos libros y me encontre con estos:
  • Advanced Qt Programming Creating Great Software with C++ and Qt 4 
  • An Introduction to Design Patterns in C++ with Qt 
  • C++ GUI Programming with Qt 4 
  • Foundations of Qt Development 
Les dejo el link:

lunes, 14 de enero de 2013

La resurrección de Qt


Qt es el corazón del entorno de escritorio KDE; Qt tuvo mucha mala suerte comercialmente. Pero técnicamente fue creciendo; la gente la creía muerta pero Qt nunca murió y ha estado muy presente en muchas de las aplicaciones que usamos normalmente como Skype, Google Earth, VLC…

Qt nos trae una nueva versión que tienen muchas novedades. Tenemos un aumento del rendimiento y un mejor aprovechamiento del hardware, soporte para C++ 11, HTML5 a través de QtWebKit 2, un aumento en el número de APIs que ayudarán al desarrollo, retrocompatibilidad con Qt 4 y sobre todo una fácil portabilidad entre plataformas.

Qt es una gran Api con una gran potencia, esperemos que el mercado retome su uso, y Qt vuelva con todo!!

Dejo un vídeo:




Dejo link: