Искусственное создание событий

   
На этом шаге рассмотрим возможность искусственного создания событий из самой программы.

   
Иногда возникает необходимость в событиях, созданных искусственно. Например, это полезно при отладке вашей программы, для того чтобы имитировать действия пользователя.

   
Для генерации события можно воспользоваться одним из двух статических методов класса 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);
}

   
Файлы приложения можно взять Предыдущий шаг
Содержание
Следующий шаг



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий