Seite 1 von 1
Mouse Position + statusbar + Anzeige[gelöst]
Verfasst: 11. März 2008 13:26
von Qt-nator
Hi,
Ich habe in meiner Widget Klasse folgendes eingebot:
Code: Alles auswählen
void
ParameterToolWidget::mouseMoveEvent(QMouseEvent* event)
{
QString sMouseInteraction;
sMouseInteraction.sprintf(" Position:%d,%d, ", event->pos().x(), event->pos().y());
}
was mir ja die Mauszeiger Position ausgibt wenn ich die Maus bewege. Das ist in meiner ParametertoolWidget Klasse implementiert. Ich möchte den Inhalt der Variable sMousInteraction in der Statusbar meines MainWindows anzeigen lassen welches seine eigene Klasse besitzt.
Die Frage ist jetzt: Gibt es eine Möglichkeit den Inhalt des QString sMouseInteraction in die Statusbar von der MainWindow Klasse zu bekommen. Oder muss ich den Inhalt an die MainWindow Klasse übergeben und den Inhalt dort dann in die Statusbar schreiben???
Ich komme jedenfalls nicht wirklich klar damit und wäre für Hilfe sehr dankbar.
Gruß
Qt-nator
Verfasst: 11. März 2008 14:02
von Christian81
Wo ist das Problem? Pointer der Statusbar der Widget-Klasse zugänglich machen und Text setzen. Wie Du das machst ist Dir überlassen.
Verfasst: 11. März 2008 14:13
von Qt-nator
Und wie macht man das? Ich Arbeite ja mit dem Designer wie und hab die Statusbar nicht selbst erstellt... wie kann ich das dann umsetzen?
Verfasst: 11. März 2008 14:26
von VuuRWerK
Re: Mouse Position + statusbar + Anzeige
Verfasst: 11. März 2008 14:29
von neuschi
Qt-nator hat geschrieben:
Und wie macht man das? Ich Arbeite ja mit dem Designer wie und hab die Statusbar nicht selbst erstellt... wie kann ich das dann umsetzen?
z.b.
Code: Alles auswählen
class ParameterToolWidget....
{
Q_OBJECT:
signals:
si_mousePosition(const QString&);
};
und dann in deiner Funktion:
Code: Alles auswählen
ParameterToolWidget::mouseMoveEvent(QMouseEvent* event)
{
QString sMouseInteraction;
sMouseInteraction.sprintf(" Position:%d,%d, ", event->pos().x(), event->pos().y());
emit si_mousePosition( sMouseInteraction );
}
Dann musst du in deinem Hauptprogramm noch das Signal verbinden:
Code: Alles auswählen
ParameterToolWidget *pw = new ParameterToolWidget(...);
connect (pw, SIGNAL(si_mousePosition(const QString&)), mainWindow->statusBar(), SLOT( showMessage(const QString&)));
}
ungetestet, aber so ähnlich sollte das gehen.
\Ralf
Verfasst: 11. März 2008 14:39
von Qt-nator
Erstmal vielen dank
Code: Alles auswählen
connect (m_pParameterToolWidget, SIGNAL(si_mousePosition(const QString&)), statusBar(), SLOT( showMessage(const QString&)));
So gehts dann!
Edit:
Was mich aber dann noch Interessieren würde ist wie ich bei Bewegung der Mouse die Position des Zeigers bekomme ohne das ich vorher Klicken muss?
Edit2:
Das war dann doch überhaupt kein Problem... nur kann mir noch jemand schnell sagen wie ich die Anzeige in der Statusbar zeitlich einschränke???
Verfasst: 11. März 2008 16:59
von neuschi
Qt-nator hat geschrieben:Erstmal vielen dank
Edit1:
Was mich aber dann noch Interessieren würde ist wie ich bei Bewegung der Mouse die Position des Zeigers bekomme ohne das ich vorher Klicken muss?
Edit2:
Das war dann doch überhaupt kein Problem... nur kann mir noch jemand schnell sagen wie ich die Anzeige in der Statusbar zeitlich einschränke???
Zu 1: setMouseTracking
Zu 2: Ich nehme an, das ist zu langsam, wenn jede Mausbewegung angezeigt wird? Dann probiere mal folgendes im Eventhandler:
Code: Alles auswählen
static QTime lastEventTime=QTime();
static int t = 0;
static QPoint lastPoint = QPoint();
QPoint curPnt = event->pos();
t += lastEventTime.restart();
if ( t < 100)
{
int len = (lastPoint-curPnt).manhattanLength();
if (len <10)
{
// zu schnell, zu kurz
lastPoint = curPnt;
return;
}
}
t = 0;
lastPoint = curPnt;
emit si_mousePosChanged( ..... );
An folgenden Werten kannst du rumspielen:
100 = 100ms zwischen Events
10 = 10 Pixel zwischen Events
Wieder ungetestet....
\Ralf