Reagieren auf Maus-Bewegung

Die zentrale Komponente für ein User-Interface ist die Möglichkeit auf Ereignisse reagieren zu können, d.h. Knopfdruck, Mausbewegung, Texteingabe, etc mit einer Aktion zu verknüpfen.

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.


Qt-Anwendungsprogramme beruhen i.a. auf Polymorphismus

Beispiel der Maus-Aktion:


GDuckeck 2019-08-01