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

tableView get data from hidden cells



  • Hi,
    I'm new in Qt and c++ and have the following problem.
    I display som test data in a table view. This works so far.
    Now I had creat a column "Color".
    This column I hide becouse this Column is only for the information that I know how i had to color the row.
    My problem is that I can't read the data from the cells with the color information in it, becouse they are hidden.
    Is there any way to get the information from the cells?

    .cpp

    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);
    }
    
    #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->setStyleSheet("QHeaderView::section { background-color:grey }");
    

    Thank you

    Regards


  • Moderators

    @Mogli123 said in tableView get data from hidden cells:

    My problem is that I can't read the data from the cells with the color information in it, becouse they are hidden.

    what?
    Hiding columns should only affect the view, not the model (which is actually holding the data).



  • If I remove the hide comment, to color the background works.
    I use the following test database.

    #ifndef DB_H
    #define DB_H
    
    #include <QMessageBox>
    #include <QSqlDatabase>
    #include <QSqlError>
    #include <QSqlQuery>
    
    // Datenbank für Tabellen
    
    
    static bool createConnection()
    {
        QSqlDatabase db_Werkzeug_Wech_Warn = QSqlDatabase::addDatabase("QSQLITE");
        db_Werkzeug_Wech_Warn.setDatabaseName(":memory:");
        if (!db_Werkzeug_Wech_Warn.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;
        }
    
    // inhalte für tabellen + default überschrift (wird in "test_screen.cpp" überschrieben
    
    //********************************************
    //  -- Tabelle 1 für Werkzeug Wechsel Warnung --
    //********************************************
    
        QSqlQuery query;
        query.exec("Create Table WekzeugWechselWarnung (COLOR varchar(20), "
                   "NR int primary key,ZEIT varchar(20))");
        // bei NR int ist "primary key" gesetzt => jede Zahl kann nur einmal vorkommen
        // fals eine Zahl doppelt vorkommt wird die letzt Zeile (mit der gleichen Zahl) ingoriert
        query.exec("insert Into WekzeugWechselWarnung values('red', '3', '01:32')");
        query.exec("Insert Into WekzeugWechselWarnung values('yellow', '4', '00:25')");
        query.exec("Insert Into WekzeugWechselWarnung values('red', '2', '12:45')");
        query.exec("Insert Into WekzeugWechselWarnung values('green', '1', '04:36')");
        query.exec("Insert Into WekzeugWechselWarnung values('yellow', '6', '00:10')");
    
    

    I have no idea how I can solve the problem.
    I hope someone can halp me.

    Thank you


  • Moderators

    @Mogli123
    now i see. You background color logic is way beyond ugly.

    Rather do something like this (in your data() method):

    if(role == Qt::BackgroundRole )
    {
        // abfrage welche Hintergrundfarbe benötigt wird
        QString inhalt = index.sibling(index.row(), COLOR_COLUMNINDEX).data(Qt::DisplayRole).toString();
        if ( inhalt == "red" )   return QBrush(Qt::red);
        else if (inhalt == "yellow") return QBrush(Qt::yellow);
        ....
    }
    


  • Thank you for your answer.

    Your example looks much better but how works it exactly?
    In which way I have to declare "COLOR_COLUMNINDEX"?
    Sorry I'm very new.
    I'm very grateful for each help and tip.

    Thank you


  • Moderators

    @Mogli123 said in tableView get data from hidden cells:

    Your example looks much better but how works it exactly?

    it exactly returns what was requested from the model.
    Your code expects a specific call order. You expect that the Display role is requested first before any other role of the specific row (since you are using static variables to determine the color).
    My code also checks the contents of your color column, but this way is independent from the call order.

    The color column index is the index number of the color column in your data. 0 for the first column, 1 for the second, and so on...
    Seems like it's 0 in your case?



  • Thank you very much.
    It works. :)


Log in to reply