我目前正在使用Qt5框架,我想迭代QGraphicsItems列表以有条件地操作它们。虽然我已经找到了一种更好的方法来解决我的实际问题,但第一种方法似乎有一个问题,对我来说似乎没有意义
我的情况如下。我有一个方法作为我的QGraphicsItems列表的getter。其返回值为QList。我使用getter来检索我的列表,然后使用begin((方法来检索QList::迭代器类型的迭代器。显然,我想用它来迭代列表中的所有元素。
所以我的代码如下:
QList<QGraphicsItem *>::iterator it = this->items().begin();
std::cout << *(this->items().begin()) << std::endl;
std::cout << *it << std::endl;
其中this->items((返回我们的QList。
我希望这两个控制台输出是相同的。尽管这里有一个实际输出的例子:
0x559716414740
0
这对我来说似乎没有意义。就我而言,将This->items((.begin((的值分配给我的it变量不应该导致it变量有任何其他值,而不是我直接打印This->items((.bigin((.时得到的值
我以前一直在使用一个名为auto-it的变量,但为了确保这一点,我手动键入了返回对象应该具有的类型。他们都有相同的行为。
如果有人能在这里指出我的错误,我将不胜感激,因为我真的完全不知所措。看起来我不会做错什么,但显然这不起作用。
感谢阅读!
this->items()
返回一个对象时,它是列表的临时副本。由于您不将此副本存储在任何位置,因此在语句末尾销毁临时列表时,从中保存的任何迭代器都将无效。
您的代码相当于:
QList<QGraphicsItem *>::iterator it;
{
// create a temporary copy of items
QList<QGraphicsItem *> items = this->items();
it = items.begin();
}
// temporary "items" is destroyed, "it" is now pointing to a non-existent list and is inavlid
std::cout << *(this->items().begin()) << std::endl;
std::cout << *it << std::endl;
解决方案可能是让items()
通过(可能是const
(引用返回列表,或者当您在自己的类中时,可能不需要调用items()
,只需直接访问包含列表的成员变量即可。