Realisierung eines einfachen Software Keypads

Alles rund um die Programmierung mit Qt
Antworten
Hoedur
Beiträge: 4
Registriert: 12. August 2010 10:30

Realisierung eines einfachen Software Keypads

Beitrag von Hoedur »

Hallo zusammen,
ich bin seit einiger Zeit am grübeln wie ich am besten ein einfaches Keypad in meine Anwendung einbauen kann da das Programm nur mittels Touchpad bedient werden kann. Ich habe den betreffenden Ausschnitt der GUI als Anhang hochgeladen.

Soweit ich das sehe habe ich 2 Möglichkeiten: entweder baue ich mir eine Signals-Slots-Konstruktion, oder ich mache das mit Events.

Ich habe meinen ersten Versuch mit Signals-Slots unternommen. Meine Idee war folgende:
1. Pointer auf das zuletzt gewähltes QLineEdit sichern
-> passiert in einem Slot und funktioniert soweit:

Code: Alles auswählen

void MainWindow::saveLastSelectedTimerLineEdit()
{
	this->qleLastTimerSelected = (QLineEdit*)((QWidget*) QObject::sender());
}
2. Diesen Slot aufrufen sobald das QLineEdit den Fokus verliert
-> klappt noch nicht da editingFinished() nicht ausgelöst wird - liegt vermutlich am QIntValidator für dieses QLineEdit, der akzeptiert ein leeres QLineEdit nicht

3. Jetzt per Signal die gedrückte Zifferntaste an das zuvor gespeicherte QLineEdit senden

So, was ist davon zu halten? Zu umständlich, geht das geschickter? Wie würde ich das über das Event-System handhaben?

Vielen Dank schon mal :)
Dateianhänge
ausschnitt.png
ausschnitt.png (10.04 KiB) 4661 mal betrachtet
russkij
Beiträge: 57
Registriert: 14. Dezember 2005 11:57

Beitrag von russkij »

2. Diesen Slot aufrufen sobald das QLineEdit den Fokus verliert
-> klappt noch nicht da editingFinished() nicht ausgelöst wird - liegt vermutlich am QIntValidator für dieses QLineEdit, der akzeptiert ein leeres QLineEdit nicht

kannst genau so gut merken wenn der lineedit den focus bekommt, warum erst bei lostfocus
pfid
Beiträge: 535
Registriert: 22. Februar 2008 16:59

Re: Realisierung eines einfachen Software Keypads

Beitrag von pfid »

Hoedur hat geschrieben:

Code: Alles auswählen

void MainWindow::saveLastSelectedTimerLineEdit()
{
	this->qleLastTimerSelected = (QLineEdit*)((QWidget*) QObject::sender());
}
1) Du musst nicht auf QWidget casten um auf QLineEdit casten zu können
2) Das ist schrecklich böse, du solltest einen qobject_cast<QLineEdit*> verwenden und den Returnwert auf 0 prüfen-
3) Statt QObject::sender() geht auch einfach nur sender(), da deine Klasse von QObject erbt
Hoedur
Beiträge: 4
Registriert: 12. August 2010 10:30

Beitrag von Hoedur »

2. Diesen Slot aufrufen sobald das QLineEdit den Fokus verliert
-> klappt noch nicht da editingFinished() nicht ausgelöst wird - liegt vermutlich am QIntValidator für dieses QLineEdit, der akzeptiert ein leeres QLineEdit nicht

kannst genau so gut merken wenn der lineedit den focus bekommt, warum erst bei lostfocus
Hmm, da tu ich mir schwer, denn dafür gibt es kein Signal, und da ich mit dem Designer arbeite krieg ich da Schwierigkeiten. Sonst würd ich von QLineEdit ableiten, keine Frage...

Kann ich dem QIntValidator irgendwie beibringen auch einen leeren String als 'Acceptable' zu bewerten?


Hoedur hat Folgendes geschrieben:

Code:

void MainWindow::saveLastSelectedTimerLineEdit()
{
this->qleLastTimerSelected = (QLineEdit*)((QWidget*) QObject::sender());
}



1) Du musst nicht auf QWidget casten um auf QLineEdit casten zu können
2) Das ist schrecklich böse, du solltest einen qobject_cast<QLineEdit*> verwenden und den Returnwert auf 0 prüfen-
3) Statt QObject::sender() geht auch einfach nur sender(), da deine Klasse von QObject erbt
Danke, dachte mir schon dass das suboptimal ist, aber typsicherer ists wohl mit dem qobject_cast, ja.
russkij
Beiträge: 57
Registriert: 14. Dezember 2005 11:57

Beitrag von russkij »

eventuell dann einfach wenn ein button gedrückt wurde deine edits durchgehen und prüfen ob einer von denen selectiert ist?
padreigh
Beiträge: 340
Registriert: 13. Mai 2010 10:06

Beitrag von padreigh »

m.E. ist der Ansatz mist ;) nicht böse sein. Zieh dir mal http://doc.qt.nokia.com/4.6/model-view-delegate.html rein. Dann leitest du es entsprechend ab und setzt es dem/den QLineEdit als Delegate.
Vorteil: das Delegate verschwindet sogar wenn du es nicht brauchst ... und es ist LineEdit spezifisch also nix böses casten ;o) also mehr Platz für nette Logos oder so auf dem Touchscreen
Patrick (QtCreator 1.3.1, Qt 4.6.3)
---
template = subdirs
Antworten