QDateTime rechnen



  • Hallo

    Ich versuche mit 2 QDateTime zu rechnen. Leider bekomme ich immer Fehlermeldung.

    QDateTime time_start= QDateTime::currentDateTime();
    QDateTime time_stop=QDateTime::fromString("Mo 12.12.2011 20:59:03","ddd dd.MM.yyyy hh:mm:ss")
    
    QDateTime time_dif=time_stop-time_start;
    
    QString text_dif;
    text_dif.setNum(time_dif, 'f', 3);
    
    ui->label->setText(text_dif);
    

    Fehler:no match for 'operator-' in 'time_alt - time'
    Fehler:no matching function for call to 'QString::setNum(QDateTime&, char, int)'

    Gruss Sascha



  • Eine QDateTime-Instanz repräsentiert einen Zeitpunkt. Das passt nicht zu "Differenz zweier Zeitpunkte als QDateTime darstellen", oder?
    Du suchst (je nach gewünschter Genauigkeit) QDateTime::daysTo(), secsTo() oder msecsTo().



  • Hallo
    Ist das richtig so?

    QDateTime last(QDateTime::fromString("Di 13.12.2011 22:00:00","ddd dd.MM.yyyy hh:mm:ss"));
    QDateTime now = QDateTime::currentDateTime();
    
    ui->label->setText(text);
    ui->label_2->setText(text_alt);
    ui->label_3->setText(QString("%1").arg(double(last.secsTo(now))/3600,0,'f',2));
    


  • isensa schrieb:

    Hallo
    Ist das richtig so?

    Keine Ahnung, kommt drauf an was du erreichen willst!
    Anzahl Sekunden / 60 = Anzahl Minuten.
    Anzahl Minuten / 60 = Anzahl Stunden.
    Wenn du also die Anzahl der vergangenen Stunden anzeigen willst, ist das richtig.
    Mit den Sekunden kannst du aber auch wunderbar eine formatierte Ausgabe ala "22 Stunden, 4 Minuten, 33 Sekunden" o.Ä. machen. Eine freie Funktion würde sich dazu doch anbieten 😉 Dann musst du nicht immer "in place" umrechnen.



  • hallo
    Die Berechnung ist für den Moment ok. Mit Funktionen muss ich mich erst noch rein denken. Bei VB Net geht das einfacher als bei Qt (c++).

    Gruss
    Sascha



  • Hallo
    In einem Textfile habe ich verschiedene Werte eingetragen. Die möchte ich Auslesen und Berechnen. Mein Problem ist die Werte zu Trennen und in ein Array zu speichen oder wird das anderst gelöst?

    QString fileName="time.txt";
       Datei öffnen
       QFile file(fileName);
       file.open(QIODevice::ReadOnly | QIODevice::Text); // Als Text-Datei nur zum Lesen öffnen
       ui->textEdit->setText(file.readAll()); // Datei komplett auslesen und in das TextEdit setzen
       // array speichern
       .....
    
       file.close(); // Datei wieder schließen
    

    time.txt
    Di 13.12.2011 07:30
    Di 13.12.2011 09:00
    Di 13.12.2011 09:15
    Di 13.12.2011 12:00
    Di 13.12.2011 13:00
    Di 13.12.2011 17:00



  • Hallo

    Irgendwie drehe ich mich im Kreis.

    Ich bekomme immer 0 im Array.

    QFile file("time.txt");
    QDataStream inputStream(&file);
    QStringList array;
    QString temp;

    if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
    return;

    while(!inputStream.atEnd()) {
    inputStream >> temp;
    array << temp.split(";");
    }

    ui->textEdit->setText((QString)array.count());

    Und wenn ich das Array direkt Anspreche, bekomme ich keinen Inhalt.

    ui->textEdit->setText((QString)array[0]);



  • array << temp.split(";");
    

    time.txt
    Di 13.12.2011 07:30
    Di 13.12.2011 09:00
    Di 13.12.2011 09:15
    Di 13.12.2011 12:00
    Di 13.12.2011 13:00
    Di 13.12.2011 17:00

    Das passt für mich nicht zusammen 😉
    Dann würde ich readLine nehmen und das Zeile für Zeile splitten.

    [Edit]

    ui->textEdit->setText((QString)array[0]);

    Was soll das sein?

    Wie wäre es mit:

    foreach(const QString &text, array)
        ui->textEdit->setText(text);
    


  • Hallo
    Werde ich ausprobieren. Nur eins verstehe ich noch nicht. Wie kann ich die einzelnen Zeiten
    (z.b. zeile3 - zeile2) rechnen? Array[2]-array[1] oder geht das anderst? mir gehts nur um die Werte auszulesen.



  • Ich weiß zwar nicht genau was Du mit QDateTime berechnen willst aber als start kann ich Dir das bieten:

    mainwindow.h

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include "ui_mainwindow.h"
    #include <QtCore/QDateTime>
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    public:
        explicit MainWindow(QWidget *parent = 0);
    
    protected:
        void changeEvent(QEvent *e);
    
    private slots:
        void on_pushButton_clicked();
    
    private:
        void readFile(const QString &filename);
        Ui::MainWindow ui;
        QList<QDateTime> m_dateTime;
    };
    
    #endif // MAINWINDOW_H
    

    mainwindow.cpp

    #include "mainwindow.h"
    #include <QtCore/QDebug>
    #include <QtGui/QFileDialog>
    #include <QtCore/QFile>
    #include <QtCore/QTextStream>
    
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent)
    {
        ui.setupUi(this);
    }
    
    void MainWindow::changeEvent(QEvent *e)
    {
        QMainWindow::changeEvent(e);
        switch (e->type()) {
        case QEvent::LanguageChange:
            ui.retranslateUi(this);
            break;
        default:
            break;
        }
    }
    
    void MainWindow::on_pushButton_clicked()
    {
        QString filename = QFileDialog::getOpenFileName(this, trUtf8("Time Datei öffnen"), QString(), trUtf8("Text Datei (*.txt)"));
        if(filename.isEmpty())
            return;
    
        ui.lineEdit->setText(filename);
        readFile(filename);
    }
    
    void MainWindow::readFile(const QString &filename)
    {
        QFile file(filename);
        if(!file.open(QIODevice::ReadOnly|QIODevice::Text))
            return;
    
        QTextStream in(&file);
    
        while(!in.atEnd()){
            QString line = in.readLine();
            line = line.simplified();
            ui.textEdit->append(line);
            QDateTime dt = QDateTime::fromString(line, "ddd dd.MM.yyyy HH:mm");
            m_dateTime.append(dt);
        }
        qDebug() << m_dateTime;
    }
    

    Jetzt hast Du in m_dateTime die Liste mit den QDateTime's.

    Vielleich hilft es ir weiter.



  • Hallo
    Merci für den Code.

    Wie bekomme ich nur ein Datum aus der Liste?

    qDebug() << m_dateTime.count();  // gibt 6 aus. soviel Einträge habe ich
    qDebug() << m_dateTime.at(1).toString(); gibt ""
    

    aber so bekomme ich keinen Wert.



  • Schau mal hier. Also so wie Du es einliest:

    entweder so:

    foreach(const QDateTime &dt, m_dateTime)
            qDebug() << dt.toString("ddd dd.MM.yyyy HH:mm");
    

    oder so:

    for (int i=0; i<m_dateTime.size(); ++i)
            qDebug() << m_dateTime.at(i).toString("ddd dd.MM.yyyy HH:mm");
    


  • Bei mir geht das irgendwie nicht. Im textedit wird zwar angezeigt aber einzeln aufrufen für die Berechnung bekomme ich nicht hin. Ich habe noch ein zusätzliches textEdit_3 versucht die Daten anzuzeigen. Auch das bleibt leer.
    Beim qDebug wird jeweils "" angezeigt.

    void MainWindow::readFile(const QString &filename)
    {
        QFile file(filename);
        if(!file.open(QIODevice::ReadOnly|QIODevice::Text))
            return;
    
        QTextStream in(&file);
    
        while(!in.atEnd()){
            QString line = in.readLine();
            line = line.simplified();
            ui.textEdit->append(line);
            QDateTime dt = QDateTime::fromString(line, "ddd dd.MM.yyyy HH:mm");
            m_dateTime.append(dt);
            s_dateTime.append(dt.toString());
    
            }
    
        qDebug() << m_dateTime;
        qDebug() << m_dateTime.count();
        qDebug() << m_dateTime.at(2).toString("ddd dd.MM.yyyy HH:mm");
    
        for (int i=0; i<m_dateTime.size(); ++i)
           ui.textEdit_3->setText(m_dateTime.at(i).toString("ddd dd.MM.yyyy HH:mm"));
    }
    


  • Also ich habe das hier getestet, sollte also gehen. Zeig mal die Ausgabe von "qDebug() << m_dateTime; ". Was soll "s_dateTime.append(dt.toString());" sein? Füge mal "qDebug() << dt;" in die While Schleife und zeige die Ausgabe. Nicht das Du leere QDateTime's in der Liste hast!

    Ich habe es getestet mit einer Datei:

    Di  13.12.2011  07:30   
    Di 13.12.2011 09:00        
    Di 13.12.2011 09:15           
    Di        13.12.2011  12:00            
    Di   13.12.2011   13:00
    Di 13.12.2011 17:00
    

    Die zusätzlichen Leerzeichen habe ich mit Absicht rein gemacht um zu testen ob es auch Whitespace unabhängig funktioniert!!!



  • jetzt geht. Nur kann ich das nicht nachvollziehen wo der Fehler gewesen ist.
    Ich vermute Dateiformat. Aber das hatte ich auch schon paar mal kontrolliert.
    Besten Dank


Anmelden zum Antworten