qtableview及其相关应用的使用

来源:互联网 发布:石家庄百度seo公司 编辑:程序博客网 时间:2024/06/16 09:18
static int SqlConnectIndex;
    QSqlDatabase db;

//打开数据库
db = QSqlDatabase::addDatabase("QODBC",QString("sql_con%1").arg(SqlConnectIndex));
       // db = QSqlDatabase::addDatabase("QODBC");
        db.setDatabaseName(QString("DRIVER={SQL SERVER};"
                                   "SERVER=%1;"
                                   "DATABASE=%2;"
                                   "UID=%3;"
                                   "PWD=%4;")
                           .arg(DataSourceName)
                           .arg(DataBaseName)
                           .arg(UserID)
                           .arg(PassWord));
        if (!db.open())
        {
            QMessageBox::warning(0, qApp->tr("Cannot open database"),
                    db.lastError().databaseText(), QMessageBox::Cancel);
            ret=false;
        }
        else
        {
        qDebug()<<"CONNECT TO SQL"<<endl;
               ret=true;
        }

//1.从数据库中获取数据并显示到qtableview中
 QSqlQueryModel *sqlQ = new QSqlQueryModel(this);
GetRecords(sqlQ,QObject::tr("select CMDID,CMDName,SeqInfoID from CMDInfo order by CMDID"));
    sqlQ->setHeaderData(0, Qt::Horizontal, "命令号");//设置各个列头的名称,Qt::Horizontal代表水平
    sqlQ->setHeaderData(1, Qt::Horizontal, "命令名称");
    sqlQ->setHeaderData(2, Qt::Horizontal, "序列号");
bool SqlServer_RW::GetRecords(QSqlQueryModel* SqlModel, const QString SqlStr)
{
    SqlModel->setQuery(SqlStr,db);
    while(SqlModel->canFetchMore())
    {
    SqlModel->fetchMore();
    }
    if(SqlModel->rowCount()>0)
    {
        return true;
    }
    else
    {
        return false;
    }
}
QTable *TVall=new QTableView(this);
 TVall->setModel(sqlQ);//把QSqlQueryModel中的数据显示到QTableView中
//2、在数据库中执行更新语句
bool UpdateDeviceInfo(int index, int cmd, QString desc)
{
    QString sqlstr=QString("update DeviceInfo set CMD=%1,DeName='%2' where DeID=%3").arg(cmd).arg(desc).arg(index);
    return   UpdateRecord(sqlstr);
}
bool UpdateRecord(const QString SqlStr)
{
      QSqlQuery query(db);
      return query.exec(SqlStr);
}
//3、从tableview中获得数据
QAbstractItemModel *model = yourTableView->model ();

QModelIndex index = model->index(3,3);
QVariant data = model->data(index);
data可以根据需要转换为相应的QString,int等等数据类型,具体可以在Qt助手中输入QVariant 查看。
其实这个model是你自己定义的,在定义这个model的时候你留一个接口,能够通过行和列获取你的数据就行了,不一定非要依靠Qt的api。
//4、获取当前选中的行第一列的内容
int row=TVall->currentIndex().row();
    QAbstractItemModel *model = TVall->model();
    QModelIndex index = model->index(row,0);//选中行第一列的内容
    QVariant data = model->data(index);
 if(data==QVariant::Int)//可以这样来判断所得到数据的类型
 {
 }
//5、获得tableview的第一列的列名
 QAbstractItemModel *model=TVall->model();
    QVariant a=model->headerData(0,Qt::Horizontal,Qt::DisplayRole);
    qDebug()<<a.toString()<<endl;
 model->columnCount();//获得tableview的列数
//6、tableview通过双击引发相应的槽函数
 connect(TVall,SIGNAL(doubleClicked(QModelIndex)),this,SLOT(TVRowDoubleClick(QModelIndex)));
void TVRowDoubleClick(QModelIndex index)
{
int row=index.row();//得到行数后可以根据上面的内容得到相应行数的内容

}
void SqlServer_RW::gettime(QSqlQueryModel *mo)
{
    QString str="select Time from CtTime where id=1";
    mo->setQuery(str,db);
    QString strBuffer;
    QDateTime t=mo->record(0).value("Time").toDateTime();//直接从QSqlQueryModel中获取值
    strBuffer = t.toString("yyyy-MM-dd hh:mm:ss");
    qDebug()<<strBuffer<<endl;
}
原创粉丝点击