Seite 1 von 1

tableView auf Daten einer versteckten Spalte zugreifen

Verfasst: 2. Oktober 2018 13:45
von Mogli123
Hi,

ich bin noch recht neu in Qt und c++.
Icb habe eine Datenbank in einem .h File erstellt und möchte dise mithilfe einer TableView anzeigen.
Dies klappt auch soweit.
Nun habe ich meine Datenbank um eine Spalte erweitert. Diese enthäht die Farbinformation für den Hintergrund für die einzelnen Zeilen.
Diese Information möchte ich allerdings nur auslesen aber nicht anzeigen und genau hier ist mein Problem. Sobald ich diese Spalte verberge kann ich nicht mehr darauf zugreifen.
Gibt es eine Möglichkeit trotz der Verbergung der Spalte auf die Daten zugreifen zu können?
Wenn ja wie?
Ein kurzes Beispiel würde mir am besten helfen.

Code: Alles auswählen

#include <QtWidgets>
#include "QSqlQueryModel"

#include "tableanpassen.h"


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


QVariant Tableanpassen::data(const QModelIndex &index, int role) const
{
    bool  static s_red = false;
    bool  static s_yellow = false;
    bool  static s_green = false;
    bool  static s_gray = false;

    //Zentriert den Text in den Zellen
    if(role == Qt::TextAlignmentRole)
    {
        return Qt::AlignCenter;
    }

    //setzt die gewünschte Hintergrundfarbe
    if(role == Qt::BackgroundRole )
    {

    // abfrage welche Hintergrundfarbe benötigt wird
    QString inhalt = index.data(Qt::DisplayRole).toString();
            if ( inhalt == "red" )
            {
                s_red = true;
                s_yellow = false;
                s_green = false;
                s_gray = false;
            }
            if (inhalt == "yellow")
            {
                s_red = false;
                s_yellow = true;
                s_green = false;
                s_gray = false;
            }
            if (inhalt == "green")
            {
                s_red = false;
                s_yellow = false;
                s_green = true;
                s_gray = false;
            }
            if (inhalt == "gray")
            {
                s_red = false;
                s_yellow = false;
                s_green = false;
                s_gray = true;
            }


            // Hintergrund wie gewünscht färben
            if (s_red == true)
            {
                QBrush Background(Qt::red);
                return Background;
            }

            if (s_yellow == true)
            {
                QBrush Background(Qt::yellow);
                return Background;
            }

            if (s_green == true)
            {
                QBrush Background(Qt::green);
                return Background;
            }

            if (s_gray == true)
            {
                QBrush Background(Qt::gray);
                return Background;
            }
    }

    //setzt die Daten
    return QSqlQueryModel::data(index, role);
}

Code: Alles auswählen

#include "test_screen.h"
#include "ui_test_screen.h"
#include "tableanpassen.h"


#include <QTableView>
#include "QHeaderView"

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

//***************************************************
//  -- TableView Werkzeug Wechsel Warnung
//***************************************************

    mytableanpassen = new Tableanpassen(this);

    mytableanpassen->setQuery("SELECT * FROM WekzeugWechselWarnung");
    mytableanpassen->setHeaderData(1, Qt::Horizontal, tr("Werkzeug Nr."));
    mytableanpassen->setHeaderData(2, Qt::Horizontal, tr("Zeit"));

    ui->table_werkzeug_wechsel_warnung->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
    ui->table_werkzeug_wechsel_warnung->setModel(mytableanpassen);


    // gewünschte Spalte wird nicht in der Tableview angezeigt
    // Befehl mus nach dem "setModel" Befehl stehen!!!
    ui->table_werkzeug_wechsel_warnung->setColumnHidden(0, true);
    ui->table_werkzeug_wechsel_warnung->setColumnHidden(3, true);
    ui->table_werkzeug_wechsel_warnung->setStyleSheet("QHeaderView::section { background-color:grey }");


Vielen Dank für die Hilfe
Liebe Grüße

Re: tableView auf Daten einer versteckten Spalte zugreifen

Verfasst: 3. Oktober 2018 08:42
von solarix
Woher (von welcher Klasse zu welchem Zweck) möchtest du denn 'auf die Daten zugreifen'? Denn dein Ansatz (die Spalte auzublenden) ist ja nicht verkehrt..

Re: tableView auf Daten einer versteckten Spalte zugreifen

Verfasst: 9. Oktober 2018 07:14
von Mogli123
Vielen Dank für die Antwort,

ich möchte nur die "Farben" in der Tabelle auslesen. Sobald ich diese verstecke geht das aber leider nicht mehr.

Re: tableView auf Daten einer versteckten Spalte zugreifen

Verfasst: 9. Oktober 2018 09:56
von solarix
Das "Problem" habe ich immer noch nicht verstanden, aber ich versuch's mal mit einem Ansatz: du kannst ja über die "data()"-Methode abfragen, was du willst. Von überall her (von einem EventFilter, einem Delegate, einer eigenen View, innerhalb der Model-Klasse, ...)..

Also: wenn du z.B. die ganze Zeile abhängig vom Inhalt der Farben-Spalte markieren möchtest, dann frag doch einfach die entsprechende Spalte ab:

Code: Alles auswählen

QVariant Tableanpassen::data(const QModelIndex &idx, int role) const
{
    if (!idx.isValid())
        return QVariant();
        
   if(role == Qt::BackgroundRole ) {
        QString farbe = data(index(idx.row(), 3),Qt::DisplayRole).toString(); // "Farbe" steht in der Spalte 3
        if (farbe == "red")
           return QColor(Qt::red);
   }
 }
Oder natürlich Ansatz 2: du rufst record() auf. Steht beides in der Doku zum QueryModel:

http://doc.qt.io/qt-5/qsqlquerymodel.html#details

Code: Alles auswählen

int salary = model.record(4).value("salary").toInt();
...
int salary = model.data(model.index(4, 2)).toInt();

Re: tableView auf Daten einer versteckten Spalte zugreifen

Verfasst: 9. Oktober 2018 10:31
von Mogli123
Vielen Dank für die Antwort jetz klappt es :D

Code: Alles auswählen


    //setzt die gewünschte Hintergrundfarbe
    if(role == Qt::BackgroundRole )
    {

    // abfrage welche Hintergrundfarbe benötigt wird
    QString inhalt = index.sibling(index.row(), 0).data(Qt::DisplayRole).toString();

        if ( inhalt == "red" )
        {
            return QBrush(Qt::red);
        }
        else if (inhalt == "yellow")
        {
           return QBrush(Qt::yellow);
        }
        else if (inhalt == "green")
        {
            return QBrush(Qt::green);
        }
        else if (inhalt == "gray")
        {
           return QBrush(Qt::gray);
        }
    }


Re: tableView auf Daten einer versteckten Spalte zugreifen

Verfasst: 9. Oktober 2018 11:14
von solarix
... oder natürlich QModelIndex::sibling() .. richtig. Es gibt sooo viele Möglichkeiten ;)

Falls du den DB-Inhalt ändern kannst/darfst: du könntest noch einen Farbnamen nehmen, der QColor(name) direkt interpretieren könnte ("#FF0000" für rot).
Dann könntest du dir noch die ganzen IFs schenken..

Cheers!