• 6221阅读
  • 3回复

关于QSqlTableModel的错误 [复制链接]

上一主题 下一主题
离线mileden
 

只看楼主 倒序阅读 楼主  发表于: 2006-06-30
— 本帖被 XChinux 从 General Qt Programming 移动到本区(2011-01-02) —
提问:这样声明类的实例(如下)在 C++ 语法上应该都是对的吧。
QSqlQueryModel *model = new QSqlQueryModel(table);     方法一

QSqlQueryModel model(table);           方法二

我使用的是 Qt open source 4.1.3.

最近我在 windows xp 下开发程序时,郁闷了好几天,在偶然间发现了 Qr 在 windows xp 下的一个漏洞。
我在 linux 下做了同样的测试,没有发现这样错误。

在 Qt/4.1.3/demos/sqlbrowser/release/ 目录下的 browser.cpp 文件中找到如下源代码。
void Browser::exec()
{
  QSqlQueryModel *model = new QSqlQueryModel(table);
  model->setQuery(QSqlQuery(sqlEdit->toPlainText(), connectionWidget->currentDatabase()));
  table->setModel(model);

  if (model->lastError().type() != QSqlError::NoError)
    emit statusMessage(model->lastError().text());
  else if (model->query().isSelect())
    emit statusMessage(tr("Query OK."));
  else
    emit statusMessage(tr("Query OK, number of affected rows: %1").arg(
                  model->query().numRowsAffected()));

  updateActions();
}

但是,在 windows xp 下,假如方法二声明类的实例时,在运行程序时,QTableView 中的数据没法显示,
即程序窗体右上角的部分。你用鼠标点击它,程序就崩溃了。修改后代码如下:

void Browser::exec()
{
  QSqlQueryModel model(table); //= new QSqlQueryModel(table);   这里修改了
  model.setQuery(QSqlQuery(sqlEdit->toPlainText(), connectionWidget->currentDatabase()));
  table->setModel(&model);

  if (model.lastError().type() != QSqlError::NoError)
    emit statusMessage(model.lastError().text());
  else if (model.query().isSelect())
    emit statusMessage(tr("Query OK."));
  else
    emit statusMessage(tr("Query OK, number of affected rows: %1").arg(
                  model.query().numRowsAffected()));

  updateActions();
}

然后,再重新编译执行,就能发现莫名其妙的错误。
[ 此贴被XChinux在2006-06-30 18:45重新编辑 ]
离线mileden

只看该作者 1楼 发表于: 2006-06-30
我发现,在 windows xp 下,QTreeView 也有类似的错误。

这也许是 Qt 在 windows 下的一个 bug 吧。希望各位知道如何汇报错误的帮忙汇报一下。
离线mileden

只看该作者 2楼 发表于: 2009-05-25
我想这是个变量的生命周期问题吧,用 new 在堆里创建一个实例,在整个程序运行期间都有效,除非你 delete 了它。

在GUI编程中,你若用局部变量的形式创建一个控件,可能会闪一下就消失了,你若用 new 来动态创建它,就可以了。
离线sunday1118
只看该作者 3楼 发表于: 2009-05-26
楼上正解
快速回复
限100 字节
 
上一个 下一个