• 9302阅读
  • 13回复

QDataWidgetMapper如何实现数据映射 [复制链接]

上一主题 下一主题
 
只看楼主 正序阅读 楼主  发表于: 2011-12-04
如何用QDataWidgetMapper实现选中视图中一行,在下面部件中显示选中行的各列,这个一直没实现,整了几天不知道问题出在哪?人都快崩溃了!
这是代码:
  1. MainWindow::MainWindow(QWidget *parent) :
  2.     QMainWindow(parent),
  3.     ui(new Ui::MainWindow)
  4. {
  5.     ui->setupUi(this);
  6.     connect2();//连接数据库
  7.     mapper=new QDataWidgetMapper(this);
  8.     connect(ui->iotableView->selectionModel(), SIGNAL(currentRowChanged(QModelIndex)),
  9.                    mapper, SLOT(setCurrentModelIndex(QModelIndex)));//想实现选中一行,该行各列显示在下面部件,但这条语句好像没执行
  10.     //收支界面-收入信息表初始化
  11.      QString a3=QString::number(14);
  12.      QString sql3="User=";
  13.      sql3=sql3+a3;
  14.      qDebug()<<sql3;
  15.      model2 = new QSqlRelationalTableModel(this);
  16.      model2->setTable("Income");
  17.      model2->setEditStrategy(QSqlTableModel::OnFieldChange);
  18.     // model2->setEditStrategy(QSqlTableModel::OnManualSubmit);//所有改变将被放到缓存,直到调用submitAll()或revertAll()
  19.      model2->setFilter(sql3);
  20.      model2->setRelation(4,QSqlRelation("Intype","ID","InName"));
  21.      model2->setRelation(5,QSqlRelation("BankAccount","AID","AccountName"));
  22.      model2->select(); //选取整个表的所有行
  23.      model2->removeColumn(0); //不显示ID属性列,如果这时添加记录,则该属性的值添加不上
  24.      model2->setHeaderData(0,Qt::Horizontal,QObject::tr("用户"));
  25.      model2->setHeaderData(1,Qt::Horizontal,QObject::tr("时间"));
  26.      model2->setHeaderData(2,Qt::Horizontal,QObject::tr("金额"));
  27.      model2->setHeaderData(3,Qt::Horizontal,QObject::tr("类型"));
  28.      model2->setHeaderData(4,Qt::Horizontal,QObject::tr("支付方式"));
  29.      model2->setHeaderData(5,Qt::Horizontal,QObject::tr("备注"));
  30.      ui->iotableView->setModel(model2);
  31.      ui->iotableView->hideColumn(0);//隐藏用户列
  32.      QSqlTableModel *relationModel2=model2->relationModel(4),*relationModel=model2->relationModel(3);
  33.      ui->accountcomboBox->setModel(relationModel2);
  34.      ui->accountcomboBox->setModelColumn(relationModel2->fieldIndex("AccountName"));
  35.      ui->typecomboBox->setModel(relationModel);
  36.      ui->typecomboBox->setModelColumn(relationModel->fieldIndex("InName"));
  37.      mapper = new QDataWidgetMapper(this);
  38.      mapper->setSubmitPolicy(QDataWidgetMapper::AutoSubmit);
  39.      mapper->setModel(model2);
  40.      mapper->addMapping(ui->iradioButton, 0);
  41.      mapper->addMapping(ui->dateEdit, 1);
  42.      mapper->addMapping(ui->account, 2);
  43.      mapper->addMapping(ui->typecomboBox, 3);
  44.      mapper->addMapping(ui->accountcomboBox, 4);
  45.      mapper->addMapping(ui->notelineEdit, 5);
  46.      mapper->toNext();
  47. }有哪位好心人帮帮忙,在线等,谢谢

离线jgcddd

只看该作者 13楼 发表于: 2012-02-15
楼主能发一份你所有的源码吗?
离线condann
只看该作者 12楼 发表于: 2012-02-11
应该是combobox控件的问题。
QDataWidgetMapper中的combobox控件需要特殊处理,
参考:
http://www.cppblog.com/reborntercel/archive/2011/11/23/160805.html
离线alexltr

只看该作者 11楼 发表于: 2011-12-05
沒有那麼難!!!
給你一個簡單的例子做參考. Test.rar (11 K) 下载次数:32
我不从事IT,只是喜欢Qt。
我不是程序员,只是与程序有缘。
我写程序,只是为了让工作变得简单有序!

                      ----  一个一直在入门的编程学习者
离线jasongood

只看该作者 10楼 发表于: 2011-12-05
使用QDataWidgetMapper对像的void    currentIndexChanged ( int index )信号,连接一个自己的槽,在自己的槽里面实现使用信号传来的index在QSqlRelationalTableModel对像里面获取对应的数据设置在想要显示的部件上。
只看该作者 9楼 发表于: 2011-12-05
是不是QDataWidgetMapper的使用有甚么条件,烦得很
只看该作者 8楼 发表于: 2011-12-05
修改9行后面的slot(currentRowChanged ( const QModelIndex & current, const QModelIndex & previous )),删除了38行,但还是不行,你的这个currentRowChanged ( const QModelIndex & current, const QModelIndex & previous )程序不认
离线alexltr

只看该作者 7楼 发表于: 2011-12-04
你把第9行的connec语句放在第47行看看,我不确定。
我不从事IT,只是喜欢Qt。
我不是程序员,只是与程序有缘。
我写程序,只是为了让工作变得简单有序!

                      ----  一个一直在入门的编程学习者
离线alexltr

只看该作者 6楼 发表于: 2011-12-04
回 3楼(刚来的初学者) 的帖子
怎么改的?
我不从事IT,只是喜欢Qt。
我不是程序员,只是与程序有缘。
我写程序,只是为了让工作变得简单有序!

                      ----  一个一直在入门的编程学习者
只看该作者 5楼 发表于: 2011-12-04
程序实现:从Income表查询User=14的所有信息,并将它初始化在视图iotableView上,同时当选中视图iotableView上一行时,在其下面部件显示该行的的所有数据
只看该作者 4楼 发表于: 2011-12-04
不好意思哈,是一位,
只看该作者 3楼 发表于: 2011-12-04
按照两位说的,改了还是不行
离线alexltr

只看该作者 2楼 发表于: 2011-12-04
你的代码结构太乱了。
mapper都new得两次:
8.    mapper=new QDataWidgetMapper(this);
38.     mapper = new QDataWidgetMapper(this);
我不从事IT,只是喜欢Qt。
我不是程序员,只是与程序有缘。
我写程序,只是为了让工作变得简单有序!

                      ----  一个一直在入门的编程学习者
离线alexltr

只看该作者 1楼 发表于: 2011-12-04
connect(ui->iotableView->selectionModel(), SIGNAL(currentRowChanged(QModelIndex)),
                  mapper, SLOT(setCurrentModelIndex(QModelIndex)));// 这句好像不对喔!!

void   currentRowChanged ( const QModelIndex & current, const QModelIndex & previous )
我不从事IT,只是喜欢Qt。
我不是程序员,只是与程序有缘。
我写程序,只是为了让工作变得简单有序!

                      ----  一个一直在入门的编程学习者
快速回复
限100 字节
 
上一个 下一个