[gelöst] TableView Hintergrundfarbe von Zellen ändern

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

[gelöst] TableView Hintergrundfarbe von Zellen ändern

Beitrag von Mogli123 »

Hallo,

ich bin neu in Qt und c++ und hoffe mir kann jemand weiterhelfen.
Ich möchte den Hintergrund einzelner Zellen färben und weiß noch nicht richtig wie das geht.
Zurzeit probiere ich es mit "QItemDelegate" komme aber nicht richtig voran (vileicht bin ich auch auf dem Holzweg).

Ich weiß hier wurde schon mal etwas zu diesem Thema geschrieben, aber ist es auf diesem Weg auf grundsätzlich möglich?
Wenn ja wie genau?


Hier mal der Code:

delegate.h

Code: Alles auswählen

#ifndef DELEGATE_H
#define DELEGATE_H

#include "QItemDelegate"
#include "QObject"
#include "QModelIndex"
#include "QSize"
#include "QBrush"


class delegate : public QItemDelegate
{
    Q_OBJECT
public:
        explicit delegate(QObject *parent = nullptr);

        QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const;

        void setEditorData(QWidget *editor, const QModelIndex &index) const;

        void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const;

        //void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const;


    signals:

    public slots:
};

#endif // DELEGATE_H
delegate.cpp (hier bin ich erlich gesagt noch komplett ratlos wie ich vorgehen muss (ich hoffe mir kann jemand ein Beispiel geben)

Code: Alles auswählen

#include "delegate.h"


delegate::delegate(QObject *parent) :
    QItemDelegate (parent)
{
}

QWidget *delegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    QPalette *tableanpassen = new QPalette(parent);
}

void delegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
    int value = index.model()->data(index,Qt::EditRole).toInt();
    
    
}

void delegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{

}
test_screen.cpp

Code: Alles auswählen

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

//  -- TabelView

//    mytableanpassen = new Tableanpassen(this);

    mydelegate = new delegate(this);

    model = new QSqlQueryModel(this);
    model->setQuery("SELECT * FROM WekzeugWechselWarnung");
    model->setHeaderData(0, Qt::Horizontal, tr("Werkzeug Nr."));
    model->setHeaderData(1, Qt::Horizontal, tr("Zeit"));


    model->setData(model->index(1,2),QBrush(Qt::red), Qt::BackgroundRole);


    ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
    ui->tableView->setModel(model);
    ui->tableView->setItemDelegate(mydelegate);
tes_screen.h

Code: Alles auswählen

#ifndef TEST_SCREEN_H
#define TEST_SCREEN_H

#include <QMainWindow>
#include "QSqlQueryModel"
//#include "tableanpassen.h"
#include "delegate.h"

namespace Ui {
class test_screen;
}

class test_screen : public QMainWindow
{
    Q_OBJECT

public:
    explicit test_screen(QWidget *parent = nullptr);
    ~test_screen();

private:
    Ui::test_screen *ui;
    QSqlQueryModel *model;
    QSqlQueryModel *model_2;
    delegate *mydelegate;
//    Tableanpassen *mytableanpassen;
};

#endif // TEST_SCREEN_H

Vielen Dank
Zuletzt geändert von Mogli123 am 27. September 2018 07:18, insgesamt 1-mal geändert.
Mogli123
Beiträge: 13
Registriert: 25. September 2018 07:37

Re: TableView Hintergrundfarbe von Zellen ändern

Beitrag von Mogli123 »

ich habe es mitlerweile hinbekommen das ich eine einzelne Zelle farbig markieren kann.
Nur stehen jetzt keine Daten mehr in meiner Tabelle...
Die Spalten und Zeilen sind jedoch noch da...
Warum?^^
Oder ist die Methode allgemein nicht geeignet.
Sollte dies eine dumme Frage sein tut es mir leid nur weiß ich wirklich nicht weiter.

hier der neue Code:


delegate.cpp

Code: Alles auswählen

    void delegate::paint (QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
    {
        int row = index.row();
        int col = index.column();

        if (col == 1 && row == 1)
        {
           painter->fillRect(option.rect, option.palette.highlight());
        }
    }


Vielen Dank

delegate.h

Code: Alles auswählen

class delegate : public QItemDelegate
{
    Q_OBJECT
public:
    delegate(QWidget *parent  = nullptr) : QItemDelegate(parent)
    {
    }

    void paint (QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const;

Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: TableView Hintergrundfarbe von Zellen ändern

Beitrag von Christian81 »

Ein QIdentityProxyModel benutzen und data() so überschreiben dass die gewünschten Hintergrundfarben (BackgroundRole) zurückgegeben werden.
Siehe http://doc.qt.io/qt-5/qidentityproxymodel.html#details
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Mogli123
Beiträge: 13
Registriert: 25. September 2018 07:37

Re: TableView Hintergrundfarbe von Zellen ändern

Beitrag von Mogli123 »

Hi,

vielen Dank für die Antwort.
Hab es gestern noch hinbekommen.

Hier den Code falls es jemanden interesiert


.h

Code: Alles auswählen

#ifndef TABLEANPASSEN_H
#define TABLEANPASSEN_H

//#include <QSqlQueryModel>
#include "QSqlRelationalTableModel"



class Tableanpassen : public QSqlQueryModel
{
    Q_OBJECT

public:
    Tableanpassen(QObject *parent = nullptr);

    QVariant data(const QModelIndex &item, int role) const override;


};

#endif // TABLEANPASSEN_H
dazu die .cpp

Code: Alles auswählen

#include <QtWidgets>

#include "tableanpassen.h"


// passt tabellen an (geht noch nicht)


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


QVariant Tableanpassen::data(const QModelIndex &index, int role) const
{
    int row = index.row();
    int col = index.column();

    if(role == Qt::BackgroundRole){
        
            QBrush Background(Qt::red);
            return Background;    
}
    return QSqlQueryModel::data(index, role);
}

aufruf in der .cpp

Code: Alles auswählen

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

    mytableanpassen = new Tableanpassen(this);

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

    ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);

    ui->tableView->setModel(mytableanpassen);
Antworten