QT QSqlTableModel - цвет фона в заданном столбце данных

У меня есть пример tableView:

введите здесь описание изображения

Например, когда статус столбца данных равен S. Цвет фона таблицы будет зеленым, а когда N — красным.

Пример того, что я хочу:

введите здесь описание изображения

Мой код:

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
{
    ui->setupUi(this);
       //Con Db...

        model = new QSqlTableModel(this);
        model->setTable("app");
        model->setEditStrategy(QSqlTableModel::OnManualSubmit);
        model->select();
        model->setHeaderData(0, Qt::Horizontal, tr("number"));
        model->setHeaderData(1, Qt::Horizontal, tr("status"));
        ui->tableView->setModel(model);
}

Может ли кто-нибудь помочь мне?


person user628298    schedule 08.03.2014    source источник


Ответы (1)


Переосуществите, то есть подкласс QSqlTableModel, и предоставьте реализацию функции данных, как показано ниже. Обратите внимание, что реализация MySubClassedSqlTableModel должна быть помещена в заголовочный файл, обработанный MOC (обычно это делается автоматически).

  #include <QSqlTableModel>
    class MySubClassedSqlTableModel : public QSqlTableModel
    {
        Q_OBJECT
        public:
           MySubClassedSqlTableModel(QObject * parent = 0, QSqlDatabase db = QSqlDatabase())
           : QSqlTableModel(parent,db) {;}
           QVariant data ( const QModelIndex & index, int role = Qt::DisplayRole ) const
           {
              if(role==Qt::BackgroundColorRole)
              {
                 const QVariant value(data(index,Qt::DisplayRole));
                 return QVariant(QColor(value.toString()=="S"?Qt::green:Qt::red));
              }
              return QSqlTableModel::data(index,role);
           }
    };

    model = new MySubClassedSqlTableModel(this); //<==== use your model
            model->setTable("app");
            model->setEditStrategy(QSqlTableModel::OnManualSubmit);
            model->select();
            model->setHeaderData(0, Qt::Horizontal, tr("number"));
            model->setHeaderData(1, Qt::Horizontal, tr("status"));
            ui->tableView->setModel(model);

Кстати, создание подклассов — это то, что вам нужно делать в большинстве случаев, когда вы хотите настроить поведение.

person user2672165    schedule 08.03.2014
comment
@ user628298: Не компилировал. Вернитесь, если он не скомпилируется. - person user2672165; 10.03.2014
comment
Ошибка: qvariant.h:480: ошибка: 'QVariant::QVariant(Qt::GlobalColor)' является закрытым QVariant(Qt::GlobalColor) Q_DECL_EQ_DELETE; ^ - person user628298; 10.03.2014
comment
@user628298: исправлено, надеюсь. - person user2672165; 10.03.2014
comment
Как увеличить размер столбцов таблицы, знаете? пример: 300 пикселей в каждом столбце, шрифт 14 пикселей. - person user628298; 11.03.2014
comment
Это не совсем правильный путь, я считаю. Поскольку эта функция полностью связана с представлением, вам лучше создать подкласс QStyledItemDelegate и повторно реализовать метод рисования. После этого вы можете применить делегирование к столбцу с помощью метода ui-›tableView-›setItemDelegateForColumn(ColumnId, new QMyItemDelegate(this)); - person Artem E; 12.11.2014