Capítulo 4: Reproducción de eventos GUI
En este capítulo, mostraremos cómo simular un evento GUI, y cómo almacenar una serie de eventos GUI así como reproducirlos en un widget.
El enfoque para almacenar una serie de eventos y reproducirlos es bastante similar al enfoque explicado en el capítulo 2. Todo lo que necesitas hacer es añadir una función de datos a tu clase de prueba:
class TestGui: public QObject { Q_OBJECT private slots: void testGui_data(); void testGui(); };
Escribir la función de datos
Como antes, la función de datos asociada a una función de prueba lleva el mismo nombre, añadido por _data.
void TestGui::testGui_data() { QTest::addColumn<QTestEventList>("events"); QTest::addColumn<QString>("expected"); QTestEventList list1; list1.addKeyClick('a'); QTest::newRow("char") << list1 << "a"; QTestEventList list2; list2.addKeyClick('a'); list2.addKeyClick(Qt::Key_Backspace); QTest::newRow("there+back-again") << list2 << ""; }
En primer lugar, definimos los elementos de la tabla utilizando la función QTest::addColumn(): Una lista de eventos GUI, y el resultado esperado de aplicar la lista de eventos en un QWidget. Observe que el tipo del primer elemento es QTestEventList.
Un QTestEventList puede poblarse con eventos GUI que pueden almacenarse como datos de prueba para su uso posterior, o reproducirse en cualquier QWidget.
En nuestra función de datos actual, creamos dos elementos QTestEventList. La primera lista consiste en un solo clic a la tecla 'a'. Añadimos el evento a la lista utilizando la función QTestEventList::addKeyClick(). A continuación, utilizamos la función QTest::newRow() para dar un nombre al conjunto de datos, y transmitimos la lista de eventos y el resultado esperado a la tabla.
La segunda lista consta de dos pulsaciones de teclas: una 'a' con un 'retroceso' a continuación. De nuevo utilizamos QTestEventList::addKeyClick() para añadir los eventos a la lista, y QTest::newRow() para poner la lista de eventos y el resultado esperado en la tabla con un nombre asociado.
Reescribir la función de prueba
Ahora podemos reescribir nuestra prueba:
void TestGui::testGui() { QFETCH(QTestEventList, events); QFETCH(QString, expected); QLineEdit lineEdit; events.simulate(&lineEdit); QCOMPARE(lineEdit.text(), expected); }
La función TestGui::testGui() se ejecutará dos veces, una por cada entrada en los datos de prueba que creamos en la función TestGui::testGui_data() asociada.
En primer lugar, obtendremos los dos elementos del conjunto de datos utilizando la macro QFETCH(). QFETCH() toma dos argumentos: el tipo de datos del elemento y el nombre del elemento. A continuación, creamos un widget QLineEdit y aplicamos la lista de eventos a ese widget mediante la función QTestEventList::simulate().
Por último, utilizamos la macro QCOMPARE() para comprobar si el texto de la edición de línea es el esperado.
Preparación del ejecutable independiente
Como antes, para hacer de nuestro caso de prueba un ejecutable autónomo, se necesitan las dos líneas siguientes:
QTEST_MAIN(TestGui)
#include "testgui.moc"La macro QTEST_MAIN() se expande a un simple método main() que ejecuta todas las funciones de prueba, y dado que tanto la declaración como la implementación de nuestra clase de prueba están en un archivo .cpp, también necesitamos incluir el archivo moc generado para que funcione la introspección de Qt.
Construir el ejecutable
Puedes construir el ejecutable del caso de prueba usando CMake o qmake.
Construir con CMake
Configura los parámetros de compilación en tu archivo CMakeLists.txt:
# Copyright (C) 2022 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
cmake_minimum_required(VERSION 3.16)
project(tutorial4 LANGUAGES CXX)
find_package(Qt6 REQUIRED COMPONENTS Core Gui Test Widgets)
qt_standard_project_setup()
qt_add_executable(tutorial4
testgui.cpp
)
set_target_properties(tutorial4 PROPERTIES
WIN32_EXECUTABLE TRUE
MACOSX_BUNDLE TRUE
)
target_link_libraries(tutorial4 PRIVATE
Qt6::Core
Qt6::Gui
Qt6::Test
Qt6::Widgets
)
install(TARGETS tutorial4
BUNDLE DESTINATION .
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
)
qt_generate_deploy_app_script(
TARGET tutorial4
OUTPUT_SCRIPT deploy_script
NO_UNSUPPORTED_PLATFORM_ERROR
)
install(SCRIPT ${deploy_script})A continuación, desde la línea de comandos, ejecute cmake o utilice el script de conveniencia qt-cmake ubicado en Qt-prefix/<version>/<platform>/bin/qt-cmake:
<Qt-prefix>/<version>/<platform>/bin/qt-cmake <source-dir> <build-dir> -G Ninja
A continuación, ejecute su herramienta generadora preferida para construir el ejecutable. Aquí, estamos usando Ninja:
ninja
Compilación con qmake
Configura los parámetros de compilación en tu archivo .pro:
QT += widgets testlib SOURCES = testgui.cpp # install target.path = $$[QT_INSTALL_EXAMPLES]/qtestlib/tutorial4 INSTALLS += target
A continuación, ejecuta qmake y, por último, ejecuta make para crear el ejecutable:
qmake make
Ejecutar el ejecutable
Ejecutando el ejecutable resultante debería obtener la siguiente salida:
********* Start testing of TestGui ********* Config: Using QtTest library %VERSION%, Qt %VERSION% PASS : TestGui::initTestCase() PASS : TestGui::testGui(char) PASS : TestGui::testGui(there+back-again) PASS : TestGui::cleanupTestCase() Totals: 4 passed, 0 failed, 0 skipped, 0 blacklisted, 18ms ********* Finished testing of TestGui *********
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.