A Qt keretrendszerben az eseményeket többféleképpen lehet kezelni és szűrni az alkalmazás igényeinek megfelelően (dokumentáció itt). A leggyakrabban használt módja az eseménykezelők használata, amelyek segítségével a Qt alkalmazások reagálhatnak a felhasználói interakciókra és más eseményekre.
Minden QObject
leszármazottban (például a QWidget
, vagy annak további leszármazottjában: MyWidget
) van lehetőség új, illetve az örökölt eseménykezelők definiálására. Ezek a függvények kezelik az eseményeket, amelyeket az adott objektum kap meg. Például:
class MyWidget : public QWidget {
protected:
void keyPressEvent(QKeyEvent *event) override {
if (event->key() == Qt::Key_Escape) {
// Ha a felhasználó ESC-et nyomott
event->accept(); // Azt mondjuk, hogy lekezeltük az eseményt és nem propagáljuk tovább
} else {
QWidget::keyPressEvent(event); // Hívjuk meg az ős osztályt az alapértelmezett viselkedésért
}
}
};
Az események szűrésének egy másik módja, amely lehetővé teszi az események globális szintű figyelését: egy központi helyen, például egy esemény szűrő objektumban, figyeljük az összes eseményt, amelyet az alkalmazásban lévő objektumok fogadnak. Például a párbeszédablakokba beírt input esetén szeretnénk kiszűrni bizonyos gombnyomásokat (számokat, betűket, speciális billentyűket stb.). Ehhez létre kell hozni egy saját QObject
-ből származott osztályt, és felül kell írni az QObject::eventFilter(QObject *object, QEvent *event)
metódust:
class MyFilterObject : public QObject {
Q_OBJECT
protected:
bool eventFilter(QObject *obj, QEvent *event) override {
if (event->type() == QEvent::KeyPress) {
QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);
if (keyEvent->key() == Qt::Key_Escape) {
// Ha a felhasználó ESC-et nyomott
return true; // Azt mondjuk, hogy lekezeltük az eseményt
}
}
return QObject::eventFilter(obj, event); // Átadás az alapértelmezett eseménykezelésnek
}
};
A szűrőt a QObject::installEventFilter(QObject *filterObj)
függvénnyel lehet feliratkoztatni:
MyFilterObject *myFilter = new MyFilterObject;
QLineEdit *phoneEdit = new QLineEdit;
phoneEdit->installEventFilter(myFilter);
Az eseményszűrő az eseményeket még a célobjektum előtt feldolgozza, lehetővé téve az események ellenőrzését és szükség szerinti elvetését (amennyiben a függvény visszatérítési értéke true
, magyarán az eseményt feldolgoztuk, nem szükséges továbbpropagálni).
Egy meglévő eseményszűrő eltávolítható a QObject::removeEventFilter(QObject *obj)
függvény segítségével. Amennyiben minden beállított szűrő hamis értékkel tér vissza, a célobjektum is megkapja az eseményt, ellenkező esetben a legelső igaz értékkel visszatért szűrő után a többi szűrő sem kapja meg az eseményt.
- Készítsünk egy alkalmazást, amelyben egy szavakból álló listát jelenítünk meg, és egy szövegdoboz segítségével szűrhetjük a tartalmat (használjunk
QLineEditet
és annak atextEdited(const QString &text)
eseményét, dokumentáció itt). A szavakat egy tetszőlegesen, a felhasználó által kiválasztott szöveges fájlból töltsük be. Az ablakot lehessen átméretezni és a tartalom alkalmazkodjon az új mérethez.
-
Készítsünk egy grafikus felhasználói felülettel rendelkező alkalmazást, amely lehetővé teszi a felhasználók számára, hogy megadjanak egy nevet és egy telefonszámot, majd ezeket az adatokat elmenti egy szöveges állományba. A telefonszám szövegdobozába csak számjegyeket lehet beírni. Ehhez használjunk második módszert, vagyis az
Object::installEventFilter(QObject *filterObj)
metódust, hogy csak számokat lehessen a telefonszám szövegdobozába beírni. -
Készítsünk egy Notepad alkalmazást, amely egy szövegdobozból áll. A szövegdobozhoz használjunk egy saját osztályt, amelyet a
QPlainTextEdit
osztályból származtassunk. Tegyük lehetővé a következő funcionalitásokat:-
Ha megnyomjuk a
Ctrl+S
billentyűkombinációt, akkor mentse el a szövegdoboz tartalmát azoutput.txt
állományba. Írjuk felül akeyPressEvent
függvényt. -
Csempésszük bele a német betűkészletet billentyűkombinációk lenyomásával:
Alt+A
lenyomása esetén jelenjen meg egyä
betűAlt+O
lenyomása esetén jelenjen meg egyö
betűAlt+U
lenyomása esetén jelenjen meg együ
betűAlt+S
lenyomása esetén jelenjen meg egyß
betű- elég csak a kisbetűket leimplementálni.
-