如果数据库已更改,则动态更新QSqlTableView

时间:2015-08-12 23:50:47

标签: c++ mysql qt

这是我的代码:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
   db = QSqlDatabase::addDatabase("QMYSQL");
   db.setHostName("localhost");
   db.setDatabaseName("carl");
   db.setUserName("root");
   db.setPassword("123456ca");


   tmb = new Manifest(this);
   tmb->setTable("carl_table");
   tmb->select();

   ui->treeView->setModel(tmb);



}

我的应用有一个QTableView,其中Manifest为模型。 Manifest是我的自定义QSqlTableModel课程。原因是因为我计划通过覆盖标志来禁用某些列,并且它按预期工作。

我的SQL database有两列,即id,它是主键,name是任意字符串。 Manifest将设置为该表,它将获取内部的所有数据。

现在我的问题是,如何使我的应用程序动态化?这意味着,如果我的数据库表发生了变化,那么我希望我的应用程序能够自行更新。

这是我想到的方法: 创建一个在固定时间内运行tmb->select();的线程。但我看到的问题是它会弄乱我当前的UI索引选择,所以它只能在几秒钟内编辑。

如果这是一个好方法,那么我该如何使其工作? 任何其他方法或解决方案也将不胜感激。

我检查并研究了SO并发现了与我类似的情况,但我不知何故得到解释。

编辑:我正在考虑获取主键,存储它,然后在刷新后再次重新选择它。关注我的是性能,因为我将不得不重新迭代以找到匹配的PK。此外,它将每秒运行。我正在努力实现这一点。

编辑#2:

我成功实现了自己的版本,但我不确定这是否已经过优化。我的过程是这样的:

  1. select将每1秒运行一次。
  2. select()的实际行之前,将会记录点击的index
  3. 调用select()后,将恢复索引。
  4. 滚动会暂时停止计时器,如果用户点击任何内容,它将会恢复。
  5. 如果用户双击任何属性,时间也将暂时停止。

0 个答案:

没有答案