Permanente Speicherung der Mauskoordinaten
-
Hallo liebe Community,
Ich Versuche immoment In Qt über einen Knopfdruck die Mauskoordinaten in einem Vektor zu speichern und dies bei drücken eines anderen Knopfes zu stoppen.
Jedoch bekomme ich es nicht so ganz hin, ich zeige mal was ich schon probiert habe:class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); public slots: int GetMousePosition(); int stop(); private: static int recording; QVector<double> container; Ui::MainWindow *ui; };
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); connect(ui->RecordButton, SIGNAL(clicked()), this, SLOT(GetMousePosition())); connect(ui->StopButton, SIGNAL(clicked()), this, SLOT(stop())); } int MainWindow::recording = 0; int MainWindow::stop(){ this->recording = 1; QMessageBox msg; msg.setText("test "+QString::number(this->container[0])); msg.exec(); return 1; } int MainWindow::GetMousePosition() { POINT p; GetCursorPos(&p); while(this->recording != 1) { GetCursorPos(&p); this->container.append(p.x); this->container.append(p.y); } return 1; }
Das ganze funktioniert natürlich nicht, da sich das Programm am Ende in einer Endlosschleife aufhängt. Jedoch habe ich keine Idee wie ich es sonst regeln könnte, außer vielleicht über einen Thread? Ich wäre für Tipps sehr dankbar.
MfG Steven
-
Hallo,
bei GUI-Programmen mußt du ereignisorientiert programmieren.
Nimm entweder das mouseMoveEvent (also nur bei Bewegung der Maus) oder aber einen QTimer (d.h. in bestimmten Intervallen).Edit: Beispiel für Handle Mouse Move Event in QT - QMouseEvent
-
Hey,
Danke für die Antwort, aber zeichnet er denn dann auch die Koordinaten des ganzen Bildschirmes auf oder nur die des Fensters?
-
Das einfachste wäre ein Timer, der z.B. 10 mal pro Sekunde die Cursor Position ermittelt.
Eleganter wären Windows Hooks, aber auch deutlich umständlicher als so eine simple Lösung mit einem Timer.
-
So,
Habe das ganze jetzt probiert und bekomme keinen Fehler trotzdem wird nicht das getan was ich möchte
Hier der Code:MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); connect(ui->RecordButton, SIGNAL(clicked()), this, SLOT(start())); connect(&tlt, SIGNAL(timeout()), this, SLOT(GetMouseposition())); connect(ui->StopButton, SIGNAL(clicked()), this, SLOT(stop())); } bool MainWindow::recording = false; void MainWindow::stop(){ this->recording = false; QMessageBox msg; msg.setText("test "+QString::number(this->container[0])); msg.exec(); } void MainWindow::GetMousePosition() { POINT p; GetCursorPos(&p); this->container.append(p.x); this->container.append(p.y); } void MainWindow::start(){ this->tlt.start(60); }
class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); QTimer tlt; ~MainWindow(); public slots: void GetMousePosition(); void start(); void stop(); private: static bool recording; QVector<double> container; Ui::MainWindow *ui; };
Wenn ich erst den Recording button drücke und danach den Stop Button wird mir ein Out of Range Fehler ausgegeben da dem Vektor noch kein wert zugewiesen wurde.
Ich hoffe ihr könnt mir nochmal helfen :C
-
Du musst den Timer starten.
-
Hey,
Mache ich das nicht hier:void MainWindow::start(){ this->tlt.start(60); }
? :C
-
Hey,
Habe das Problem von selbst gelöst
Hier der Code:MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); tlt = new QTimer(this); connect(ui->RecordButton, SIGNAL(clicked()), this, SLOT(start())); connect(tlt, SIGNAL(timeout()), this, SLOT(GetMousePosition())); connect(ui->StopButton, SIGNAL(clicked()), this, SLOT(stop())); } bool MainWindow::recording = false; void MainWindow::stop(){ this->recording = false; QMessageBox msg; msg.setText("test "+QString::number(this->container[0])); msg.exec(); } void MainWindow::GetMousePosition() { POINT p; GetCursorPos(&p); this->container.append(p.x); this->container.append(p.y); } void MainWindow::start(){ tlt->start(60); }
Ich hatte vergessen tlt zu initialisieren.
Vielen dank an alleMfG Steven