在QTableView中添加QCombox后,利用setData去修改其中数据后数据不能同步到数据库。
软件环境:ubuntu14.04 QT5.5
硬件环境:联想笔记本
-
代码实现目的:使搜索的数据中性别那一列能够以QCombox形式呈现,并且通过QCombox选择数据后可以同步到数据库。
-
思路:通过为QTableView去显示QSqlTableModel搜索的数据,同时为QTableView提供一个自定义代理,使得性别那一列以QComBox形式呈现。然后通过选择QCombox的下拉框中文本,将文本同步到数据库中。(注意:性别 在数据库存储是 0 代表男生 1 :代表女生 ,我使用QSqlTableModel::data去翻译0与1 使用QSqlTableModel::
setData按照QCombox选择的男生或者女生设置0与1 同步到数据库)
问题:在QCombox中将男生选择为女生 可以同步到数据库 , 而将女生选择为男生不能同步到数据库。
代码:
/******************** 整个头文件***********************/
#ifndef MYWIDGET_03_H
#define MYWIDGET_03_H
#include <QWidget>
#include <QSqlTableModel>
#include <QTableView>
#include <QApplication>
#include <QItemDelegate>
#include <QComboBox>
#include <QDebug>
class FYXTuserDelegate : public QItemDelegate // 自定义代理
{
public:
QWidget *createEditor(QWidget *parent,
const QStyleOptionViewItem &option,
const QModelIndex &index) const
{
if(index.column() == 6){
QComboBox* comBox = new QComboBox(parent) ;
comBox->addItem("男");
comBox->addItem("女");
return comBox ;
}
return QItemDelegate::createEditor(parent,option,index);
}
};
class FYXMySqlTableModel : public QSqlTableModel // 自定义的Model
{
public:
QVariant data(const QModelIndex &idx, int role = Qt::DisplayRole) const
{
if(idx.column() != 6){
return QSqlTableModel::data(idx,role) ;
}
QVariant ret = QSqlTableModel::data(idx,role) ;
if(idx.column() == 6 && idx.row() == 0 )
qDebug() << ret.toString().toStdString().c_str() ;
if(ret == 0){
return "男";
}
return "女";
}
bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole)
{
if(index.column() != 6)
return QSqlTableModel::setData(index,value,role) ;
if(value == "男"){
return QSqlTableModel::setData(index,0) ;
}
else
return QSqlTableModel::setData(index,1) ;
}
};
class MyWidget_03 : public QWidget
{
Q_OBJECT
public:
explicit MyWidget_03(QWidget *parent = 0);
private:
FYXMySqlTableModel* _model ;
QTableView* _view ;
signals:
public slots:
void slotSublimtFunction() ;
void slotAddFunction() ;
void slotDeleteFunction() ;
};
#endif // MYWIDGET_03_H
/*********************** .cpp 文件中设置代理代码*********************/
// .cpp文件其余代码是连接数据库,提交数据库数据的代码就不贴了
_view = new QTableView() ;
_view->setModel(_model);
this->setFixedSize(_view->size());
_view->setItemDelegate(new FYXTuserDelegate() );
// 界面
希望能够得到帮助,谢谢。
ashwooh
9 years, 4 months ago