• 9796阅读
  • 22回复

[提问]QSqlTableModel的日期显示问题 [复制链接]

上一主题 下一主题
离线飘飘16
 

只看楼主 倒序阅读 楼主  发表于: 2012-08-23
关键词: QT4
model = new QSqlTableModel(this);    
model->setTable("license");    
model->setEditStrategy(QSqlTableModel::OnManualSubmit);    
model->select();    //选取整个表的所有行                  
//model->removeColumn(1);    //不显示1属性列,如果这时添加记录,则该属性的值添加不上    
ui->tableView->setModel(model);    
ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);    //使其不可编辑        

在license表中的日期格式是yyyy-mm-dd的格式,但是从表中提取出来放在QSqlTableModel中显示的时候就变成了yy-mm-dd的格式。
请问有什么方法可以解决此问题
谢谢!!
Towing genius disdains a beaten path,It seeks regions hitherto unexplored!!
离线passion_wu
只看该作者 1楼 发表于: 2012-08-23
写一个类继承QSqlQueryModel,重写data函数.
QVariant QueryModel::data(const QModelIndex & index,
    int role) const
{
    if(!index.isValid())
        return QVariant();
    QVariant vt = QSqlQueryModel::data(index, role);
    if(QVariant::DateTime == vt.type())
        return vt.toDate().toString("yyyy-MM-dd");
    return vt;
}
离线飘飘16

只看该作者 2楼 发表于: 2012-08-29
具体怎么弄啊!我的主界面是一个tableView,是在tableView中显示数据库中的日期的,用的是QSqlQueryModel来查询数据的!刚接触QT,好多东西不懂,请大家指教啊!!
Towing genius disdains a beaten path,It seeks regions hitherto unexplored!!
离线飘飘16

只看该作者 3楼 发表于: 2012-08-29
回 1楼(passion_wu) 的帖子
请问具体怎么转换!我的主界面是一个tableView,是在tableView中显示数据库中的日期的,用的是QSqlQueryModel来查询数据的!刚接触QT,好多东西不懂,请指教!
Towing genius disdains a beaten path,It seeks regions hitherto unexplored!!
离线passion_wu
只看该作者 4楼 发表于: 2012-08-29
这是C++基础,继承都不会么?
离线飘飘16

只看该作者 5楼 发表于: 2012-08-29
回 4楼(passion_wu) 的帖子
我觉得此方法不可取啊!!刚才试过了,我是把整个表的数据提取出来放入tableView中
Towing genius disdains a beaten path,It seeks regions hitherto unexplored!!
离线飘飘16

只看该作者 6楼 发表于: 2012-08-29
回 4楼(passion_wu) 的帖子
我用的是QSqlTableModel,没有用到QSqlQueryModel啊
    model = new QSqlTableModel(this);
    model->setTable("license");
    model->setEditStrategy(QSqlTableModel::OnManualSubmit);
    model->select();    //选取整个表的所有行

        //model->removeColumn(1);    //不显示1属性列,如果这时添加记录,则该属性的值添加不上
    ui->tableView->setModel(model);
    ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);    //使其不可编辑
Towing genius disdains a beaten path,It seeks regions hitherto unexplored!!
离线passion_wu
只看该作者 7楼 发表于: 2012-08-29
我这样改的就可以啊。
你继承QSqlTableModel,然后setModel的时候用你自己写的model就可以了啊。
离线飘飘16

只看该作者 8楼 发表于: 2012-08-29
回 7楼(passion_wu) 的帖子
我先这么定义的。
QVariant QSqlTableModel::data(const QModelIndex & index, int role)const
{
    if(!index.isValid())
        return QVariant();
    QVariant vt = QSqlTableModel::data(index, role);
    if(QVariant::DateTime == vt.type())
        return vt.toDate().toString("yyyy-MM-dd");
    return vt;
}
然后

void MainWindow::show_table()
{

        model = new QSqlTableModel(this);
        model->setTable("license");
        model->setEditStrategy(QSqlTableModel::OnManualSubmit);
        model->select();    //选取整个表的所有行

        //model->removeColumn(1);    //不显示1属性列,如果这时添加记录,则该属性的值添加不上
        ui->tableView->setModel(model);
    ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);    //使其不可编辑


}

这样去用,但是运行程序的时候,显示的日期还是yy-MM-dd啊!哪儿错了,请指教,谢谢!
Towing genius disdains a beaten path,It seeks regions hitherto unexplored!!
离线飘飘16

只看该作者 9楼 发表于: 2012-08-29
回 7楼(passion_wu) 的帖子
经过测试发现根本就没有走为继承的QSqlTableModel,应为我把格式改成“dd.MM.yyyy“,显示依旧没有变法。
Towing genius disdains a beaten path,It seeks regions hitherto unexplored!!
离线飘飘16

只看该作者 10楼 发表于: 2012-08-29
回 7楼(passion_wu) 的帖子
请问我继承的这个函数放哪儿啊!
Towing genius disdains a beaten path,It seeks regions hitherto unexplored!!
离线飘飘16

只看该作者 11楼 发表于: 2012-08-29
回 7楼(passion_wu) 的帖子
为放在该文件的最上面,这样可以吗?
Towing genius disdains a beaten path,It seeks regions hitherto unexplored!!
离线飘飘16

只看该作者 12楼 发表于: 2012-08-29
回 7楼(passion_wu) 的帖子
继承QSqlTableModel的函数放哪儿啊!!为放的是该文件的最前面,这样可以码?
日期显示还是那样,经检测,根本就没有经过该函数啊!
Towing genius disdains a beaten path,It seeks regions hitherto unexplored!!
离线飘飘16

只看该作者 13楼 发表于: 2012-08-29
回 1楼(passion_wu) 的帖子
大牛,另外再问一个问题:

当用户在一个lineEdit中输入一个比如版本的名字,如1&2,然后存入数据库,当为想用的时候,拿出来显示此版本名字的时候,比如设置成 chekbox的名字的时候,发现它会将1&2中的&转义成下划线_,,从数据库取出来版本用qDdbug()打印的时候正常。因为版本是用户要输入的,所以用户输入不可能关心哪儿需要转义。所以我设计的时候必须避免其转义,让它作为一个整体的字符串来显示。 请问如何解决!! 谢谢!!
Towing genius disdains a beaten path,It seeks regions hitherto unexplored!!
离线passion_wu
只看该作者 14楼 发表于: 2012-08-29
你这样写当然不行,你没有继承过没?
离线passion_wu
只看该作者 15楼 发表于: 2012-08-29
算了,还是把代码贴出来吧:
//mytablemodel.h
#include <QSqlTableModel>
class MyTableModel: public QSqlTableModel
{
Q_OBJECT
public:
    explicit MyTableModel(QObject *parent = 0);
    QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const;
};

//mytablemodel.cpp
#include "mytablemodel.h"
MyTableModel::MyTableModel(QObject *parent) :
    QSqlTableModel(parent)
{

}

QVariant MyTableModel::data(const QModelIndex & index,
        int role = Qt::DisplayRole) const
{
    if (!index.isValid())
        return QVariant();

    QVariant vt = QSqlTableModel::data(index, role);
    if (QVariant::DateTime == vt.type())
        return vt.toDate().toString("yyyy-MM-dd");
    return vt;
}

然后你使用MyTableModel就可以了,没有编译过,可能会有小错误。
离线passion_wu
只看该作者 16楼 发表于: 2012-08-29
你这样当然不行!
离线飘飘16

只看该作者 17楼 发表于: 2012-08-30
回 16楼(passion_wu) 的帖子
定义的data函数在什么时候调用啊??是在ui->tableView->setModel(model);这一步条用的吗??
发现根本没有走那个函数啊!!为应该在哪儿调用它。
Towing genius disdains a beaten path,It seeks regions hitherto unexplored!!
离线飘飘16

只看该作者 18楼 发表于: 2012-08-30
回 16楼(passion_wu) 的帖子
求教啊!!谢谢
Towing genius disdains a beaten path,It seeks regions hitherto unexplored!!
离线passion_wu
只看该作者 19楼 发表于: 2012-08-30
绘制table的时候会自动调用,你可以打出调试信息看看。
离线飘飘16

只看该作者 20楼 发表于: 2012-08-30
回 19楼(passion_wu) 的帖子
解决了,谢谢!!多谢!!
Towing genius disdains a beaten path,It seeks regions hitherto unexplored!!
离线飘飘16

只看该作者 21楼 发表于: 2012-08-30
回 19楼(passion_wu) 的帖子
还有一个问题,希望能指导!
当用户在一个lineEdit中输入一个比如版本的名字,如1&2,然后存入数据库,当为想用的时候,拿出来显示此版本名字的时候,比如设置成 chekbox的名字的时候,发现它会将1&2中的&转义成下划线_,,从数据库取出来版本用qDdbug()打印的时候正常。因为版本是用户要输入的,所以用户输入不可能关心哪儿需要转义。所以我设计的时候必须避免其转义,让它作为一个整体的字符串来显示。 请问如何解决!! 谢谢!!
Towing genius disdains a beaten path,It seeks regions hitherto unexplored!!
离线passion_wu
只看该作者 22楼 发表于: 2012-08-30
简单的解决办法就是遇见一个&符号就在后面多加一个&符号。
快速回复
限100 字节
 
上一个 下一个