Добавление CheckBox с QSqlQueryModel, показанным в QTableview, и другие столбцы пусты - PullRequest
0 голосов
/ 14 сентября 2018

Я использую код в этом ответе , чтобы добавить флажок в табличном представлении. Я хочу показать это в первом столбце.

Вот мой код:

mysqlquerymodel.h

#ifndef MYSQLQUERYMODEL_H
#define MYSQLQUERYMODEL_H
#include <QObject>
#include <QMap>
#include <QModelIndex>
#include <QSqlQueryModel>

class MySqlQueryModel : public QSqlQueryModel
{
    Q_OBJECT
public:
    explicit MySqlQueryModel(QObject *parent = 0);
    Qt::ItemFlags flags(const QModelIndex & index) const;
    QVariant data(const QModelIndex & index, int role) const;
    bool setData(const QModelIndex & index, const QVariant & value, int role);
private:
    QMap<int, Qt::CheckState> check_state_map;
};
#endif // MYSQLQUERYMODEL_H

mysqlquerymodel.cpp

#include "mysqlquerymodel.h"
Qt::ItemFlags MySqlQueryModel::flags(const QModelIndex & index) const
{
    if (!index.isValid())
        return 0;
    if (index.column() == 0)
        return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable;
    return  Qt::ItemIsEnabled | Qt::ItemIsSelectable;
}

QVariant MySqlQueryModel::data(const QModelIndex & index, int role) const
{
    if (!index.isValid())
        return QVariant();
    if(role== Qt::CheckStateRole)
    {
        if(index.column() == 0)
        {
            if (check_state_map.contains(index.row()))
                return check_state_map[index.row()] == Qt::Checked ? Qt::Checked : Qt::Unchecked;
            return Qt::Unchecked;
        }
    }
    return QVariant();
}

bool MySqlQueryModel::setData(const QModelIndex & index, const QVariant & value, int role)
{
    if(!index.isValid())
        return false;
    if (role == Qt::CheckStateRole && index.column() == 0)
    {
        check_state_map[index.row()] = (value == Qt::Checked ? Qt::Checked : Qt::Unchecked);
    }
    return true;
}

manage.cpp

void manage::on_selectBtn_clicked()
{
    QString query=QString("add_time,client_id,client_product_id,continent,country,region,city,ip,app_name,dev_os,dev_os_ver,dev_model,tusin_note,classify_note,detect_note,runtime_stats FROM ts_identify_record WHERE %1 %2 %3 %4 %5 %6 %7 ORDER BY add_time")
            .arg(timeRange()).arg(ipAddress()).arg(cellphone()).arg(product()).arg(country()).arg(province()).arg(city());
    qDebug()<<statment;
    QSqlDatabase db=QSqlDatabase::database();
    MySqlQueryModel *model=new MySqlQueryModel;
    model->setQuery(query,db);
    ui->tableView->setModel(model);
    ui->tableView->resizeColumnsToContents();
}

Когда я нажимаю кнопку, только в первом столбце отображается флажок, а остальные столбцы пусты. Но количество строк правильное, и флажок можно нажать. Это не будет проблемой, когда я просто использую QSqlQueryModel .

Другая проблема заключается в том, что мой результат select должен быть 16 столбцов, но первый столбец заполнен флажком. Когда я добавляю model->insertColumn(0);, tableview показывает вместо 17 столбцов.

Почему это происходит и как это исправить?

1 Ответ

0 голосов
/ 14 сентября 2018

Проблема в том, что в методе MySqlQueryModel::data вы возвращаете желаемое значение только для первого столбца и только для роли Qt::CheckStateRole. В остальных случаях вы возвращаете QVariant(). Чтобы это исправить, вы должны вернуть необходимое значение для других случаев. Например, вы можете вернуть значение метода базового класса:

QVariant MySqlQueryModel::data(const QModelIndex & index, int role) const
{
    if (!index.isValid())
        return QVariant();
    if(role== Qt::CheckStateRole)
    {
        if(index.column() == 0)
        {
            if (check_state_map.contains(index.row()))
                return check_state_map[index.row()] == Qt::Checked ? Qt::Checked : Qt::Unchecked;
            return Qt::Unchecked;
        }
    }
    return QSqlQueryModel::data(index,role);//!!!!!
}

И, конечно, у вас есть конструктор MySqlQueryModel, подобный этому:

MySqlQueryModel::MySqlQueryModel(QObject *parent) : QSqlQueryModel(parent), check_state_map()
{
}

PS. Извините за мой английский;)

...