На этом шаге рассмотрим возможность искусственного создания событий из самой программы.
Иногда возникает необходимость в событиях, созданных искусственно. Например, это полезно при отладке вашей программы, для того чтобы имитировать действия пользователя.
Для генерации события можно воспользоваться одним из двух статических методов класса QCoreApplication — sendEvent() или postEvent(). Оба метода получают в качестве параметров указатель на объект, которому посылается событие, и адрес объекта события. Разница между ними состоит в том, что метод sendEvent() отправляет событие без задержек, т. е. его вызов приводит к немедленному вызову метода события, в то время как метод postEvent() помещает его в очередь для дальнейшей обработки.
Рассмотрим это на примере приложения, имитирующего нажатие пользователем клавиш от <0> до <9> (рис. 1).
Рис.1. Программа, демонстрирующая подмену события клавиатуры
Приведем содержимое файла приложения, имитирующего события клавиатуры.
QApplication app (argc, argv); app.setApplicationDisplayName("Имитация"); //Создается объект txt класса QLineEdit, //который будет выступать в качестве поля ввода QLineEdit txt("Пользователь ввел: "); txt.show(); txt.resize(280, 20); int i; for (i = 0; i < Qt::Key_9 - Qt::Key_0 + 1; ++i) { QChar ch = 48 + i; int nKey = Qt::Key_0 + i; //В цикле происходит создание событий типа QKeyEvent. //Первый параметр, передаваемый конструктору, задает тип события клавиатуры //(здесь он соответствует событию нажатия клавиши клавиатуры QEvent::KeyPress). //Второй параметр задает саму нажатую клавишу. //Третий — указывает на клавиши-модификаторы, которые могли быть совместно //нажаты, в нашем случае это значение равно Qt::NoModifier и означает, //что никаких клавиш-модификаторов нажато не было. //Четвертый параметр указывает на представление клавиши в ASCII-коде //(в примере это число начинается с 48, что соответствует цифре "0", //и циклически увеличивается на единицу) QKeyEvent* pePress = new QKeyEvent(QEvent::KeyPress, nKey, Qt::NoModifier, ch); QApplication::sendEvent(&txt, pePress); //Если хотим имитировать клавиатуру, то после каждого события KeyPress //должно следовать событие KeyRelease (событие отпускания клавиши клавиатуры) //в противном случае много виджетов, которым будет послано только одно событие //нажатия, будут вести себя неправильно, например в QLineEdit //перестает мигать курсор ввода QKeyEvent* peRelease = new QKeyEvent(QEvent::KeyRelease, nKey, Qt::NoModifier, ch); QApplication::sendEvent(&txt, peRelease); }
Файлы приложения можно взять Предыдущий шаг
Содержание
Следующий шаг