void MainWindow::edit()
{
//Check if item is selected, if not return
const int row = list->currentRow();
if( row == -1 )
return;
EditWindow w( this, currentCategory() );
switch( currentCategory() )
{
case cApp:
{
App old = appList.at( row );
w.setApp( old );
if( w.exec() == QDialog::Rejected )
return;
if( old == w.app() ) return;
else old = w.app();
if( dm->updateApp( old ) ){
appList.replace( row, old );
list->item(row)->setText( old.name() );
}
break;
}
case cFilm:
{
Film old = filmList.at( row );
w.setFilm( old );
if( w.exec() == QDialog::Rejected )
return;
if( old == w.film() ) return;
else old = w.film();
if( dm->updateFilm( old ) ){
filmList.replace( row, old );
list->item(row)->setText( old.name() );
}
break;
}
case cSong:
{
Song old = songList.at( row );
w.setSong( old );
if( w.exec() == QDialog::Rejected )
return;
if( old == w.song() ) return;
else old = w.song();
if( dm->updateSong(old) ){
songList.replace( row, old );
list->item(row)->setText( old.name() );
}
break;
}
}
displayItem(row);
}
此代码检查我们目前所属的类别。然后它编辑应用程序,电影或歌曲(取决于类别)。然后,当我更改某些信息时,它会将这些更改写入数据库和全局QLists
,更改QListWidget
中的名称,并在几个标签中显示当前项目的信息(这是最后一项功能)。
正如您所看到的,除了QLists
不同之外,它们的代码相同。电影和歌曲完美无缺。我可以更改每个细节,它会自动更新列表中的名称。
但是,当我更改应用程序的名称并单击“确定”时,它不会更改列表中的名称,也不会更改QList
中的应用程序信息。
但是,当我使用调试器并单击每一步时,列表会更改名称和信息。
所以基本上我要问的是,为什么上面的代码在使用调试器完成每个步骤时才起作用,而不是在运行它时呢?
答案 0 :(得分:4)
我猜你所谓的“简单运行”实际上是在“构建运行”模式下使用IDE,而实际上是在比较调试版本和优化版本构建。调试器正确地将所有内存初始化为零,这在发布版本中不会发生。
无论您正在做什么,此行为都表示非法内存访问。
每次使用at()
时,你的代码就会出现超出界限的风险,我想这就是发生的事情。您应该检查at()
的所有实例以及list->item(row)
不会超出范围。
此外,使用list
可能会与std::list
混淆,因此应重命名此变量。