Herramientas de usuario

Herramientas del sitio


fw:qt4

¡Esta es una revisión vieja del documento!


Qt4

Conceptos

Clases importantes

  • QApplication, es la clase que gestiona el bucle principal de una aplicación con GUI y todo lo que lo envuelve (inicialización de la aplicación, finalización, sesión…).
  • QCoreApplication, es la clase que gestiona una aplicación Qt sin GUI.

QStrings

Para trabajar con strings, si queremos mostrarlos por consola haremos (el segundo necesita incluir QTextStream):

std::cout << qPrintable(d.getValue()) << std::endl;
QTextStream(stdout) << d.getValue();

El sistema de meta-objetos

Es el procedimiento que Qt tiene de trabajar. Es el que añade al sistema de C++ la capacidad de utilizar signals y slots, información en tiempo de ejecución y propiedades dinámicas. En el entran en juego los siguientes elementos:

  • Clase QObject, clase base para los objetos Qt.
  • Macro Q_OBJECT que se añade a la clase y activa las propiedades de los meta-objetos en dicha clase.
  • El moc (compilador de meta-objetos).

El moc lee los ficheros C++ y para las declaraciones Q_OBJECT produce archivos C++ que serán los que se acabarán siendo compilados por el compilador.

El moc

QObject

Métodos de un QObject:

  • metaObject() retorna el meta-objeto asociado.
  • className() retorna un string con el nombre de la clase en tiempo de ejecución.
  • inherits() función que retorna si un QObject es una instancia de una clase dentro del árbol de herencia.
  • tr() y trUtf8() para traducir strings en utf8.
  • setProperty() y getProperty() para dar valores a propiedades a partir de su nombre.
  • newInstance() construye una nueva instancia de la clase.

Problemas con los que te puedes encontrar

  • Si hay errores de referencias no definicas al compilar es posible que no se esté utilizando correctamente el moc.
  • Si otras librerías implementan varialbes llamadas signals o slots puede que al compilar hayan errores. Para evitarlos se ha de utilizar el símbolo de preprocesador #undef.

Signals y Slots

Componentes

QWidget

Es la clase base para todos los objetos GUI. Recibe los eventos (ratón, teclado…) de la ventana y se pinta a sí mismo en la pantalla.
Todo widget es rectangular y se ordena en Z-order en la ventana donde es colocado. Si no se coloca en ninguna ventana entonces él mismo será la ventana. Las ventanas tienen un frame y una barra de título (aunque se pueden crear sin ellos). En Qt las clases especiales para crear ventanas son QMainWindow y QDialog.
El constructor acepta los siguientes argumentos:

  1. QWidget *parent, el widget padre, si es 0 (por defecto) el widget será una ventana.
  2. Qt::WindowFlags f, las flagas correspondientes a la ventana creada.

QMainWindow

Es la ventana para la aplicación principal. Tendrá la siguiente estructura (requerirá siempre deun widget central):

Es decir, si queremos añadirle un layout lo que tendremos que hacer es añadir un widget y a este el layout.

QDialog

Es la base clase para crear ventanas de diálogo. Estas son utilizadas para que el usuario realice pequeñas tareas. Pueden ser modales o no, devolver un valor y tener botones por defecto.

Para crear un menú dentro de una QMainWindow lo que haremos será llamar a menuBar()→addMenu() que devolverá un objeto QMenu al cual podremos añadir objetos QAction (acciones dentro del programa que se pueden enlazar a menús, atajos de teclado…).

Siendo openDialog y exitAct objetos QAction dentro de la clase, fileMenu un objeto QMenu, y createDialog un slot público dentro de esta también.

void MainWindow::createActions() {
    openDialog = new QAction("Hola", this);
    connect(openDialog, SIGNAL(triggered()), this, SLOT(createDialog()));
    exitAct = new QAction ("Exit", this);
    connect(exitAct, SIGNAL(triggered()), qApp, SLOT(closeAllWindows()));
}
 
void MainWindow::createMenus() {
    fileMenu = menuBar()->addMenu("File");
    fileMenu->addSeparator();
    fileMenu->addAction(openDialog);
    fileMenu->addAction(exitAct);
}
 
void MainWindow::createDialog() {
    std::cout << "abre!" << std::endl;
}

Layouts

  • QHBoxLayout y QVBoxLayout, para colocar los controles uno al lado del otro en horizontal y en vertical respectivamente.

Componentes para tratar con OpenGL

QGLWidget

Un objeto QGLWidget es un widget para renderizar gráficos OpenGL en aplicaciones Qt. Se hereda de él y se usa la subclase como cualquier QWidget. Las funciones para reescribir son:

  • paintGL(), que renderiza la escena OpenGL y se llama siempre que el widget necesita ser actualizado.
  • resizeGL(), para configurar el viewport, la proyección… Se llama cada vez que el widget ha cambiado de tamaño.
  • initializeGL(), para inicializar el contexto de OpenGL.

Cómo hacer otras funciones con él:

  • Si necesitas lanzar un repintado has de llamar a updateGL().
  • Si necesitas llamar a funciones OpenGL desde otros lugares (p.ej. el constructor), antes se ha de hacer una llamada a makeCurrent().

QGLShaderProgram y QGLShader

QGLShader es la clase que recoge código GLSL para ser compilado y QGLShaderProgram se encarga de realizar dicha compilación de los diferentes shaders pasados.
Debemos indicar en el constructor QGLShader qué tipo de shader es (QGLShader::Vertex o QGLShader::Fragment).
Para posteriormente pasar valores a los atributos de input a los shaders debemos usar el método bindAttributeLocation pasándole el nombre de este y su posición (antes de linkar el programa). Si no se enlazasen las posiciones entonces serían cogidas automáticamente. Para lincar el programa se utiliza link() y luego, para enlazarlo al contexto actual, bind().

QGLShader *vshader = new QGLShader(QGLShader::Vertex, this);
QGLShader *fshader = new QGLShader(QGLShader::Fragment, this);
 
// Se lee el contenido de dos ficheros de código glsl y se vuelcan sobre shader_source
 
vshader->compileSourceCode(shader_source[0].source);
fshader->compileSourceCode(shader_source[1].source);
QGLShaderProgram *program = new QGLShaderProgram(this);
program->addShader(vshader);
program->addShader(fshader);
 
program->bindAttributeLocation("vPosition", PROGRAM_VERTEX_ATTRIBUTE);
program->bindAttributeLocation("vColor", PROGRAM_COLOR_ATTRIBUTE);
program->link();
 
program->bind();

Otros

QTimer

Para utilizarlo has de incluir QTimer.
Su uso es algo así:

QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(processOneThing()));
timer->start();

Cómo...

  • Cerrar la aplicación? Llamando al método closeAllWindows() de la aplicación.

... Gestionar los eventos de ratón\teclado en un widget?

Sobreescribiendo los métodos mousePressEvent, mouseMoveEvent, keyPressEvent
Aquí algunos ejemplos:

void Window::keyPressEvent(QKeyEvent *e) {
    if (e->key() == Qt::Key_Escape)
        close();
    else
        QWidget::keyPressEvent(e);
}

Herramientas

  • qtdemo: Ejemplos de código fuente de la SDK.
  • qtconfig: Configura el aspecto y el comportamiento de las interficies creadas con Qt en esa máquina.

QtCreator

Cómo...

... Configurar un proyecto C++ simple, sin utilizar Qt?

Para añadir librerías lo haremos desde el archivo .pro agregando (este ejemplo utiliza GLUT):

LIBS += -lglut -lGL -lGLU

Notas

  • qobject_cast() permite realizar un cast dinámico de un objeto. Retorna puntero nulo si el cast es incompatible o un puntero al objeto si es compatible.
if (QLabel *label = qobject_cast<QLabel *>(obj)) {
   label->setText(tr("Ping"));
} else if (QPushButton *button = qobject_cast<QPushButton *>(obj)) {
   button->setText(tr("Pong!"));
}
fw/qt4.1361883423.txt.gz · Última modificación: 2020/05/09 09:24 (editor externo)