Visualizzazione dei risultati da 1 a 6 su 6

Discussione: [Qt Creator] Icone

  1. #1
    Utente di HTML.it L'avatar di ing82
    Registrato dal
    Sep 2014
    Messaggi
    177

    [Qt Creator] Icone

    Eccomi di nuovo, con una domanda che sarà da veri principianti, ma questa è la mia situazione...

    Creo un mio programmino, alla applicazione associo l'icona che sul pc è memorizzata in C:\cart1\cart2\app_icon.ico, se non ricordo male col comando qApp->application...(non ho sotto mano il codice, ma a scanso di equivoci, è l'icona che vedo in alto a sinistra della finestra dell'applicazione).

    Creo la QAction apri, a cui associo l'icona C:\cart1\cart2\open.ico col comando

    mActOpen->setIcon(QIcon("C:/cart1/cart2/open.ico"));

    La domanda è la seguente: una volta creato l'eseguibile in release, queste icone, vengono memorizzate in esso, o le icone dovranno essere distribuite assieme all'applicazione?

    Con le chiavi di ricerca che ho usato fino ad ora, arrivo sempre a pagine che parlano di come eventualmente modificare l'icona del file.exe, quella mostrata dal sistema operativo, ma non trovo niente riguardo le icone dell'applicazione.
    Spero di essermi spiegato

    Grazie

  2. #2
    Mai, mai, mai referenziare percorsi completi relativi al PC di sviluppo nel codice.

    O fai riferimento alla directory dell'applicazione (nel qual caso ovviamente l'icona va tirata dietro nel tuo installer), oppure la includi nell'eseguibile usando un file di risorse (qrc) che dovrai aggiungere al progetto (c'è l'apposita funzione di Qt Creator per creare file di risorse e aggiungerci file). Per accedere alle risorse incorporate, si usa il prefisso "magico" ":/" (":/percorso/nel/file/di/risorse/open.ico").

    Vedi: http://doc.qt.io/qt-5/resources.html
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it L'avatar di ing82
    Registrato dal
    Sep 2014
    Messaggi
    177
    Scusate se i miei interventi sono sempre abbastanza lunghi, ma temo di non essere mai abbastanza chiaro... Ho fatto quanto segue


    1. letto il link
    2. creato il file .qrc mediante la procedura di qt creator (se non ricordo male, file, nuovo, file delle risorse selezionato dal gruppo Qt), ed è stato aggiunto in automatico al file .pro.
    3. ho messo i riferimenti quindi mediante il comando (anche qui vado a memoria) "copy path to clipboard"


    In questo modo, se ho capito giusto quanto letto nel link, l'icona è contenuta (che detto tecnicamente a questo punto dovrebbe essere "linkata staticamente") nel file .exe, in modo che portando in giro l'eseguibile, delle icone ci si può dimenticare.

    Ora però mi viene questo dubbio, supponiamo che il percorso di icona1.png, seppur nel formato del file delle risorse, venga richiamato in più punti.

    Se dovessi decidere di cambiare in futuro icona1.png con icona2.png, dovrei cambiare "manualmente" in tutti i punti dove è richiamata, sperando di non saltarne qualcuno.
    Ho quindi pensato, creo un file macro.h, in cui metto

    codice:
    #ifndef MACRO_H
    #define MACRO_H
    
    #define ICONA1 ":/icon/icona1.png"
    
    #endif // MACRO_H
    Cambio solo l'indirizzo nel file macro.h, e il resto va a posto da solo. E così ha funzionato.

    Problema successivo: l'icona in questione, può essere modificata dall'utente.
    Pensavo di risolvere così.
    1. ho un file .ini con le impostazioni del programma
    2. creo la chiave per memorizzare l'indirizzo di icona1 di default
    3. implemento quanto necessario per far modificare all'utente l'icona
    4. memorizzo il percorso dell'icona utente nel file delle impostazioni, così resta memorizzata la nuova impostazione lato utente


    Dovrebbe funzionare.

    Anche in questo caso, pensavo di sostituire con macro le voci per accedere al file .ini, così, in caso di future revisioni/modifiche, cambiata la macro, tutto va a posto in un colpo solo.

    Ad esempio, per memorizzare la chiave relativa all'icona 1, nel file .ini "originale" del programma

    definisco in macro.h
    codice:
    #define KEY_ICONA1 "icona1"
    #define ICONA1_PATH ":/icon/icona1.png"
    dove mi serve icona1 avrò, detto setting l'istanza dell'oggetto QSettings

    codice:
    QIcon(setting.value(KEY_ICONA1,ICONA1_PATH).toString())//a memoria...
    e così per altre opzioni modificabili dall'utente.
    Dopo aver proceduto così per due o tre icone, il comando build&run si è bloccato, non c'è stato più verso di farlo andare a buon fine (nemmeno dopo clean, run QMake, ecc)

    Ma il blocco è dovuto ad aver intorodotto troppi #define (sono arrivato al massimo ad una decina per ora, però se non è la strada da percorrere, sono all'inizio, quindi faccio ancora in fretta a cambiare)?

    P.S. disperato, ho disinstallato Qt in blocco (con varie peripezie perchè c'erano due file, di cui non ricordo il nome, che bloccavano molti file delle cartelle di Qt stesso, residuo della compilazione restata a metà), ho reinstallato tutto, ed ha compilato...

    Grazie

  4. #4
    Quote Originariamente inviata da ing82 Visualizza il messaggio
    In questo modo, se ho capito giusto quanto letto nel link, l'icona è contenuta (che detto tecnicamente a questo punto dovrebbe essere "linkata staticamente") nel file .exe, in modo che portando in giro l'eseguibile, delle icone ci si può dimenticare.
    Esatto.
    Ora però mi viene questo dubbio, supponiamo che il percorso di icona1.png, seppur nel formato del file delle risorse, venga richiamato in più punti.

    Se dovessi decidere di cambiare in futuro icona1.png con icona2.png, dovrei cambiare "manualmente" in tutti i punti dove è richiamata, sperando di non saltarne qualcuno.
    Non necessariamente, dall'editor delle risorse puoi sempre definire un alias per il file, in modo che venga inserito nel file delle risorse con un nome diverso da quello del file/percorso che ha effettivamente a livello di file system.
    Ho quindi pensato, creo un file macro.h, in cui metto
    ...
    Questo può essere utile più che altro per beccare a compile-time eventuali errori di battitura.
    Problema successivo: l'icona in questione, può essere modificata dall'utente.
    Pensavo di risolvere così.
    1. ho un file .ini con le impostazioni del programma
    2. creo la chiave per memorizzare l'indirizzo di icona1 di default
    3. implemento quanto necessario per far modificare all'utente l'icona
    4. memorizzo il percorso dell'icona utente nel file delle impostazioni, così resta memorizzata la nuova impostazione lato utente


    Dovrebbe funzionare.

    Anche in questo caso, pensavo di sostituire con macro le voci per accedere al file .ini, così, in caso di future revisioni/modifiche, cambiata la macro, tutto va a posto in un colpo solo.
    Non la vedo come una cosa così essenziale in realtà, per due motivi:
    - i punti dove fai riferimento alla stessa icona mi aspetto siano veramente pochi;
    - il punto in cui vai a leggere il file di configurazione per caricare l'icona mi aspetto sia uno solo.
    Per questo direi che almeno ICONA1_PATH è probabilmente abbastanza inutile.
    Ma il blocco è dovuto ad aver intorodotto troppi #define (sono arrivato al massimo ad una decina per ora, però se non è la strada da percorrere, sono all'inizio, quindi faccio ancora in fretta a cambiare)?
    Sicuramente non dipende dal numero di define, i soli header di Windows ne conterranno da soli decine di migliaia e si usano tranquillamente. Prova a postare un esempio minimo che riproduce il problema.
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Utente di HTML.it L'avatar di ing82
    Registrato dal
    Sep 2014
    Messaggi
    177
    Quote Originariamente inviata da MItaly Visualizza il messaggio
    Non necessariamente, dall'editor delle risorse puoi sempre definire un alias per il file, in modo che venga inserito nel file delle risorse con un nome diverso da quello del file/percorso che ha effettivamente a livello di file system.
    Questa mi era sfuggita, o meglio, l'avevo letta ma non ne avevo compreso l'utilità, ottimo.

    Quote Originariamente inviata da MItaly Visualizza il messaggio

    Sicuramente non dipende dal numero di define, i soli header di Windows ne conterranno da soli decine di migliaia e si usano tranquillamente. Prova a postare un esempio minimo che riproduce il problema.
    Boh, alla fine poi lo stesso progetto, senza aver apportato modifiche, viene compilato senza problemi...se si ripresenta il problema, vedo di postare un esempio minimo, anche se in un caso del genere non saprei isolarlo, perchè avevo modificato il contenuto di una stringa (terra-terra, testo tra gli apici), quindi mi pare abbastanza strano quello che è successo.
    Ieri però, ho eliminato dal file delle risorse una icona per sostituirla con un'altra, e la compilazione non andava a buon fine, però questa volta con messaggio di errore e stop (l'altra volta si bloccava senza messaggi).
    Al quarto-quinto tentativo, tutto è andato a posto, senza modifiche (ho fatto un paio di volte clean project, run qmake, rebuild all, ecc, ma niente modifiche al codice).

    Per il resto, ci devo ragionare su, nel senso che devo confrontare quanto avevo in mente di fare con quanto proposto (che prendo come consigli di buona programmazione, ed è per questo che mi rivolgo a voi): il fattore tempo per me è relativo, in quanto la creazione di programmi per me è relegata "al tempo libero", non è per professione, ma comunque mi piace fare "le cose fatte bene", anche se poi si può sempre migliorare...
    Quote Originariamente inviata da MItaly Visualizza il messaggio
    Non la vedo come una cosa così essenziale in realtà, per due motivi:
    - i punti dove fai riferimento alla stessa icona mi aspetto siano veramente pochi;
    - il punto in cui vai a leggere il file di configurazione per caricare l'icona mi aspetto sia uno solo.
    Per questo direi che almeno ICONA1_PATH è probabilmente abbastanza inutile.

  6. #6
    Utente di HTML.it L'avatar di ing82
    Registrato dal
    Sep 2014
    Messaggi
    177
    Tenendo conto dei consigli ricevuti, direi che un modo di procedere potrebbe essere il seguente:


    • sfrutto il file delle risorse (*.qrc), così le icone di default sono linkate staticamente;
    • per ovviare al problema di possibili cambi futuri dell'icona di default, nel file delle risorse si può sfruttare l'alias del file stesso.

    Se ad esempio, il file è icona1.png, e il prefisso nel file .qrc è /icon, nel file .qrc stesso troverò le seguenti righe

    <qresource prefix="/icon">
    <file alias="defaultIcona1">icona1.png</file>
    </qresource>
    Nel codice quindi, al posto del percorso ":/icon/icona1.png", trovo il suo alias, ":/icon/defaultIcona1", e in caso di modifica, l'unico punto in cui agire è il file delle risorse. Ne segue che è quindi inutile creare
    codice:
    #define ICONA1_PATH ":/icon/icona1.png"
    salvo voler scovare errori di battitura a compile-time (v. anche sotto e precedente intervento di MItaly)

    • per la possibilità di modifica da parte dell'utente, ci si appoggia ad un file delle risorse (.INI).

    Credo che il ragionamento sia analogo sfruttando anche il registro di windows, ma per "credenze personali", meno lo si tocca, meglio è, quindi farò riferimento solo al file .ini

    • diversamente da quanto pensato inizialmente, nel file .ini di default, non è necessario memorizzare l'indirizzo dell'icona di default, in quanto già QSettings prevede la restituzione di un valore di default, che ora è l'alias del file dell'icona. Quindi, dove prima avevo
      codice:
      QIcon(":/icon/icona1.png")
      ora, definita "setting" l'istanza opportuna di QSettings, e definita K_ICONA1 la relativa chiave nel file .ini, ho
      codice:
      QIcon(setting.value(K_ICONA1,":/icon/defaultIcona1").toString());

    In questo modo, se l'impostazione di default del programma non è stata cambiata, la chiave non c'è, e viene restituito il valore di default, ":/icon/defaultIcona1", mentre se la chiave è stata modificata, restituisce il valore che è stato memorizzato.

    Dovrebbe funzionare.

    Mi resta da provare cosa succede e/o come gestire il seguente caso: parto con l'icona di default, l'utente la modifica, lo stesso poi decide di tornare all'icona di default.
    Devo capire infatti se, quando reimposto l'icona di default, è meglio usare
    codice:
    setting.remove(K_ICONA1)
    cioè rimuovo completamente la chiave dal file .ini, oppure usare
    codice:
    setting.setValute(K_ICONA1,":/icon/defaultIcona1")
    Pensavo di usare remove, in modo da avere il file .ini con il minor numero di chiavi possibili, anche se non dovrebbe costituire un grosso handicap qualche chiave in più o in meno, almeno credo, non ho eperienza a riguardo.

    Sviluppi futuri:
    • credo che lo stesso ragionamento possa valere per qualsiasi impostazione si voglia lasciare la possibilità di modifica da parte dell'utente;
    • nel caso di programma usato da più utenti, e ognuno ha le sue configurazioni preferite, si possono memorizzare file .ini differenti, lasciando tutto invariato, ma cambiando semplicemente il modo con cui viene creata l'istanza di QSettings che permette l'accesso al file .ini, cioè trovare il modo in cui accedere mediante le medesime funzioni a file .ini diversi.



    Quote Originariamente inviata da MItaly Visualizza il messaggio
    Non necessariamente, dall'editor delle risorse puoi sempre definire un alias per il file, in modo che venga inserito nel file delle risorse con un nome diverso da quello del file/percorso che ha effettivamente a livello di file system.
    Adesso credo di averne capito l'utilità

    Quote Originariamente inviata da MItaly Visualizza il messaggio
    Questo può essere utile più che altro per beccare a compile-time eventuali errori di battitura.
    Prestando la dovuta attenzione, il problema diventa secondario, ma può sempre essere una risorsa da non dimenticare.

    Quote Originariamente inviata da MItaly Visualizza il messaggio
    Non la vedo come una cosa così essenziale in realtà, per due motivi:
    - i punti dove fai riferimento alla stessa icona mi aspetto siano veramente pochi;
    - il punto in cui vai a leggere il file di configurazione per caricare l'icona mi aspetto sia uno solo.
    Per questo direi che almeno ICONA1_PATH è probabilmente abbastanza inutile.
    Ok.

    Grazie.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.