Spendi Meno Quanto Basta Parte 1

Posso usare Qt per controllare le mie spese personali?

Da dove iniziamo?

Da inizio anno il saldo delle mie entrate / uscite è negativo. Non che debba chiedere aiuto allo stato, ma alcune spese straordinarie hanno fatto saltare i conti e nel lungo periodo il trend non è sostenibile, pertanto devo fare qualcosa.

Leggendo vari siti di finanza personale e sviluppo personale, il primo suggerimento che ho trovato è di scrivere tutte le spese (tante) e le entrate (poche) e poi identificare quali sono le spese comprimibili. Già la pigrizia di dover registrare la spesa aiuta ad evitare spese superflue; ovviamente sto parlando del caffè al bar, o l’ultimo gadget su Amazon, non dei libri per la scuola dei figli.

Naturalmente preferirei trascrivere il tutto in una applicazione, non su tavolette di argilla, pertanto per prima cosa ho cercato una app.

Seguendo i suggerimenti vari ho fatto delle prove, ma nessuna app mi ha veramente soddisfatto. Non ho provato quelle a pagamento, perché capite bene che se devo spendere di più per risparmiare il progetto parte male.

E se lo facessi con Qt?

Ecco che a questo punto mi sono detto: ma perché non fare una mia applicazione usando Qt, in modo da farmela Divertente e Comoda Quanto Basta?

Analisi del progetto.

Servono 2 flussi, Ingressi e Uscite. Non sono in grado di capire le registrazioni fatte con partita doppia, nonostante il metodo risalga al 1494 e che a descriverlo per bene fu un frate italiano (leggetevi la pagina su Wikipedia). Io voglio sapere alla fine del mese quanto ho incassato e quanto ho speso, cosicché potrò raggruppare le spese e vedere cosa posso ridurre.

Per gli ingressi non serve molto, posso inserirli a mano, in genere è il solo stipendio, per le uscite, vorrei avere un meccanismo di supporto, che potrebbe essere:

  1. Raccolgo le immagini degli scontrini fiscali usando lo smartphone
  2. Faccio arrivare le immagini sul mio PC
  3. Carico le nuove immagini in una applicazione
  4. Salvo l’immagine nel database della applicazione, con data e descrizione della transazione
  5. Registro il movimento e se serve, lo scompongo in più movimenti con diverse categorie.
  6. Classifico la spesa in una categoria e sottocategoria predefinite

Serve un nome

Perché il progetto funzioni, devo avere voglia di alzarmi la mattina e usare la mia applicazione. Quindi anche il nome deve essere interessante! Che ne dite di SMQB? Ovvero Spendi Meno Quanto Basta.

Raccolta degli scontrini

Sarebbe bellissimo fare una app che sullo smartphone mi permette di fare delle foto, mettere dei commenti, salvarle nel cloud e poi accedere al cloud con il mio programma, eccetera eccetera. Ma vorrebbe dire iniziare nel 2030! Perchè non vedere se posso riutilizzare il lavoro di qualcun altro? E mentre ero in attesa dal barbiere (altra spesa che forse a tendere potrei comprimere!), ho avuto una illuminazione!

Posso usare l’app Google Drive, che permette di scattare una foto e salvarla in una cartella in rete. Se la cartella è tra i preferiti, selezionarla è velocissimo. Poi imposto la sincronizzazione della cartella, o di tutto il contenuto di Google Drive, sul mio pc, in modo che ogni volta che scatto una foto, la foto finisce nel mio computer.

Dopo aver creato la cartella: Scontrini sul mio Google Drive, la parte di raccolta delle immagini è risolta.

Ho scelto Google Drive perchè ho visto che è disponibile per macOS, per Windows e con applicazioni di terze parti anche per Linux, e poi perchè è la prima app con cui sono riuscito a fare delle foto senza riempire iCloud di immagini non correlate con i miei ricordi.

Non escludo che anche altre app possano fare lo stesso. Per favore aggiungete queste informazioni nei commenti.

Sprint 01: Creare l’applicazione

Ora prendiamo Qt ed iniziamo ad impostare la nostra applicazione. Si parte creando una Qt Widget Application che chiameremo SpendiMenoQuantoBasta. Poi nella mainwindows andiamo a mettere un tabWidget con 5 tab che chiameremo:

  • tabSetup (ovvero Impostazioni)
  • tabIncome (ovvero Entrate)
  • tabExpense (ovvero Uscite)
  • tabReport (ovvero Report)
  • tabAbout (ovvero Info)

Prima di compilare, impostiamo il parametro windowTitle della finestra principale come: “Spendi Meno Quanto Basta”.

Adattiamo il tabWidget alla finestra di dialogo con un layout verticale e compilando dovreste vedere:

Salvare le impostazioni

Gestiamo subito il salvataggio delle impostazioni della form principale creando 3 metodi protetti in mainwindow.h:

protected:    
    QString iniFilePath(); 
    void loadSettings();
    void saveSettigs();

Il metodo iniFilePath() è semplicissimo, e serve per calcolare il percorso in cui salvare le impostazioni. Io preferisco metterle in un file .ini a fianco dell’eseguibile (o del file .app nel caso macOS). Ecco il codice

 QString MainWindow::iniFilePath()
 {
     QFileInfo FI(qApp->applicationFilePath());
 #if defined Q_OS_MAC
     return FI.absolutePath() + "../../../../" + FI.baseName()
            + ".ini";
 #elif defined Q_OS_WIN
     return FI.absolutePath() + "/" + FI.baseName() + ".ini";
 #elif defined Q_OS_LINUX
     return FI.absolutePath() + "/" + FI.baseName() + ".ini";
 #endif
 }

Non dimenticate di aggiungere #include <QFileInfo> alla lista delle inclusioni. Basta selezionare QFileInfo e premere ALT+INVIO per avere l’opzione come suggerimento del tool di refactoring.

Provate a farlo, è fantastico!

Anche i metodi loadSettings() e saveSettings() si scrivono in poche righe. Per il momento salviamo la geometria della finestra di dialogo e l’indice corrente del controllo con i tab, poi li estenderemo anche alle altre impostazioni.

 void MainWindow::loadSettings()
 {
     QSettings settings(iniFilePath(), QSettings::IniFormat);
     restoreGeometry(settings.value("Geometry", saveGeometry())
                         .toByteArray());
     ui->tabWidget->setCurrentIndex(settings
                         .value("SelectedTab", 0).toInt());
 }
 
 void MainWindow::saveSettigs()
 {
     QSettings settings(iniFilePath(), QSettings::IniFormat);
     settings.setValue("Geometry", saveGeometry());
     settings.setValue("SelectedTab", 
                    ui->tabWidget->currentIndex());
 }

Anche in questo caso, non dimenticate di aggiungere #include <QSettings>, sempre usando ALT+INVIO per velocizzare l’operazione e non perdere il focus.

Ora invochiamo i metodi loadSettings() e saveSettings(), dopo aver costruito la user interface:

MainWindow::MainWindow(QWidget *parent) :
     QMainWindow(parent),
     ui(new Ui::MainWindow)
 {
     ui->setupUi(this);
     loadSettings();
 }

E prima di distruggere il tutto e chiudere il programma

MainWindow::~MainWindow()
 {
     saveSettigs();
     delete ui;
 }

Nella prossima puntata

Per questa puntata è tutto. Abbiamo solo scalfito la superficie, me ne rendo conto, ma abbiamo messo delle basi solide per fare la nostra applicazione Spendi Meno Quanto Basta. Seguitemi e ci divertiremo.

Attendo con ansia i vostri commenti e i vostri suggerimenti, per ora divertitevi a controllare che effettivamente le impostazioni vengano salvate e ripristinate quanto rilanciate il programma.

Nella prossima puntata vedremo come creare la form con le impostazioni.

Autore: Gianbattista

Appassionato di tecnologia, sono l'autore di Qt5 Quanto Basta. Per lavoro mi occupo di elaborazione delle immagini per applicazioni industriali, ma nel tempo libero adoro creare applicazioni con Qt (www.qt.io)

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *