Erstmal Reaktion auf Mausbewegung im Main-Widget:
#include <QApplication> #include <QWidget> #include <QPainter> #include <QMouseEvent> #include <iostream> using namespace std; class myWidget : public QWidget { public: myWidget(){}; protected: virtual void mousePressEvent( QMouseEvent* ); virtual void mouseMoveEvent( QMouseEvent* ); }; // reagiert auf Maus-Klick void myWidget::mousePressEvent( QMouseEvent* event ) { int xpos = (event->pos()).x(); int ypos = (event->pos()).y(); cout << xpos << " " << ypos << endl; } // reagiert auf Mausbewegung, waehrend eine Taste gedrueckt ist. void myWidget::mouseMoveEvent( QMouseEvent* event ) { int xpos = (event->pos()).x(); int ypos = (event->pos()).y(); cout << xpos << " " << ypos << endl; } int main(int argc, char **argv) { QApplication app(argc,argv); myWidget *wid = new myWidget(); wid->resize(300,300); wid->show(); return app.exec(); }
Kann leicht auf Bewegung von Grafik-Objekten angewendet werden:
#include <QApplication> #include <QWidget> #include <QPainter> #include <QPaintEvent> #include <QMouseEvent> class myWidget : public QWidget { public: myWidget(); protected: virtual void paintEvent(QPaintEvent*); virtual void mousePressEvent( QMouseEvent* ); virtual void mouseMoveEvent( QMouseEvent* ); private: int xpos, ypos, radius; // circle parameters }; myWidget::myWidget() { xpos = 50; ypos = 50; radius = 40; setBackgroundRole(QPalette::Base); setAutoFillBackground(true); } void myWidget::paintEvent(QPaintEvent *) // called by update() { QBrush b1( Qt::blue ); // blue filler QPainter *paint = new QPainter(); paint->begin(this); paint->setPen( Qt::red ); paint->setBrush( b1 ); paint->drawEllipse( xpos, ypos, radius, radius ); paint->end(); } // reagiert auf Maus-Klick void myWidget::mousePressEvent( QMouseEvent* event ) { xpos = (event->pos()).x(); ypos = (event->pos()).y(); update(); } // reagiert auf Mausbewegung, waehrend eine Taste gedrueckt ist. void myWidget::mouseMoveEvent( QMouseEvent* event ) { xpos = (event->pos()).x(); ypos = (event->pos()).y(); update(); } int main(int argc, char **argv) { QApplication app(argc,argv); myWidget *wid = new myWidget(); wid->resize(300,300); wid->show(); return app.exec(); }
Jetzt wird in member-Variablen xpos, ypos die Position eines Kreises abgespeichert. Mausklick oder Mausbewegung ändert diese Variablen entsprechend.
Zeichen-Funktion in überschriebener QWidget-Methode paintEvent(), die bei Änderung des Fensters oder bei Mausbewegung via update() gerufen wird.
Beispiel der Maus-Aktion:
QApplication weiss nix von MyWidget , es kennt nur QWidget und die dazugehörigen Methoden.
GDuckeck 2019-08-01