我正在使用此答案中的代码在表格视图中添加复选框。我想在第一列中显示它。
这是我的代码:
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;
}
管理.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 列。
为什么会发生这种情况以及如何解决?
问题是在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);//!!!!!
}
而且,ofc,你有MySqlQueryModel的构造函数,如下所示:
MySqlQueryModel::MySqlQueryModel(QObject *parent) : QSqlQueryModel(parent), check_state_map()
{
}
对不起我的英语;)