2017-08-19 1 views
0

Hier ist das Problem, ich erstellte eine C++ - Klasse, die eine lokale Datei lädt und für jede neue Zeile ein Signal sendet. Was ich tun möchte, ist in meiner QML-Datei Ich möchte diese Zeilen in eine Listenansicht, die ich bereits getan habe, aber das Problem jetzt ist, dass die C++ - Funktion noch vor dem Start der Anwendung lädt, würde es die Datei lesen und füllen Sie die Listenansicht und dann die Seite anzeigen.C++ - Funktion wird aufgerufen, bevor die Seite auch mit Component.onCompleted lädt

Hier ist mein Code.

main.cpp

#include <QtCore/QCoreApplication> 
#include <QtGui/QGuiApplication> 
#include <QtQuick/QQuickView> 
#include <QtQml> 


#include "boot.h" 

int main(int argc, char *argv[]) 
{ 
    QCoreApplication::setApplicationName("xyz"); 
    QCoreApplication::setAttribute(Qt::AA_X11InitThreads); 

    qmlRegisterType<Boot>("xyx", 1, 0, "Boot"); 

    QGuiApplication app(argc, argv); 

    QQuickView quickView; 
    quickView.setSource(QUrl(QStringLiteral("qrc:/Boot.qml"))); 
    quickView.setResizeMode(QQuickView::SizeRootObjectToView); 
    quickView.showMaximized(); 

    return app.exec(); 
} 

Boot.qml

import QtQuick 2.0 
import "." 
import QtQuick.XmlListModel 2.0 
import xyz 1.0 

Item{ 

    Loader{ 
     id: bootPageLoader 
     anchors.fill:parent 
     sourceComponent: bootSystem 
     focus:true 
    } 

    Component{ 
     id:bootSystem 

     Rectangle{ 
      width: 640 
      height: 480 
      color:"black" 
      focus:true 

      Component.onCompleted: { 
       booting.load(); 
      } 

      Boot{ 
       id:booting 

       onErrorMsgChanged: { 
        console.log("New Boot Log Message: " + errorMsg); 
        //This is where I am adding to the listview every time I receive a signal 
        logModel.append({msg:errorMsg}); 
        log.positionViewAtEnd(); 


       } 
      } 

      ListView { 
       id:log 
       anchors.left: parent.left 
       anchors.leftMargin: 10 
       anchors.topMargin: 10 
       anchors.bottomMargin:10 
       anchors.top: parent.top 
       width:(parent.width*40)/100 
       height:parent.height-20 

       model: BootLogModel{ 
        id:logModel 
       } 
       delegate: Text { 
        text: msg 
        color: "green" 
        font.pixelSize: 15 
       } 
      } 

      Text{ 
       id: loading 
       anchors{ 
        horizontalCenter: parent.horizontalCenter 
        verticalCenter: parent.verticalCenter 
       } 

       text: "LOADING..." 
       color: "white" 
       font.pixelSize: Math.round(parent.height/20) 
       font.bold: true 
      } 
     } 
    } 
} 

BootLogModel.qml

import QtQuick 2.0 
ListModel { 

} 

Hier ist der C++ Code s nippet

In boot.h

#ifndef BOOT_H 
#define BOOT_H 

#include <QObject> 
#include <QString> 
#include <string> 

class Boot : public QObject{ 
    Q_OBJECT 
    Q_PROPERTY(QString errorMsg READ errorMsg NOTIFY errorMsgChanged) 

    public: 
     explicit Boot(QObject *parent = 0); 
     Q_INVOKABLE void load(); 

     QString errorMsg(); 
     void setErrorMsg(const QString &errorMsg); 

    signals: 
     void errorMsgChanged(); 
    private: 
     QString m_errorMsg; 
}; 
#endif // BOOT_H 

In boot.cpp

Boot::Boot(QObject *parent) : QObject(parent) 
{ 
} 
QString Boot::errorMsg() 
{ 
    return m_errorMsg; 
} 

void Boot::setErrorMsg(const QString &errorMsg) 
{ 
    m_errorMsg = errorMsg; 

    emit errorMsgChanged(); 
} 

void Boot::load() 
{ 
    int i = 0; 
    while(i < 10000) 
    { 
     setErrorMsg("test: " + QString::number(i)); 
     i++; 
    } 

} 

ich diese zuerst sehen, bevor die GUI I first see this before the GUI

Dann ist dies das GUI Wesen angezeigt und bereits ausgefüllt Then this is the GUI being displayed and already populated

+0

Wenn Ihr Problem ist, diese drucken Daten, dann habe ich eine Lösung für diesen speziellen Fall, sollten Sie auch wissen, dass die Schleifen nicht GUI-freundlich sind. – eyllanesc

+0

Bitte legen Sie die Lösung, die es funktionieren könnte. Das Problem ist nicht mit der Schleife, was ich tun möchte, ist, wenn ich "SetErrorMsg" anrufe, möchte ich, dass es die Nachricht zur Listview hinzufügt und die GUI aktualisiert. Ich möchte das in jeder anderen Funktion machen. –

+0

sage ich habe eine Funktion namens "play" Was ich tun möchte, ist, wenn play einen Fehler hat, dann möchte ich die Fehlermeldung einstellen und ein Signal ausgeben, das die GUI aktualisieren wird, wenn es sich ändert. –

Antwort

3

Loops sind immer ein Problem in einer GUI, ist es immer besser für eine freundlichere Alternative zu der GUI zu suchen, in diesem Fall eines QTimer:

boot.h

int counter = 0; 

bool.cpp

void Boot::load() 
{ 
    QTimer *timer = new QTimer(this); 

    connect(timer, &QTimer::timeout, [timer, this](){ 
     setErrorMsg("test: " + QString::number(counter)); 
     counter++; 
     if(counter > 10000){ 
      timer->stop(); 
      timer->deleteLater(); 
     } 
    }); 
    timer->start(0); //delay 
} 
Verwandte Themen