¡Esta es una revisión vieja del documento!
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.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:
QObject, clase base para los objetos Qt.Q_OBJECT que se añade a la clase y activa las propiedades de los meta-objetos en dicha clase.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.
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.signals o slots puede que al compilar hayan errores. Para evitarlos se ha de utilizar el símbolo de preprocesador #undef.
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:
QWidget *parent, el widget padre, si es 0 (por defecto) el widget será una ventana.Qt::WindowFlags f, las flagas correspondientes a la ventana creada.
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.
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; }
QHBoxLayout y QVBoxLayout, para colocar los controles uno al lado del otro en horizontal y en vertical respectivamente.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:
updateGL().makeCurrent().
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();
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();
closeAllWindows() de la aplicación.
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); }
Para añadir librerías lo haremos desde el archivo .pro agregando (este ejemplo utiliza GLUT):
LIBS += -lglut -lGL -lGLU
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!")); }