Giter Site home page Giter Site logo

fft-lab05's Introduction

Labor 05

Események Qt-ben

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.

Eseménykezelők

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
        }
    }
};

Event Filter

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.

Feladatok

  1. 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 a textEdited(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.

1

  1. 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.

  2. 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:

    1. Ha megnyomjuk a Ctrl+S billentyűkombinációt, akkor mentse el a szövegdoboz tartalmát az output.txt állományba. Írjuk felül a keyPressEvent függvényt.

    2. 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.

fft-lab05's People

Contributors

naghim avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.