Almetare  1.15
Alle meine Taschenrechner - Eine C++-Bibliothek zur Entwicklung von Taschenrechnern
CalcDlgBase Klassenreferenzabstract

In dieser Klasse ist die Basisfunktionalitaet des Taschenrechner-Dialogs aller Taschenrechner implementiert. Mehr ...

#include <calc_dlg_base.h>

Klassendiagramm für CalcDlgBase:
Fx3600pMainDlg Fx85vMainDlg Ti30mainDlg

Öffentliche Methoden

CalculatorBasegetCalcP () const
 
bool getIsPixLoaded ()
 
QPixmap & getApplIconPixmap ()
 
ShortCutTabT * getShortCutTabP ()
 

Geschützte Typen

enum  ButtonType {
  B_NO, B_ANY_MODE, B_DIGIT, B_ACTION,
  B_ON, B_PI, B_EE, B_ENG
}
 

Geschützte Methoden

void boot (CalculatorBase *cbP, QDialog *dlgP, Qt::WFlags wflags)
 Initialisiert einen Taschenrechner. Mehr ...
 
void initCalcDlgBase ()
 Initialisierung, die nach "Einschalten" (mButOnP) des Rechners durchgefuehrt wird. Mehr ...
 
void clearLcd ()
 Loescht das LCD. Mehr ...
 
void resizeAllWidgets (QDialog *mainDlgP)
 Ermittelt aus der aktuellen Groesse und der Originalgroesse des Hauptdialogs mainDlgP Streckfaktoren in x- und y-Richtung. Mehr ...
 
void setLastType (ButtonType bt)
 
void showHint ()
 Bringt Message-Box auf den Bildschirm, wenn die Maus zum ersten Mal den Rechnerdialog betritt. Mehr ...
 
string extractSym (QPushButton *senderP)
 Extrahiert das Symbol aus dem Button-Namen, indem das fuehrende "m" und abschliessende "P" entfernt wird. Mehr ...
 
void butAnyModeBase (string &sym)
 Funktion, die fuer die Bearbeitung aller Modus-Tasten aufgerufen wird. Mehr ...
 
void butActionBase (string &sym, string &lastSymb)
 Slot-Funktionen fuer die meisten Buttons. Mehr ...
 
void butDigitBase (string &sym)
 Wird von allen Zifferntasten aufgerufen. Mehr ...
 
void butSignBase ()
 Waehrend der Eingabe einer Zahl muss das Vorzeichen gewechselt werden, ohne die Eingabe zu unterbrechen; sonst muss im Calculator die Sign-Routine aufgerufen werden. Mehr ...
 
void butBack ()
 Entfernt das letzte Zeichen aus der Anzeige. Mehr ...
 
void butTypeBase (QWidget *dlgP, Qt::WFlags wflags)
 Fuehrt den Konfigurationsdialog aus. Mehr ...
 
void playPressBase ()
 Spielt einen der Sounds im Vektor mPrsSounds beim Druecken der Taste.
 
void playReleaseBase ()
 Spielt einen der Sounds im Vektor mRlsSounds beim Loslassen der Taste. Mehr ...
 
void execKeyEvent (QKeyEvent *evP, QMouseEvent &me)
 Wandelt Tastatur-Event in Button-Pressed-Event um. Mehr ...
 
void updateDisplayAfterDigit (string inputStr="")
 Erneuert die Members mModes und mSeven der Display-Klasse und das LCD entsprechend. Mehr ...
 
void updateDisplay (string inputStr="")
 Erneuert die Members der Display-Klasse, die drei Edit-Felder des Dialogs und das LCD. Mehr ...
 
void copyBaseDisplayFields ()
 Holt die Display-Felder aus der zum Taschenrechner gehoerenden Display-Klasse. Mehr ...
 
void setError ()
 
bool isError ()
 
virtual void preExtractSym (string sym)
 
virtual void adjustRealisticSkin ()
 
virtual void adjustSimpleSkin ()=0
 
virtual void adjustDebugSkin ()=0
 
virtual void makeShortCutTab ()=0
 
virtual void setDisplayFields (bool isDoPerhapsNot=false)=0
 

Geschützte Attribute

QDialog * mCalcDlgP
 Zeiger auf den Dialog.
 
CalculatorBasemCalcP
 Zeiger auf den eigentlichen Rechner.
 
int mDefaultWidth
 Default-Breite des Rechners (falls keine Pixmap)
 
int mDefaultHeight
 Default-Hoehe des Rechners (falls keine Pixmap)
 
int mDigitWidth
 natuerliche Breite einer Ziffer im Display
 
int mDigitHeight
 natuerliche Hoehe einer Ziffer im Display
 
QRect mOrgLcdRect
 schmaler Streifen fuer die LCD-Ziffern
 
QSize mOrgDlgSize
 Originalgroesse des Rechners.
 
WgtDataMapT mOrgWgtMap
 Originalgroessen und -texte aller Widgets des Dialogs.
 
double mXfact
 Resize-Faktor in x-Richtung.
 
double mYfact
 Resize-Faktor in y-Richtung.
 
QPixmap mApplIconPixmap
 Pixmap mit dem Application-Icon (links oben im Dialog)
 
QPixmap mBackgroundPixmap
 Pixmap mit dem Hintergrundbild.
 
QPixmap mDigitsPixmap
 Pixmap mit allen Ziffern.
 
QPixmap mScaledDigitsPixmap
 Pixmap mit allen Ziffern, skaliert.
 
QRect mLcdRect
 schmaler Streifen fuer die LCD-Ziffern
 
QLineEdit * mLcdStrBaseP
 formatiertes Ein-Ausgabefeld der Dialog-Box
 
QLineEdit * mModesBaseP
 Modes-Ausgabefeld der Dialog-Box.
 
QLineEdit * mDisplayBaseP
 "rohes" Ein-Ausgabefeld der Dialog-Box
 
QLabel * mSeebassBaseP
 Namensfeld.
 
ButtonType mLastType
 Typ der zuletzt gedrueckten Taste.
 
ButtonType mLastButOneType
 Typ der vorletzten gedrueckten Taste.
 
string mDisplayStr
 Eingabefeld des Taschenrechners.
 
vector< QSound * > mPrsSounds
 Liste aller Sounds fuer 'Taste druecken'.
 
vector< QSound * > mRlsSounds
 Liste aller Sounds fuer 'Taste loslassen'.
 
ShortCutTabT mShortCutTab
 Liste aller Shortcuts.
 
bool mIsOff
 Rechner ein- oder ausgeschaltet.
 
bool mIsPixLoaded
 konnten Rechner-Pixmaps geladen werden?
 
bool mIsSoundLoaded
 konnten Sounds geladen werden?
 
int mMaxDigitNum
 maximale Anzahl von Ziffern bei der Eingabe
 

Private Methoden

bool loadWavs (string path, vector< QSound * > &qsPvec)
 Laedt saemtliche in den Verzeichnissen wav/prs und wav/rls vorhandenen Dateien in Listen von QSound-Objekten. Mehr ...
 
void makeWgtMap ()
 Speichert bei der Konstruktion des Taschenrechner-Hauptdialogs die Groessen und Positionen aller Widgets in der Map mOrgWgtMap. Mehr ...
 
void setRealisticSkin ()
 Versteckt diverse Felder und stellt die Pixmaps auf dem Hintergrund und auf den Buttons dar. Mehr ...
 
void setSimpleSkin ()
 Entfernt alle Pixmaps und restauriert die Beschriftung der Buttons.
 
void setDebugSkin ()
 Wie RealisticSkin, setzt aber die Beschriftung der Buttons und macht alle Felder sichtbar. Mehr ...
 
void hideOrShowAllLabels (bool isToHide)
 Geht alle Widgets durch und versteckt oder zeigt alle Labels. Mehr ...
 
void setNewSize (QWidget *qwP)
 Berechnet fuer das Widget qwP eine neue Position und Groesse abhaengig von der aktuellen Groesse des Hauptdialogs und der Originalgroesse. Mehr ...
 
void rescalePixmap (QButton *bP, const QRect &orgWgtRect)
 Kopiert die Hintergrund-Pixmap in einen Button und setzt Palette mit grauem Rand. Mehr ...
 
string mapDlgBase (string &sym) const
 Fuehrt grundlegendes Mapping durch von den Symbolen, die zwar in der Konsolenumgebung verwendet werden, aber nicht in Widget-Namen verwendet werden koennen. Mehr ...
 
void butDigitDigit (string &sym)
 Die Ziffer ist wirklich eine Ziffer (nicht etwa auf ein anderes Symbol umgemappt). Mehr ...
 
void butDigitAction (string &sym)
 Die urspruengliche Ziffer wurde wegen einer Shift-Operation auf ein anderes Symbol umgemappt. Mehr ...
 
void addToolTips ()
 Geht die Short-Cut-Map durch und versieht jeden Button darin mit dem Shortcut als Tooltip. Mehr ...
 
void removeToolTips ()
 Geht die Short-Cut-Map durch und loescht alle Tooltips der Buttons.
 
void pasteText ()
 Kopiert den Textinhalt des Clipboards zeichenweise ins Display. Mehr ...
 
void setResetAlwaysOnTop (bool alwaysOnTop, Qt::WFlags wflags, bool showIt)
 Setzt das Dialog-Flag Qt::WStyle_StaysOnTop des Rechnerdialogs, wenn alwaysOnTop true; andernfalls wird es zurueckgesetzt. Mehr ...
 

Private Attribute

clock_t mPressedClock
 Clock, wenn Taste gedrueckt wurde.
 

Ausführliche Beschreibung

In dieser Klasse ist die Basisfunktionalitaet des Taschenrechner-Dialogs aller Taschenrechner implementiert.

Der eigentliche Taschenrechner-Dialog (z.B. Fx85vMainDlg) wird einerseits von der Klasse abgeleitet, die vom Qt-Designer erzeugt wird, und andererseits von dieser Klasse. Beispielsweise ist hier das Laden des Hintergrundbildes, Vergroessern und Verkleinern der Dialogbox usw. implementiert; kurz: alles, was allen Taschenrechnerdialogen gemeinsam ist.

Dokumentation der Elementfunktionen

◆ addToolTips()

void CalcDlgBase::addToolTips ( )
private

Geht die Short-Cut-Map durch und versieht jeden Button darin mit dem Shortcut als Tooltip.

◆ boot()

void CalcDlgBase::boot ( CalculatorBase cbP,
QDialog *  dlgP,
Qt::WFlags  wflags 
)
protected

Initialisiert einen Taschenrechner.

Laedt die passende Pixmap und die Sounds, Basisinitialisierung.

Parameter
cbPZeiger auf die Calculator-Basisklasse des Rechners
dlgPZeiger auf die Qt-Dialogbox
wflagsdiverse Qt-Dialog-Flags

◆ butActionBase()

void CalcDlgBase::butActionBase ( string &  sym,
string &  lastSymb 
)
protected

Slot-Funktionen fuer die meisten Buttons.

Der Name des gedrueckten Buttons wird ermittelt; bis auf das "m" und "P" (z.B. im Namen "mSignP") ist der Name i.d.R. identisch mit dem String, den der Calculator in seiner Funktion process() erwartet. Dieser String wird daher an ihn geschickt. Wenn als letztes eine Zahl (sie befindet sich in mDisplayStr) eingegeben wurde, muss zunaechst diese der process()-Funktion uebergeben werden.

Parameter
symzu verarbeitendes Symbol
Rückgabewerte
lastSymbdas Symbol, das beim letzten Aufruf uebergeben worden war

◆ butAnyModeBase()

void CalcDlgBase::butAnyModeBase ( string &  sym)
protected

Funktion, die fuer die Bearbeitung aller Modus-Tasten aufgerufen wird.

Parameter
symdas Symbol mit dem Modus ("inv" etc.)

◆ butBack()

void CalcDlgBase::butBack ( )
protected

Entfernt das letzte Zeichen aus der Anzeige.

Wenn die Anzeige in Exponentialdarstellung ist, werden die Ziffern des Exponenten nach rechts geshifted bis er nur noch Nullen enthaelt, dann wird er ganz entfernt.

◆ butDigitAction()

void CalcDlgBase::butDigitAction ( string &  sym)
private

Die urspruengliche Ziffer wurde wegen einer Shift-Operation auf ein anderes Symbol umgemappt.

Dieses neue Symbol wird jetzt stattdessen prozessiert.

Parameter
symdas neue Symbol

◆ butDigitBase()

void CalcDlgBase::butDigitBase ( string &  sym)
protected

Wird von allen Zifferntasten aufgerufen.

Entweder ist in sym tatsaechlich eine Ziffer, dann wird sie i.d.R. an die Anzeige angehaengt. Oder in sym ist keine Ziffer (die Ziffer wurde wegen Shift oder Mode umgemappt), dann muss die entsprechende Aktion ausgefuehrt werden.

Parameter
symdas Symbol mit der Ziffer

◆ butDigitDigit()

void CalcDlgBase::butDigitDigit ( string &  sym)
private

Die Ziffer ist wirklich eine Ziffer (nicht etwa auf ein anderes Symbol umgemappt).

Die Ziffer ersetzt daher die Anzeige komplett oder wird an die Anzeige angehaengt. Wenn die Zahl gerade in Exponentialschreibweise dargestellt wird, darf die Zahl nicht einfach angehaengt werden, sondern die letzten beiden Ziffern des Exponenten werden nach links geshifted.

Parameter
symdas Symbol mit der Ziffer

◆ butSignBase()

void CalcDlgBase::butSignBase ( )
protected

Waehrend der Eingabe einer Zahl muss das Vorzeichen gewechselt werden, ohne die Eingabe zu unterbrechen; sonst muss im Calculator die Sign-Routine aufgerufen werden.

◆ butTypeBase()

void CalcDlgBase::butTypeBase ( QWidget *  dlgP,
Qt::WFlags  wflags 
)
protected

Fuehrt den Konfigurationsdialog aus.

Parameter
dlgPZeiger auf den Vater-Dialog
wflagsdie Flag-Parameter des Rechnerdialogs

◆ clearLcd()

void CalcDlgBase::clearLcd ( )
protected

Loescht das LCD.

Das Rechteck mLcdRect wird wieder mit dem Original aus der urspruenglichen Pixmap ueberschrieben.

◆ copyBaseDisplayFields()

void CalcDlgBase::copyBaseDisplayFields ( )
protected

Holt die Display-Felder aus der zum Taschenrechner gehoerenden Display-Klasse.

◆ execKeyEvent()

void CalcDlgBase::execKeyEvent ( QKeyEvent *  evP,
QMouseEvent &  me 
)
protected

Wandelt Tastatur-Event in Button-Pressed-Event um.

Dazu wird die Liste der Shortcuts durchgesehen und das Event an den dort zur Taste vermerkten Button geschickt.

Parameter
evPTastatur-Event
meentsprechendes Maus-Event

◆ extractSym()

string CalcDlgBase::extractSym ( QPushButton *  senderP)
protected

Extrahiert das Symbol aus dem Button-Namen, indem das fuehrende "m" und abschliessende "P" entfernt wird.

Ausserdem wird das Symbol gleich auf ein anderes gemapped, wenn eine Shift- Ebene aktiv ist.

Parameter
senderPZeiger auf den Button, der gedrueckt wurde
Rückgabe
String mit dem Symbol des Buttons

◆ hideOrShowAllLabels()

void CalcDlgBase::hideOrShowAllLabels ( bool  isToHide)
private

Geht alle Widgets durch und versteckt oder zeigt alle Labels.

Parameter
isToHidewenn true, werden die Labels versteckt, sonst gezeigt

◆ initCalcDlgBase()

void CalcDlgBase::initCalcDlgBase ( )
protected

Initialisierung, die nach "Einschalten" (mButOnP) des Rechners durchgefuehrt wird.

◆ loadWavs()

bool CalcDlgBase::loadWavs ( string  path,
vector< QSound * > &  qsPvec 
)
private

Laedt saemtliche in den Verzeichnissen wav/prs und wav/rls vorhandenen Dateien in Listen von QSound-Objekten.

Parameter
pathPfad zum Verzeichnis mit den Wav-Dateien
qsPvecVektor mit den Zeigern auf die QSound-Objekte
Rückgabe
true (anscheinend war hier mal geplant, bei Fehlern false zurueckzugeben...)

◆ makeWgtMap()

void CalcDlgBase::makeWgtMap ( )
private

Speichert bei der Konstruktion des Taschenrechner-Hauptdialogs die Groessen und Positionen aller Widgets in der Map mOrgWgtMap.

Die Daten werden spaeter zur Skalierung gebraucht. Falls das Widget ein Button ist, werden auch die Texte gespeichert, da diese durch Setzen einer Pixmap geloescht werden.

◆ mapDlgBase()

string CalcDlgBase::mapDlgBase ( string &  in) const
private

Fuehrt grundlegendes Mapping durch von den Symbolen, die zwar in der Konsolenumgebung verwendet werden, aber nicht in Widget-Namen verwendet werden koennen.

Parameter
inString mit dem Symbol, wie es der Button-Name liefert
Rückgabe
String mit dem Symbol, wie es der Konsolenrechner versteht

◆ pasteText()

void CalcDlgBase::pasteText ( )
private

Kopiert den Textinhalt des Clipboards zeichenweise ins Display.

Dabei wird fuer jedes Zeichen ein Tastendruck simuliert, das Zeichen also als Shortcut gemaess der Tabelle mShortCutTab[] interpretiert. Auf diese Weise ist also ebenfalls eine Art Programmierung des Rechners moeglich. Allerdings sollen normalerweise mit dieser Funktion Zahlen und keine "Programme" in die Anzeige gebracht werden, und diese sehen z.B so aus: -2.3e-025. mShortCutTab[] interpretiert nun aber "-" nicht als Vorzeichen, sondern als Subtraktion; auch ist die Reihenfolge der Zeichen falsch, wenn in die Anzeige diese Zahl eingegeben wird. Die waere naemlich so: "2.3_e025_". Also muss der String entsprechend umgestellt werden. Um trotzdem auch die "Programmierung" zu erlauben, wird nun zunaechst geprueft, ob im Clipboard eine einzelne Zahl steht. Ist dies der Fall, wird eine entsprechende Umstellung der Zeichen vorgenommen. Ist dies nicht der Fall, werden alle Zeichen so prozessiert, wie sie im Clipboard stehen.

◆ playReleaseBase()

void CalcDlgBase::playReleaseBase ( )
protected

Spielt einen der Sounds im Vektor mRlsSounds beim Loslassen der Taste.

Der Sound darf nur dann gespielt werden, wenn der vom Druecken der Taste schon abgespielt ist, da man sonst nur das Loslassen hoert. Nach 0.15 Sek. sollte der Druecken-Sound vorbei sein.

◆ rescalePixmap()

void CalcDlgBase::rescalePixmap ( QButton *  bP,
const QRect &  orgWgtRect 
)
private

Kopiert die Hintergrund-Pixmap in einen Button und setzt Palette mit grauem Rand.

Parameter
bPZeiger auf den zu bearbeitenden Button
orgWgtRectGroesse des originalen, unskalierten Buttons

◆ resizeAllWidgets()

void CalcDlgBase::resizeAllWidgets ( QDialog *  mainDlgP)
protected

Ermittelt aus der aktuellen Groesse und der Originalgroesse des Hauptdialogs mainDlgP Streckfaktoren in x- und y-Richtung.

Mit diesen werden alle Widgets des Dialogs bzgl. Position und Groesse angepasst.

Parameter
mainDlgPZeiger auf die Rechner-Dialogbox

◆ setDebugSkin()

void CalcDlgBase::setDebugSkin ( )
private

Wie RealisticSkin, setzt aber die Beschriftung der Buttons und macht alle Felder sichtbar.

◆ setNewSize()

void CalcDlgBase::setNewSize ( QWidget *  qwP)
private

Berechnet fuer das Widget qwP eine neue Position und Groesse abhaengig von der aktuellen Groesse des Hauptdialogs und der Originalgroesse.

Parameter
qwPZeiger auf das Widget, dessen Groesse berechnet werden soll

◆ setRealisticSkin()

void CalcDlgBase::setRealisticSkin ( )
private

Versteckt diverse Felder und stellt die Pixmaps auf dem Hintergrund und auf den Buttons dar.

◆ setResetAlwaysOnTop()

void CalcDlgBase::setResetAlwaysOnTop ( bool  alwaysOnTop,
Qt::WFlags  wflags,
bool  showIt 
)
private

Setzt das Dialog-Flag Qt::WStyle_StaysOnTop des Rechnerdialogs, wenn alwaysOnTop true; andernfalls wird es zurueckgesetzt.

Das Setzen erfolgt mit reparent(). Die Qt-Funktion setWFlags() ist protected und kann daher hier nicht ueber den Zeiger mCalcDlgP aufgerufen werden. Ausserdem scheint die Funktion nicht zu funktionieren.

Parameter
alwaysOnTopwenn true, wird Flag gesetzt, sonst wird's zurueckgesetzt
wflagsFlags zur Gestaltung der Dialog-Titelzeilenelemente
showItfuer reparent(): Dialog neu zeichnen

◆ showHint()

void CalcDlgBase::showHint ( )
protected

Bringt Message-Box auf den Bildschirm, wenn die Maus zum ersten Mal den Rechnerdialog betritt.

◆ updateDisplay()

void CalcDlgBase::updateDisplay ( string  inputStr = "")
protected

Erneuert die Members der Display-Klasse, die drei Edit-Felder des Dialogs und das LCD.

Wenn inputStr leer ist, werden die Members der Display-Klasse allenfalls umformatiert, der Wert der Anzeige wird nicht geaendert. Sinn: Z.B. der Button "abc" muss eine Umformatierung durchfuehren, ohne Werte zu aendern. Wenn inputStr gefuellt ist, wird dieser String als mSeven in die Display-Klasse und als Eingabestring in das Dialog-Edit-Feld *mDisplayP uebertragen, mValue und mModes aber ebenfalls nicht geaendert. Sinn: Bei der Eingabe von Ziffern muessen diese sofort angezeigt werden, ohne dass sich der Wert mVal in der Display-Klasse gleich aendern darf, da die Eingabe ja noch nicht abgeschlossen ist.

Parameter
inputStrwenn "", wird der String in mDisplayStr verwendet, um die Anzeige zu erstellen, sonst inputStr

◆ updateDisplayAfterDigit()

void CalcDlgBase::updateDisplayAfterDigit ( string  inputStr = "")
protected

Erneuert die Members mModes und mSeven der Display-Klasse und das LCD entsprechend.

Parameter
inputStrwenn "", wird der String in mDisplayStr verwendet, um die Anzeige zu erstellen, sonst inputStr

Die Dokumentation für diese Klasse wurde erzeugt aufgrund der Dateien: