提问:这样声明类的实例(如下)在 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重新编辑 ]