Qt egyedi KeyPressEvent definíció

Címkék
Qt egyedi KeyPressEvent definíció
2010-07-15T17:06:48+02:00
2010-07-16T15:04:02+02:00
2022-07-19T09:40:46+02:00
silur
Ismét Qt hiba
a kövekező a forrásrészlet:

class xy: Public QWidget { ... void procedure_1() { QWidget *projectw=new QWidget(); projectw->show(); }



ide kellene (osztály függvényén belül, procedure_1) deklarálnom a

QWidget::KeyPressEvent(QKeyevent *event) { if (event->key()==Qt::Key_Escape) { projectw->close() } }
részletet, hogy az [Esc] lenyomása után a létrehozot form bezáródjon.
lehetséges?
Mutasd a teljes hozzászólást!
MyWidget konstruktorból szedd ki a három sort, a main.cpp-ben pedig MyWidget w után w.show(); kell.
Szerintem akkor jó lesz.
Így a mywidget konstruktorában csinálsz egy sima QWidget-et, amit aztán megmutatsz. De az nem MyWidget típusú lesz, ergó nem fut le a MyWidget keypressevent függvénye.
Meg ebben a formában szerintem a program lefutása után nem is üríti a memóriát, de az már másik kérdés.
Mutasd a teljes hozzászólást!

  • Nohát. Ha nem tárolod el sehol a projectw változót akkor sehogy nem fogod tudni elérni. Vagy mit szeretnél? Nem tudsz úgy összekötni egy signalt meg egy slotot, hogy csak akkor fusson ha escet nyomtak. Tárold le a QWidget* projectw-t az osztályban, és azt zárd be ha escet kaptál. Miért kell a függvényen belül ez?
    Mutasd a teljes hozzászólást!

  • "Ismét Qt hiba"

    hülyeséget ne írjál már!!!

    ez emberi hiba, a tied.
    Mutasd a teljes hozzászólást!
  • a probléma épp az hogy nem reagál a keyPressEvent semmire

    amúgy nem mintha lenne 1 post is az egész fórumon ami nem emberi hiba volna
    Mutasd a teljes hozzászólást!
  • Előfordult már olyan hiba, ami eddig nem elhíresedett programhibára vezetődött vissza, VÉGSŐsoron az is emberi hiba valahol, de Qt hibának azt neveztük volna, ha mondjuk a Qt-ban találsz egy bugot vagy következetlenséget. Ez emberi hiba. Próbáltad már a CONNECT macro-t?
    Mutasd a teljes hozzászólást!
  • Mihez kössen egyáltalán ?
    nincs KeyEvent Signal
    Mutasd a teljes hozzászólást!
  • Hát most egyszerű a képlet: ha nem fut le, azt könnyű ellenőrizni, beleírod hogy throw 1; vagy exit();
    Ha lehal, akkor lefut, tehát ott rontasz el valamit. Ha nem, akkor biza nem fut le. Régen Qt-ztam, de ha jól emlékszem ott minden eseményt biza connectálni kell, tehát kell lennie VALAMILYEN billentyűzetesemény signálnak, nem?
    Mutasd a teljes hozzászólást!
  • Ezt nézted már?
    Tetraliusnak igaza van. Ez a probléma nem a Qt hibája.
    Mutasd a teljes hozzászólást!
  • hát ellenőriztem ezzel az módszerrel és "biza nem fut le" :D
    a link pedig semmit nem mond mert innen néztem ki a KeyPressEventet de nem fut le semmi ép ez a baj..
    valamint a QWidget osztály nem rendelkezik csak 2 signal-al és nincs hasonló
    Mutasd a teljes hozzászólást!
  • Magát a Tetrix játék példáját megnézted?
    Ott valószínűleg működik. Azt fordítsd le egy önálló projektben. Nézd meg, hogy működik-e? Ha igen, akkor tanulj belőle!

    Ilyeneket ír:

    tetrixboard.h
    ... protected: void paintEvent(QPaintEvent *event); void keyPressEvent(QKeyEvent *event); void timerEvent(QTimerEvent *event); ...

    tetrixboard.cpp
    ... void TetrixBoard::keyPressEvent(QKeyEvent *event) { if (!isStarted || isPaused || curPiece.shape() == NoShape) { QFrame::keyPressEvent(event); return; } switch (event->key()) { case Qt::Key_Left: tryMove(curPiece, curX - 1, curY); break; case Qt::Key_Right: tryMove(curPiece, curX + 1, curY); break; case Qt::Key_Down: tryMove(curPiece.rotatedRight(), curX, curY); break; case Qt::Key_Up: tryMove(curPiece.rotatedLeft(), curX, curY); break; case Qt::Key_Space: dropDown(); break; case Qt::Key_D: oneLineDown(); break; default: QFrame::keyPressEvent(event); } } ...

    Egyébként Tetralius írt egy fontos mondatot:
    Ha nem tárolod el sehol a projectw változót akkor sehogy nem fogod tudni elérni.


    Mit zársz be, ha nem tudod, hogy mit kell bezárni?
    Mutasd a teljes hozzászólást!
  • ugyanezt a metódust használom csak nem headerben definiálom és cpp-ban deklarálom hanem a headerben van meg mind kettő.
    Mutasd a teljes hozzászólást!
  • Jó.
    Másold be a programot. Ne beszéljünk félre.
    Mutasd a teljes hozzászólást!
  • hanem a headerben van meg mind kettő.


    Ne újíts! Csináld úgy, ahogy mindenki: *.h és *.cpp
    Azt hiszed, véletlenül alakultak ki ezek a hagyományok?
    Mutasd a teljes hozzászólást!
  • viszont ez idő és helypazarlás miért kell egy headerbe csak beírni valaminek a nevét és későb egy másikban megmagyarázni mi az?
    void xy();

    void z::xy()
    {
    ...
    }
    nem a leg logikusab de nem ez a lényeg
    Mutasd a teljes hozzászólást!
  • Ezek azok a szabályok, amiket amíg nem érted miért, addig be kell tartani. Ha már megérted miért alakultak ki, akkor adott esetben el lehet térni tőle, mert tudni fogod, mit csinálsz. Addig nem érdemes.

    De szeritnem is másold be a programot, ha rá se fut a függvényre, akkor valamit nagyon elbaltáztál
    Mutasd a teljes hozzászólást!
  • ui_mainwindow.h ---generálva


    #ifndef UI_MAINWINDOW_H #define UI_MAINWINDOW_H #include <QtCore/QVariant> #include <QtGui/QAction> #include <QtGui/QApplication> #include <QtGui/QButtonGroup> #include <QtGui/QGridLayout> #include <QtGui/QHeaderView> #include <QtGui/QLabel> #include <QtGui/QMainWindow> #include <QtGui/QWidget> #include <QtGui/QKeyEvent> QT_BEGIN_NAMESPACE class Ui_MainWindow { public: QAction *actionQuit; QWidget *centralWidget; QGridLayout *gridLayout; QLabel *label; void setupUi(QMainWindow *MainWindow) { if (MainWindow->objectName().isEmpty()) MainWindow->setObjectName(QString::fromUtf8("MainWindow")); MainWindow->resize(336, 227); actionQuit = new QAction(MainWindow); actionQuit->setObjectName(QString::fromUtf8("actionQuit")); centralWidget = new QWidget(MainWindow); centralWidget->setObjectName(QString::fromUtf8("centralWidget")); gridLayout = new QGridLayout(centralWidget); gridLayout->setObjectName(QString::fromUtf8("gridLayout")); label = new QLabel(centralWidget); label->setObjectName(QString::fromUtf8("label")); gridLayout->addWidget(label, 0, 0, 1, 1); MainWindow->setCentralWidget(centralWidget); retranslateUi(MainWindow); QObject::connect(actionQuit, SIGNAL(activated()), MainWindow, SLOT(close())); QMetaObject::connectSlotsByName(MainWindow); } // setupUi void retranslateUi(QMainWindow *MainWindow) { MainWindow->setWindowTitle(QApplication::translate("MainWindow", "asd", 0, QApplication::UnicodeUTF8)); actionQuit->setText(QApplication::translate("MainWindow", "Quit", 0, QApplication::UnicodeUTF8)); label->setText(QApplication::translate("MainWindow", "TextLabel", 0, QApplication::UnicodeUTF8)); Q_UNUSED(MainWindow); } // retranslateUi protected: void keyPressEvent(QKeyEvent *event) { label->setText(event->text()); } }; namespace Ui { class MainWindow: public Ui_MainWindow {}; } // namespace Ui QT_END_NAMESPACE #endif // UI_MAINWINDOW_H

    main.cpp


    #include <QApplication> #include <QMainWindow> #include "ui_mainwindow.h" int main(int argc, char **argv) { QApplication app(argc, argv); QMainWindow w; Ui::MainWindow main; main.setupUi(&w); w.show(); return app.exec(); }
    és természetesen nem fut le az event -.-'
    Mutasd a teljes hozzászólást!
  • Nagyon régen Qt-ztam, de mivel sehol nem konnektálod össze a kexpresseventet valami signallal, és az ui_mainwindow nem leszármazottja semmilyen Qt-s osztálynak, ezért polimorfizmus sincs, ezért egyáltalán nem értem miért kéne bárminek is lefutnia...
    Mutasd a teljes hozzászólást!
  • elnézést tényleg kifelejtettem a származtatást kijavítottam:

    class Ui_MainWindow : public QWidget { ...
    valamint a kérdésem pont az hogy e keyPressEvent-hez semmilyen signal sincs amit rendelhetnék de akkor hogyan fut le?
    Mutasd a teljes hozzászólást!
  • Hello!

    Nem jó az irány szerintem. Csináld azt, hogy a QWidget-ből származtatsz egy saját widgetet.
    Mivel a keypressevent függvény protected és virtual, ebben az osztályban újra meg tudod valósítani.
    Tehát valami ilyesmi lesz:

    mywidget.h #include <QWidget> class QKeyEvent; class MyWidget : public QWidget { Q_OBJECT public: MyWidget(QWidget* parent=NULL, stb); ~MyWidget() protected: void keyPressEvent(QKeyEvent*); }; mywidget.cpp #include "mywidget.h" #include <QKeyEvent> MyWidget::MyWidget(QWidget* parent) : QWidget(parent) { setupUi, stb } MyWidget::~MyWidget() { } MyWidget::keyPressEvent(QKeyEvent* ke) { if (ke->key()==QKeyEvent::ESC) { QMessageBox::information(this, "Hello", "ESC bill"); } }

    Valami ilyesmi, csak fejből írtam, meg nem is teljes
    Mutasd a teljes hozzászólást!
  • lefutattam de szintén nem történik meg az esemény a qDebug-al is ellenőriztem nem érzékel billenytűeseményt
    Mutasd a teljes hozzászólást!
  • Mit futtattál? Teljes kód esetleg van? Fókuszt kap a widget?
    Mutasd a teljes hozzászólást!
  • mywidget.h


    #include <QWidget> class QKeyEvent; class MyWidget : public QWidget { Q_OBJECT public: MyWidget(QWidget* parent=NULL); ~MyWidget(); protected: void keyPressEvent(QKeyEvent*); };

    mywidget.cpp



    #include "mywidget.h" #include <QKeyEvent> #include <QMessageBox> #include <QPushButton> MyWidget::MyWidget(QWidget* parent) : QWidget(parent) { QWidget *widget=new QWidget(); QPushButton *p=new QPushButton(widget); widget->show(); } MyWidget::~MyWidget() { } void MyWidget::keyPressEvent(QKeyEvent* ke) { if (ke->key()==Qt::Key_Escape) { QMessageBox::information(this, "Hello", "ESC bill"); } }

    main.cpp



    #include "mywidget.h" #include <QApplication> int main (int argc, char **argv) { QApplication app(argc,argv); MyWidget w; return app.exec(); }
    Mutasd a teljes hozzászólást!
  • MyWidget konstruktorból szedd ki a három sort, a main.cpp-ben pedig MyWidget w után w.show(); kell.
    Szerintem akkor jó lesz.
    Így a mywidget konstruktorában csinálsz egy sima QWidget-et, amit aztán megmutatsz. De az nem MyWidget típusú lesz, ergó nem fut le a MyWidget keypressevent függvénye.
    Meg ebben a formában szerintem a program lefutása után nem is üríti a memóriát, de az már másik kérdés.
    Mutasd a teljes hozzászólást!
Címkék
abcd