2011-12-14 2 views
0

Ниже приведен пример кода, взятый из приложения Qt. Я хочу написать следующий цикл foreach, как для цикла с итераторами C++.Как написать следующий «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 для обсуждения того, что происходит.

Смежные вопросы