在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() );

// 界面
clipboard.png
希望能够得到帮助,谢谢。

QT mysql C++

ashwooh 9 years, 4 months ago

从我一点不成熟的经验来看,你可以在这里下一个断点 if(value == "男"){
当女生选择为男生的时候,看看 value 是什么

但是说实话,我十分怀疑你这个 QVariant == QString 的判断是不太严谨的代码。

但愿能帮助到你

anywn answered 9 years, 4 months ago

Your Answer