2011-12-14 7 views
0

以下は、Qtアプリケーションから取得したコードサンプルです。私はC++イテレータを使ってforループとしてforeachループを記述したい。次の "foreach"をC++イテレータとして書く方法

DocumentWindow *MdiWindow::activeDocument() 
{ 
    return qobject_cast<DocumentWindow*>(workspace->activeWindow()); 
} 

int i=1; 
foreach(QWidget *w, workspace->windowList()) // workspace = new QWorkspace(); 
     { 
     QString text; 
     if(i<10) 
      text = tr("&%1 %2").arg(i++).arg(w->windowTitle()); 
     else 
      text = w->windowTitle(); 

     QAction *action = windowMenu->addAction(text); 
     action->setCheckable(true); 
     action->setChecked(w == activeDocument()); 
     connect(action, SIGNAL(triggered()), mapper, SLOT(map())); // mapper = new QSignalMapper(this); 
     mapper->setMapping(action, w); 
} 

以下は私の試みです。これはうまくコンパイルされますが、実行中のアプリケーションでこのコードが呼び出されるとすぐにクラッシュします。そして私はなぜだか分からない。私はそれを正しくしていますか?

DocumentWindow *MdiWindow::activeDocument() 
{ 
    return qobject_cast<DocumentWindow*>(workspace->activeWindow()); 
} 

int i = 1;  
for(QWidgetList::iterator it = (workspace->windowList()).begin(); it != (workspace->windowList()).end(); ++it) 
{ 
      QString text; 
      if(i < 10) 
       text = QString("&%1 %2").arg(i++).arg((*it)->windowTitle()); 
      else 
       text = (*it)->windowTitle(); 

      QAction *action = windowMenu->addAction(text); 
      action->setCheckable(true); 
      action->setChecked((*it) == activeDocument()); 
      connect(action, SIGNAL(triggered()), mapper, SLOT(map())); 
      mapper->setMapping(action, (*it)); 
} 

回答:私は実現しなかったworkspace-> windowList()値、従って両方反復子がコンテナの異なるインスタンスを指していることにより戻ること。

答えて

5

異なるコンテナを返すクエリでworkspace->windowList()を複数回呼び出しているため、イテレータが同じコレクションに含まれていません。

workspace->windowList()の結果をローカル変数に格納し、それを反復処理します。

QWigetList winList = workspace->windowList() for(QWidgetList::iterator it = winList.begin(); it != winList.end(); ++it)

これが発生する理由は、windowList()がない参照により値によってQWidgetListを返すことです。何が起きているのかについては、this questionを参照してください。

関連する問題