2016-10-26 2 views
0

Je travaille sur une interface graphique Qt 4.8.6 sur un système Linux embarqué. L'interface graphique charge un grand nombre d'images en appelant:QPixmap sur un fichier manquant créer un message de débogage

QPixmap("/path/to/file.png") 

Toutefois, si le fichier ne peut être trouvé, Qt ne sera pas un avertissement ou une erreur sur la sortie de débogage. C'est ce que je voudrais réaliser, préférable sur le débogage et la version finale.

Je suis venu avec une solution, où je surcharger le constructeur QPixmap avec le mien et faire la vérification de fichiers.

class QPixmapExtended : public QPixmap 
{ 
public: 
    QPixmapExtended(const QString& fileName) : QPixmap(fileName) 
    { 
     if(!QFile::exists(fileName)) 
     { 
      qDebug() << "File not found: " << fileName; 
     } 
    } 
}; 

Cependant, je voudrais savoir s'il y a une solution plus intelligent à ce problème?

Merci et acclamations, Martin

+0

Évitez les classes de valeurs de sous-classes. Utilisez la composition à la place: QFile pour vérifier si le fichier est là, QImageReader pour essayer de le lire, jusqu'à QPixmap pour stocker le résultat. – peppe

Répondre

0

Peut-être par défaut-construction QPixmap puis appeler QPixmap :: load() pourrait être une option pour vous, il y a une valeur de retour booléenne qui indique si l'appel a réussi ou non.

Pour obtenir le remplacement DROPIN je crois que vous êtes à la recherche, vous pouvez encapsuler cela en fonction globalement accessible:

QPixmap loadPixmap(const QString& filename) { 
     QPixmap result; 
     if (!result.load(filename)) { 
     // print error message 
     } 
     return result; 
} 

Depuis Qt partage interne des données d'image, il est pas trop un problème que la QPixmap est renvoyé par valeur.

0

itérez les pixmaps et vérifiez si l'un d'entre eux n'a pas pu être chargé: QPixmap::isNull() vous indiquera qu'un chargement de pixmap donné a échoué.

Vous devriez probablement avoir une sorte de mappage entre les symboles, les noms de fichiers et les pixmaps. E.g .:

typedef enum { 
    p_upArrow, 
    p_downArrow 
} PixmapSymbol; 

struct Entry { 
    PixmapSymbol symbol; 
    const char * filename; 
}; 

Entry const entries[] = { 
    { p_upArrow, "/path/UpArrow.png" }, 
    { p_downArrow, "/path/DownArrow.png" } 
}; 

QMap<PixmapSymbol, QPixmap> void loadPixmaps() { 
    QMap<PixmapSymbol, QPixmap> pixmaps; 
    for (auto & entry : entries) { 
    auto pixmap = QPixmap{QString::fromUtf8(entry.filename)}; 
    pixmaps.insert(entry.symbol, pixmap); 
    if (pixmap.isNull()) 
     qDebug() << "Failed to load pixmap" << entry.filename; 
    } 
}; 

int main(int argc, char ** argv) { 
    QApplication app{argc, argv}; 
    auto const pixmaps = loadPixmaps(); 
    QLabel ui; 
    ui.setPixmap(pixmaps[p_upArrow]); 
    ui.show(); 
    return app.exec(); 
} 
+0

à part une belle boucle compacte qui fait tout le chargement de l'image, que gagnerais-je de cette construction? Et parce que j'ai plusieurs classes qui ont besoin de charger des images, je devrais répéter cette construction plusieurs fois .... –

+0

Vous devez déjà fournir une liste de noms de fichiers pixmap, et quelques moyens symboliques de se référer à eux. Je suggère que l'utilisation d'un symbole qui est une énumération vous donne plus de flexibilité qu'un symbole qui résout directement à un pixmap. Et vous avez demandé comment charger ces pixmaps afin que vous puissiez indiquer des erreurs: Je montre comment le faire sans jouer avec la classe pixmap elle-même. –