Anzeigen von variablen Daten mit einer TableView

Alles rund um die Programmierung mit Qt
Antworten
Mogli123
Beiträge: 13
Registriert: 25. September 2018 07:37

Anzeigen von variablen Daten mit einer TableView

Beitrag von Mogli123 »

Hallo zusammen,

ich bin noch recht neu in Qt und c++ und habe folgendes Problem.

Ich zeige Daten aus einer Datenbank mit einigen TableViews an.
Dies funktioniert auch soweit.
Die Daten sind jetzt aber dynamisch und nicht mehr statisch wie bisher.
Mit dem Timer wollte ich testen ob die Daten sich in der TableView ändern, was aber leider nicht der fall ist.
Was muss ich tun damit die Daten in den TableViews zb alle 10 Sekunden aktualisiert werden?


Hier mein bisheriger code.

main.cpp

Code: Alles auswählen

static int zaehlerFunktion(int& testWert)
{
    testWert ++;
    return testWert;
}

int main(int argc, char *argv[])
{

    QApplication a(argc, argv);

    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName(":memory:");
    if (!db.open()) {
        QMessageBox::critical(nullptr, QObject::tr("Cannot open database"),
            QObject::tr("Unable to establish a database connection.\n"
                        "This example needs SQLite support. Please read "
                        "the Qt SQL driver documentation for information how "
                        "to build it.\n\n"
                        "Click Cancel to exit."), QMessageBox::Cancel);
        return false;
    }

    qint32 TableCustomiseToolChange[30];
    int lengthTableCustomiseToolChange = 30;
    for (int i = 0; i < lengthTableCustomiseToolChange; i++)
    {
        int randInt = rand() % (1010000 - 0) + 1000000;
        TableCustomiseToolChange[i] = randInt;
    }

int testwert = 10;

    QTimer timer;

    QObject::connect(&timer, &QTimer::timeout, [&testwert]()
    {
        zaehlerFunktion(testwert);
    });

    timer.start(1000);
    
    TableCustomiseToolChange [1] = testwert;
    
    //forschleife fült Datenbank
    QSqlQuery query;
    query.exec("Create Table CustomiseToolChange (COLOR varchar(20),"
                               "TOOLNR int primary key, TIME int, POCKETSTATUS varchar(20))");
    for (int i = 0; i < (lengthTableCustomiseToolChange / 3); i++)
    {
        query.prepare("INSERT INTO CustomiseToolChange (COLOR, TOOLNR, TIME, POCKETSTATUS) "
                      "VALUES (:COLOR, :TOOLNR, :TIME, :POCKETSTATUS)");
        query.bindValue(":COLOR", "");
        query.bindValue(":TOOLNR", TableCustomiseToolChange[i * 3 + 0]);
        query.bindValue(":TIME", TableCustomiseToolChange[i * 3 + 1]);
        query.bindValue(":POCKETSTATUS", TableCustomiseToolChange[i * 3 + 2]);
        query.exec();
     }
     
     ...
test_screen.cpp

Code: Alles auswählen

test_screen::test_screen(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::test_screen)
{
    ui->setupUi(this);

    myTableCustomiseToolChange = new TableCustomise(this);
    myTableCustomiseToolChange->setQuery("SELECT * FROM CustomiseToolChange");
    myTableCustomiseToolChange->setHeaderData(1, Qt::Horizontal, tr("Werkzeug Nr."));
    myTableCustomiseToolChange->setHeaderData(2, Qt::Horizontal, tr("Zeit (hh:mm:ss)\n / Teile"));
    ui->TableCustomiseToolChange->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
    ui->TableCustomiseToolChange->setModel(myTableCustomiseToolChange);
    ui->TableCustomiseToolChange->setColumnHidden(0, true);
    ui->TableCustomiseToolChange->setColumnHidden(3, true);
    ui->TableCustomiseToolChange->verticalHeader()->hide();
    ui->TableCustomiseToolChange->setStyleSheet("QHeaderView::section { background-color:grey }");
    ui->TableCustomiseToolChange->setStyleSheet("border: 2px solid black; background: grey");
    ui->TableCustomiseToolChange->setSelectionMode(QAbstractItemView::NoSelection);
    
    ...

tableCustomise.pp

Code: Alles auswählen

TableCustomise::TableCustomise(QObject *parent)
    : QSqlQueryModel(parent)
{
}

QVariant TableCustomise::data(const QModelIndex &index, int role) const
{

    if(role == Qt::TextAlignmentRole)
    {
        return Qt::AlignCenter;
    }

    if (role == Qt::DisplayRole)
    {
        if (index.column() == 0)
        {
            return displayData(index, limits[0]);
        }
qint32 contentForTime = index.sibling(index.row(), index.column()).data(Qt::EditRole).toInt();

        if (index.column() == 2 && contentForTime >= 1000000)
        {
            return setTimeFormat(index);
        }
    }

    // setzt die benötigte Hintergrundfarbe
    if(role == Qt::BackgroundRole)
    {
        return backgroundData(index);
    }

    return QSqlQueryModel::data(index, role);
}


///////////////////////////////////////////////////////
//--------        Funktionen         ------------------
///////////////////////////////////////////////////////


QString TableCustomise::displayData(const QModelIndex &index, qint32 limit)const
{
    qint32 contentForVerificationStatus = index.sibling(index.row(), index.column() + 3).data(Qt::EditRole).toInt();
    qint32 contentForColor = index.sibling(index.row(), index.column() + 2).data(Qt::EditRole).toInt();

            if (index.column() == 0)
            {
                // Bedingung für grünen Hintergrund
                if ((limit <= contentForColor   &&  contentForColor < 1000000) || (contentForVerificationStatus == 1))
                {
                    return "green";
                }

                // Bedingung für gelben Hintergrund
                else if (0 < contentForColor && contentForColor <limit)
                {
                    return "yellow";
                }

                // Bedingung für roten Hintergrund
                else if (contentForColor == 0 || contentForColor > 1000000)
                {
                    return "red";
                }
                // bedingung für die Tabelle "TableToolForRemoval" (Tabelle 3) da diese eine Spalte weniger hat
                else
                {
                    return "yellow";
                }
            }

}


QVariant TableCustomise::backgroundData(const QModelIndex &index)const
{

    QString content = index.sibling(index.row(), 0).data(Qt::DisplayRole).toString();
        if ( content == "red" )
        {
            return QBrush(Qt::red);
        }
        else if (content == "yellow")
        {
           return QBrush(Qt::yellow);
        }
        else if (content == "green")
        {
            return QBrush(Qt::green);
        }
        else
        {
            return QBrush(Qt::magenta);
        }
}

  // setzt wenn Bedingung erfüllt richtiges Zeitformat
QString TableCustomise::setTimeFormat(const QModelIndex &index)const
{
    qint32 contentForTime = index.sibling(index.row(), index.column()).data(Qt::EditRole).toInt();

    if (index.column() == 2 && contentForTime >= 1000000)
    {
        QString formattedTime;
        QString formattedTime_2;

        qint32 time = contentForTime - 1000000;
        int h = time/(60*60);
        int min = ((time - h * (60 * 60)) / 60);
        int sec = time % 60;

        formattedTime.append(QString("%1").arg(h,2,10,QLatin1Char('0')) + ":" +
                             QString("%1").arg(min,2,10,QLatin1Char('0')) + ":" +
                             QString("%1").arg(sec,2,10,QLatin1Char('0')));

        return formattedTime;
     }
}

Ich hoffe das mir jemand helfen kann.

Vielen Dank im Voraus.

Mit freundlichen Grüßen
Mogli
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Re: Anzeigen von variablen Daten mit einer TableView

Beitrag von solarix »

Deine Klasse "TableCustomise" könnte mittels eines periodischen Timers "this->query()->exec();" aufrufen. Das könnte evtl. funktionieren..
Aber so richtig hübsch ist das nicht. Etwas besser wäre von "QSqlTableModel" zu erben (Verzicht auf "setQuery()", sondern mit "setTable()" konfigurieren) und danach periodisch "this->select()" aufrufen.

Cheers,
solarix
Antworten