Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

Version des Modul-Imports prüfen (QML) für alle QML Dateien



  • Hallo Zusammen,

    da wir einen bestimmten Qt Creator Version einsetzen, wollen wir alle QML Dateien in diesem Projekt prüfen, ob diese die richtige Import hat.

    Ziel wäre diese Prüfung automatisch zu starten bei projekt Build.

    Habt ihr eine Idee, wie ich diese durchführen kann?

    Danke in voraus


  • Moderators

    Hi, @Galilio

    ich hab mir vor geraumer Zeit ein kleines Programm geschrieben um genau so etwas herauszufinden.

    Du kannst es gerne verwenden/anpassen,

    aber eine automatisierte Variante hierfür kenne ich leider nicht.

    #include <QCoreApplication>
    #include <QDir>
    #include <QFile>
    #include <QTextStream>
    #include <QVector>
    
    #include <QDebug>
    
    const QString targetInport("2.12");
    const QString keyword;
    const QVector<QString> fileEndings({"qml"});
    
    const bool noComment = true;
    
    void findAndCheckQtQuickImport(const QString &line, const QString &path){
        static const QString checkStr("import QtQuick ");
        if(line.contains(checkStr)){
            if(!line.contains(targetInport)){
                qDebug() << "Wrong QtQuick Import of" << line << "in file:" << path;
            }
        }
    }
    
    int countLines(const QString &path){
        QFile f(path);
        int cnt = 0;
        int cntDbg(0);
    
        if(f.open(QIODevice::ReadOnly | QIODevice::Text)){
            QTextStream read(&f);
            QString line;
            bool comment = false;
            while(!read.atEnd()){
                cntDbg++;
                line = read.readLine();
    
                if(!keyword.isEmpty() && line.contains(keyword,Qt::CaseSensitivity::CaseInsensitive/*Sensitive*/)){
                    qDebug() << "Keywords found at Line"<< cntDbg << "in File" << path << "\t" << line.trimmed();
                }
    
                findAndCheckQtQuickImport(line,path);
    
                if(noComment){
                    line = line.simplified();
                    line.replace(" ","");
    
                    if(line.size() > 0){
                        if(line.leftRef(2) != "//"){
                            if(line.contains("/*"))
                                comment = true;
                            if(line.contains("*/"))
                                comment = false;
                            if(!comment)
                                cnt++;
    //                        else
    //                            qDebug() << line;
                        } else {
    //                        qDebug() << line;
                        }
    //                    else
    //                        cnt++;
                    }
                } else
                    cnt++;
            }
        }
        f.close();
        return cnt;
    }
    
    int parseDir(const QString &path){
        int cnt = 0;
        QDir dir(path);
        QStringList dirs = dir.entryList(QDir::AllDirs |QDir::NoDotAndDotDot);
        QStringList file = dir.entryList(QDir::Files);
        for(const QString &dir : dirs){
                cnt += parseDir(path + "/"+dir);
        }
    
        for(const QString &s : file){
            if(fileEndings.contains(s.split(QChar('.')).last()))
                cnt += countLines(path + "/"+s);
        }
    
        return cnt;
    }
    
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
    
        int count = 0;
    
        QString parse("/path/to/Source/Folder");
        count +=parseDir(parse);
    
    
        QTextStream out(stdout);
        out << "Lines in project: " << parse << ": "<< endl <<count << endl;
    
        return a.exec();
    }
    


  • @J-Hilk
    danke dir

    Eine andere Frage: Da dieser Überprüfung nicht mit der Application zu tun hat wollen wir diese Prüfung in einem UnitTest auslagern und diese Prüfung sollte in einem Script geschrieben werden.

    Was meinst dazu?


  • Moderators

    @Galilio
    Ich hab wenig Erfahrung mit Test-Skripts aber, du kannst natürlich Das Programm ein wenig anfassen und ändern, sodass es den Pfad via argument abruft, und über den StandardOutput Erfolg oder Fehler ausspuckt.

    Dann könnte es einfach als externes Programm ausgeführt werden. Das sollte ja möglich sein.



  • @J-Hilk
    vielen dank

    Gibt es für jede Qt Version einen Quick reference, wo alle Qt Quick referencen aufgelistet sind.

    Ich habe so was ähnlich von ICS gefunden aber es steht nicht detailliert genug.

    Es werden z.B nicht die Reference von 5.12.2 sondern die Version 5.12 aber ich hätte gerne die Referencen 5.12.3 z.B.

    Weiss du wo ich solche Liste finden kann?

    Danke noch mal


  • Moderators

    @Galilio bin mir nicht ganz sicher, was genau du meinst.
    Welche Referenzen genau, in welchem Zusammenhang?



  • @J-Hilk

    Jede Qt Version hat einen bestimmten Library und somit auch QML.
    z.B für Qt Version 5.9 sind die (Qt Quick Object Types) import QtQuick 2.9, (Qt Quick Dialogs QML Types ) import QtQuick.Dialogs 1.2,....

    Da es z.B von Qt 5.9 mehrere Versionen gibt wie 5.9.1, 5.9.2, 5.9.3....5.9.9. Meine Frage für alle diesen Versionen gibt es einen QML Quick Reference (z.B so was in der Art https://www.ics.com/sites/default/files/QML_Reference_A4_031616.pdf)

    Diese Reference ist für 5.6 allgemein aber von Version 5.6 gibt es mehreren Versionen 5.6.1,5.6.2.... so was suche ich .
    Danke in voraus


  • Moderators

    @Galilio
    mmh, nicht das ich wüsste.

    Ich schlage in der Regel immer alles in der online Dokumentation nach. Der ist immer die neueste hinterlegt. Aber bei jeder Funktion / Property steht dabei, in welcher Qt Version sie hinzu gefügt wurde.



  • Hallo zusammen,

    ich komme zurück zu den oben genannten Thema.
    Ich bin auf folgende gestossen:https://doc-snapshots.qt.io/qt5-5.9/qmltypes.html
    Diese Seite bescheibt alle QML Type ja nach dem für welche Qt Version sich handelt.

    Meine Frage: Gibt es eine Liste wo alle Quick Import aufgelistet sind.
    Es ist echt sehr mühsam jede diese QML type zu öffnen und der Import anzuschauen.
    Eine andere Nachteil ist diese Listen sind nur für Version 5.0, 5.1, 5.2,.....5,14
    aber wie ist mit diese Version 5.9.1 z.B. ?

    Danke



  • Hallo zusammen,

    was ich eigentlich meine ist so eine Liste in diesem Art:

    import QtDataVisualization 1.2
    import Qt3D.Animation 2.9
    import QtCharts 2.2
    import QtQuick.Controls 2.2
    import Qt3D.Animation 2.9
    import QtDataVisualization 1.2
    import Qt3D.Render 2.0
    import QtSensors 5.0
    import QtQuick.Controls 1.4
    import QtPositioning 5.2
    import Qt3D.Render 2.0
    import QtQuick.Controls 2.2
    import QtQuick.Controls.Styles 1.4
    import QtAudioEngine 1.1
    import Qt3D.Render 2.0
    import QtMultimedia 5.8
    import QtWebEngine 1.5
    import QtQuick.VirtualKeyboard 2.2
    import QtQml 2.2
    import QtGraphicalEffects 1.0
    import QtBluetooth 5.2
    import Qt.labs.calendar 1.0
    import QtCanvas3D 1.1
    import QtLocation 5.3
    import QtQuick.Extras 1.4
    import QtQuick.Window 2.2
    import Qt.labs.platform 1.0
    import QtQuick.Dialogs 1.2
    import QtQuick.Layouts 1.3
    import Qt3D.Core 2.0
    import Qt3D.Extras 2.0
    import QtQml.Models 2.2
    import QtQuick.Particles 2.0
    import QtWinExtras 1.0
    import QtScxml 5.8
    import Qt.labs.folderlistmodel 2.1
    import Qt3D.Logic 2.0
    import QtQml.StateMachine 1.0
    import Qt3D.Input 2.0
    import QtWayland.Compositor 1.0
    import QtNfc 5.2
    import QtPurchasing 1.0
    import QtQuick.XmlListModel 2.0
    import QtWebView 1.1
    

    Zur Zeit suche ich alle mögliche Import Manuel, was nicht unbedingt praktisch ist.

    Danke


Log in to reply