April 9, 2019, 9:30 a.m.

QAbstarctTableModel, CheckBox в столбце.

QAbstractTableModel, qcheckbox

Доброго времени суток!

Отображение CheckBox Получилось организовать. Правда возник вопрос чтобы в ячейке отображался только он и по центру. Но вот никак не пойму как сделать что бы выбирался Сheckboх. Cовсем что-то запутался или где-то что-то не дочитал. Буду благодарен за любой пинок в нужном направлении....


modelterminals.h

#ifndef MODELTERMINALS_H
#define MODELTERMINALS_H

#include "FuelNameWizard/terminals.h"

#include <QObject>
#include <QAbstractTableModel>

class ModelTerminals : public QAbstractTableModel
{
    Q_OBJECT
    QVector<Terminals> term;
public:
    ModelTerminals(const QVector<Terminals> vek);

    // QAbstractItemModel interface
public:
    int rowCount(const QModelIndex &parent) const;
    int columnCount(const QModelIndex &parent) const;
    QVariant data(const QModelIndex &index, int role) const;
    QVariant headerData(int section, Qt::Orientation orientation, int role) const;

    // QAbstractItemModel interface
public:
    Qt::ItemFlags flags(const QModelIndex &index) const;

    // QAbstractItemModel interface
public:
    bool setData(const QModelIndex &index, const QVariant &value, int role);
};

#endif // MODELTERMINALS_H

modelterminals.cpp

#include "modelterminals.h"

ModelTerminals::ModelTerminals(const QVector<Terminals> vek)
{
    term = vek;
}


int ModelTerminals::rowCount(const QModelIndex &parent) const
{
    return term.size();
}

int ModelTerminals::columnCount(const QModelIndex &parent) const
{
    Terminals *terminal = new Terminals();
    return terminal->colParam();
}

QVariant ModelTerminals::data(const QModelIndex &index, int role) const
{
    if ( !index.isValid() ) { return QVariant(); }
    Terminals t = term[index.row()];
    switch (role) {
    case Qt::DisplayRole:
        switch (index.column()) {
        case 0: return t.isCheked();                           
        case 1: return t.terminal();                    
        case 2: return t.name();                       
        case 3: return t.serverName(); 
        case 4: return t.database();
        case 5: return t.password();
        default: break;
        }
      break;
    case Qt::CheckStateRole:
        if(index.column() == 0)
            return (t.isCheked() != 0) ? Qt::Checked : Qt::Unchecked;
    break;

    default:
        break;
    }

    return QVariant();
}

QVariant ModelTerminals::headerData(int section, Qt::Orientation orientation, int role) const
{
    //Cоздаем заголовки столбцов модели
    if( role != Qt::DisplayRole ) {
        return QVariant();
    }

    if( orientation == Qt::Vertical ) {
        return section;
    }
    switch( section ) {
    case 0:
        return tr( "" );
    case 1:
        return tr( "АЗС" );
    case 2:
        return tr( "Адрес" );
    case 3:
        return tr( "Сервер" );
    case 4:
        return tr( "Файл БД" );
    case 5:
        return tr( "Пароль" );
    }

    return QVariant();
}


Qt::ItemFlags ModelTerminals::flags(const QModelIndex &index) const
{
    Qt::ItemFlags flags = QAbstractTableModel::flags(index);
    if (index.column() == 0)
    {
        flags |= Qt::ItemIsUserCheckable;
        flags |= Qt::ItemIsSelectable;
    }
    else
    {
        flags |= Qt::ItemIsEditable;
        flags |= Qt::ItemIsSelectable;
    }
    return flags;

}

bool ModelTerminals::setData(const QModelIndex &index, const QVariant &value, int role)
{
    Terminals t = term[index.row()];
    if(!index.isValid())
        return false;
    if(role == Qt::CheckStateRole)
    {
        if(value.toInt() == Qt::Checked)
        {
            t.setIsCheked(1);
            return true;
        }
        else
        {
            t.setIsCheked(0);
            return true;
        }
    }
    return  false;
}

Код заполнения модели данными

    Terminals tr;

    QSqlDatabase db = QSqlDatabase::database();
    QSqlQuery q = QSqlQuery(db);

    QString strSQL = "SELECT DISTINCT t.terminal_id, TRIM(t.name), c.SERVER_NAME, c.DB_NAME, c.CON_PASSWORD FROM TERMINALS t "
            "LEFT JOIN CONNECTIONS c ON t.TERMINAL_ID = c.TERMINAL_ID "
            "LEFT JOIN SHIFTS s ON s.TERMINAL_ID = t.TERMINAL_ID "
            "WHERE t.TERMINALTYPE=3 and s.SHIFT_ID>0 "
            "ORDER BY t.TERMINAL_ID";
    if(!q.exec(strSQL)) {
        qInfo(logInfo()) << Q_FUNC_INFO << "Ошибка получения списка терминалов." << q.lastError().text();
        return;
    }

    while (q.next()){
        tr.setIsCheked(0);
        tr.setTerminal(q.value(0).toInt());
        tr.setName(q.value(1).toString());
        tr.setServerName(q.value(2).toString());
        tr.setDatabase(q.value(3).toString());
        tr.setPassword(passConv(q.value(4).toString()));
        terminals.append(tr);
    }
    modelTerminals = new ModelTerminals(terminals);
    ui->tableViewTerminals->setModel(modelTerminals);
Virtual hosting with 10 percent discount
Virtual hosting with 10 percent discount
EVILEG offers reliable hosting with a 10% discount for virtual hosting and 5% for VPS
2

Добрый день, Руслан

Гляньте, пожалуйста, вот этот топик - QSqlTableModel + QTableView + кастомный делегат в виде чекбокса

Вам нужно добавить делегат, поэтому думаю, что это то, что вам нужно.

Спасибо, это я уже понял. Только нигде не найду законченого примера. :-) Куски кода которые не могу свести воедино.

Comments

Only authorized users can post comments.
Please, Log in or Sign up
Looking for a Job?
14,000.00 руб. - 40,000.00 руб.
Разработчик Qt
Annino, Moscow Oblast, Russia
5,000.00 руб. - 15,000.00 руб.
Дизайнер
Moskovskiy, Moscow, Russia
25,000.00 руб. - 30,000.00 руб.
Разработчик Qt/C++
Barnaul, Altai Krai, Russia

For registered users on the site there is a minimum amount of advertising

A
Aug. 22, 2019, 11:24 p.m.
Aleksandr73

Qt - Test 001. Signals and slots

  • Result:47points,
  • Rating points-6
Aug. 21, 2019, 10:23 a.m.
Andrej Ermoshin

C++ - Test 002. Constants

  • Result:58points,
  • Rating points-2
Aug. 21, 2019, 10:15 a.m.
Andrej Ermoshin

C++ - Test 001. The first program and data types

  • Result:86points,
  • Rating points6
Last comments
Aug. 19, 2019, 7:41 a.m.
Andrej Jankovich

это проблема дистрибутива, попробуйте установить через пакетный менеджер snap Суть проблемы: libQt5Core которая лежит в дистрибутиве требует версию glibc >= 2.25 у вас видимо …
b
Aug. 18, 2019, 6:09 a.m.
bbb116

cqtdeployer /home/aleks/CQtDeployer/bin/cqtdeployer: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.25' not found (required by /home/aleks/CQtDeployer/lib/libQt5Core.so.5) linux mint …
D
Aug. 17, 2019, 9:04 a.m.
Damir

github ChekableTView Правой групповая смена значения при перетаскивании левой как обычно.
Aug. 16, 2019, 1:03 p.m.
Evgenij Legotskoj

Потому, что в минуте 60 секунд
Aug. 16, 2019, 12:16 p.m.
Dmitrij

а почему делитель 60000, а не 1000?
Now discuss on the forum
Aug. 24, 2019, 7:21 a.m.
Evgenij Legotskoj

Не помню, давно уже с QML не работал, по-моему, обычно пишет в консоль, что не находит файл. В любом случае какую-то ошибку в консоль выкидывает. Но если честно, если у вас проект будет ак…
BG
Aug. 24, 2019, 4:27 a.m.
Brjus Gliff

Спасибо, вначале в документации было не понятно что к чему, теперь разобрался
I
Aug. 21, 2019, 8:36 a.m.
Intruder

Александр, мне не нужно перебирать. Вы говорите правильно, сначала я написал избыточный код просто не подумав. Задача такая, мне нужно просто переложить из QMap в атрибуты xml тега все, что там …
Aug. 21, 2019, 3:16 a.m.
nayk1982

Если Вы разрабатываете какую-то универсальную утилиту, которая вообще не привязана к логике, тогда как вариант: 1. Получить список таблиц через QSqlDatabase::tables 2. Для каждой табли…
EVILEG
About
Services
© EVILEG 2015-2019
Recommend hosting TIMEWEB