遍历 QGraphicsItem 项时生成错误
Build errors when iterating through QGraphicsItem items
我已经将我的 class 项更改为继承自 QGraphicsItem,但突然出现问题...
class Item : public QGraphicsItem
{
Item();
QRectF boundingRect() const;
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
QWidget *widget);
};
class CollectionView : public QGraphicsView
{
Q_OBJECT
public:
CollectionView(QWidget *parent = 0);
QList<Item> *m_items;
};
class ShapeView : public QGraphicsView
{
Q_OBJECT
public:
ShapeView(QWidget *parent = 0);
CollectionView *collectionView;
private:
void doWork();
};
void ShapeView::doWork()
{
outputView1->m_items->clear();
foreach (Item item, collectionView->m_items)
// for(int i = 0; i< collectionView->m_items->size(); i++)
{
// Item item = collectionView->m_items->at(i);
...
}
}
无论是 for 循环还是 foreach,给我错误(在从 QGraphicsItem 继承之前都很好):
These errors if I use foreach:
'QList<Item>*' is not a class, struct, or union type
'class QForeachContainer<QList<Item>*>' has no member named 'i'
'class QForeachContainer<QList<Item>*>' has no member named 'e'
'class QForeachContainer<QList<Item>*>' has no member named 'i'
'class QForeachContainer<QList<Item>*>' has no member named 'i'
using invalid field 'QForeachContainer<T>::i'
request for member 'begin' in '((QForeachContainer<QList<Item>*>*)this)->QForeachContainer<QList<Item>*>::c', which is of non-class type 'QList<Item>* const'
using invalid field 'QForeachContainer<T>::e'
...
In copy constructor 'Item::Item(const Item&)':
'QGraphicsItem::QGraphicsItem(const QGraphicsItem&)' is private
within this context
In member function 'void ShapeView::doWork()':
synthesized method 'Item::Item(const Item&)' first required here
In member function 'Item& Item::operator=(const Item&)':
'QGraphicsItem& QGraphicsItem::operator=(const QGraphicsItem&)' is private
These errors if I use for loop: I only get:
In copy constructor 'Item::Item(const Item&)':
'QGraphicsItem::QGraphicsItem(const QGraphicsItem&)' is private
within this context
In member function 'void ShapeView::doWork()':
synthesized method 'Item::Item(const Item&)' first required here
In member function 'Item& Item::operator=(const Item&)':
'QGraphicsItem& QGraphicsItem::operator=(const QGraphicsItem&)' is private
我做错了什么,这些错误是什么意思,我该如何解决?
这是相关部分:
In copy constructor 'Item::Item(const Item&)':
'QGraphicsItem::QGraphicsItem(const QGraphicsItem&)' is private
within this context
您是从 QGraphicsItem
继承的,您需要可复制构造,但是 QGraphicsItem
isn't copyable.
ShapeView::doWork()
中的 foreach 需要 Item
的复制构造函数,因此您必须以不同的方式编写该函数并显式删除复制构造函数,或者找到一种方法来定义一个有效的 cctor。 operator=
.
也是如此
实际上tux3是对的,你只需要重新定义cctor和operator=。
没有什么不可逾越的,创建你自己的 class QGraphicsItem 继承自
QGraphicsItem.
file.h
#include <QGraphicsItem>
class MyGraphicsItem : public QGraphicsItem{
MyGraphicsItem();//constructor
MyGraphicsItem(const MyGraphicsItem& );//cctor
MyGraphicsItem& operator=(const MyGraphicsItem& );//operator=
}
file.cpp
#include "file.h"
//constructor
MyGraphicsItem::MyGraphicsItem() : QGraphicsItem(){}
//cctor
MyGraphicsItem::MyGraphicsItem(const MyGraphicsItem& other){}
//operator=
MyGraphicsItem& MyGraphicsItem::operator=(const MyGraphicsItem& other){}
你不需要写cctor和operator=的主体。这个重新定义的唯一目的是为了能够处理cctor和operator=以后-伪 class QGraphicsItem.
不要害怕这些签名,对于 cctor 你有 4 种选择:
MyClass( const MyClass& other );
MyClass( MyClass& other );
MyClass( volatile const MyClass& other );
MyClass( volatile MyClass& other );
对于 operator= 您可以在这些可能性之间进行选择:
MyClass& operator=( const MyClass& rhs );
MyClass& operator=( MyClass& rhs );
MyClass& operator=( MyClass rhs );
const MyClass& operator=( const MyClass& rhs );
const MyClass& operator=( MyClass& rhs );
const MyClass& operator=( MyClass rhs );
MyClass operator=( const MyClass& rhs );
MyClass operator=( MyClass& rhs );
MyClass operator=( MyClass rhs );
我已经将我的 class 项更改为继承自 QGraphicsItem,但突然出现问题...
class Item : public QGraphicsItem
{
Item();
QRectF boundingRect() const;
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
QWidget *widget);
};
class CollectionView : public QGraphicsView
{
Q_OBJECT
public:
CollectionView(QWidget *parent = 0);
QList<Item> *m_items;
};
class ShapeView : public QGraphicsView
{
Q_OBJECT
public:
ShapeView(QWidget *parent = 0);
CollectionView *collectionView;
private:
void doWork();
};
void ShapeView::doWork()
{
outputView1->m_items->clear();
foreach (Item item, collectionView->m_items)
// for(int i = 0; i< collectionView->m_items->size(); i++)
{
// Item item = collectionView->m_items->at(i);
...
}
}
无论是 for 循环还是 foreach,给我错误(在从 QGraphicsItem 继承之前都很好):
These errors if I use foreach:
'QList<Item>*' is not a class, struct, or union type
'class QForeachContainer<QList<Item>*>' has no member named 'i'
'class QForeachContainer<QList<Item>*>' has no member named 'e'
'class QForeachContainer<QList<Item>*>' has no member named 'i'
'class QForeachContainer<QList<Item>*>' has no member named 'i'
using invalid field 'QForeachContainer<T>::i'
request for member 'begin' in '((QForeachContainer<QList<Item>*>*)this)->QForeachContainer<QList<Item>*>::c', which is of non-class type 'QList<Item>* const'
using invalid field 'QForeachContainer<T>::e'
...
In copy constructor 'Item::Item(const Item&)':
'QGraphicsItem::QGraphicsItem(const QGraphicsItem&)' is private
within this context
In member function 'void ShapeView::doWork()':
synthesized method 'Item::Item(const Item&)' first required here
In member function 'Item& Item::operator=(const Item&)':
'QGraphicsItem& QGraphicsItem::operator=(const QGraphicsItem&)' is private
These errors if I use for loop: I only get:
In copy constructor 'Item::Item(const Item&)':
'QGraphicsItem::QGraphicsItem(const QGraphicsItem&)' is private
within this context
In member function 'void ShapeView::doWork()':
synthesized method 'Item::Item(const Item&)' first required here
In member function 'Item& Item::operator=(const Item&)':
'QGraphicsItem& QGraphicsItem::operator=(const QGraphicsItem&)' is private
我做错了什么,这些错误是什么意思,我该如何解决?
这是相关部分:
In copy constructor 'Item::Item(const Item&)':
'QGraphicsItem::QGraphicsItem(const QGraphicsItem&)' is private
within this context
您是从 QGraphicsItem
继承的,您需要可复制构造,但是 QGraphicsItem
isn't copyable.
ShapeView::doWork()
中的 foreach 需要 Item
的复制构造函数,因此您必须以不同的方式编写该函数并显式删除复制构造函数,或者找到一种方法来定义一个有效的 cctor。 operator=
.
实际上tux3是对的,你只需要重新定义cctor和operator=。 没有什么不可逾越的,创建你自己的 class QGraphicsItem 继承自 QGraphicsItem.
file.h
#include <QGraphicsItem>
class MyGraphicsItem : public QGraphicsItem{
MyGraphicsItem();//constructor
MyGraphicsItem(const MyGraphicsItem& );//cctor
MyGraphicsItem& operator=(const MyGraphicsItem& );//operator=
}
file.cpp
#include "file.h"
//constructor
MyGraphicsItem::MyGraphicsItem() : QGraphicsItem(){}
//cctor
MyGraphicsItem::MyGraphicsItem(const MyGraphicsItem& other){}
//operator=
MyGraphicsItem& MyGraphicsItem::operator=(const MyGraphicsItem& other){}
你不需要写cctor和operator=的主体。这个重新定义的唯一目的是为了能够处理cctor和operator=以后-伪 class QGraphicsItem.
不要害怕这些签名,对于 cctor 你有 4 种选择:
MyClass( const MyClass& other );
MyClass( MyClass& other );
MyClass( volatile const MyClass& other );
MyClass( volatile MyClass& other );
对于 operator= 您可以在这些可能性之间进行选择:
MyClass& operator=( const MyClass& rhs );
MyClass& operator=( MyClass& rhs );
MyClass& operator=( MyClass rhs );
const MyClass& operator=( const MyClass& rhs );
const MyClass& operator=( MyClass& rhs );
const MyClass& operator=( MyClass rhs );
MyClass operator=( const MyClass& rhs );
MyClass operator=( MyClass& rhs );
MyClass operator=( MyClass rhs );