2011-12-14 41 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