首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >迭代QGraphicsItem项时生成错误

迭代QGraphicsItem项时生成错误
EN

Stack Overflow用户
提问于 2015-03-09 14:35:40
回答 2查看 465关注 0票数 1

我将类项更改为从QGraphicsItem继承,突然出现问题.

代码语言:javascript
复制
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之前很好):

代码语言:javascript
复制
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

我做错了什么,这些错误意味着什么,我如何纠正它们?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-09 14:40:51

这是有关的部分:

代码语言:javascript
复制
In copy constructor 'Item::Item(const Item&)':
'QGraphicsItem::QGraphicsItem(const QGraphicsItem&)' is private
within this context

您是从QGraphicsItem继承的,需要是可复制的,但必须是 isn't copyable

Item的复制构造函数是ShapeView::doWork()中的foreach所必需的,因此您必须以不同的方式编写该函数,并明确地删除您的复制构造函数,或者找到一种方法来定义有效的cctor。operator=也是如此。

票数 1
EN

Stack Overflow用户

发布于 2016-08-29 15:21:31

实际上,tux3是对的,您只需要重新定义cctor和operator=。没有什么可以保证的,创建您自己的类QGraphicsItem,它继承自QGraphicsItem。

file.h

代码语言:javascript
复制
 #include <QGraphicsItem>
    class MyGraphicsItem : public QGraphicsItem{
    MyGraphicsItem();//constructor
    MyGraphicsItem(const MyGraphicsItem& );//cctor
    MyGraphicsItem& operator=(const MyGraphicsItem& );//operator=
    }

file.cpp

代码语言:javascript
复制
  #include "file.h"
    //constructor
    MyGraphicsItem::MyGraphicsItem() : QGraphicsItem(){}
    //cctor
    MyGraphicsItem::MyGraphicsItem(const MyGraphicsItem& other){}
    //operator=
    MyGraphicsItem& MyGraphicsItem::operator=(const MyGraphicsItem& other){}

您不需要编写cctor和operator=的主体。此重新定义的唯一目的是能够处理从今以后伪类operator=的cctor和QGraphicsItem。

不要害怕这些签名,对于cctor来说,您可以在以下4种可能性之间进行选择:

代码语言:javascript
复制
MyClass( const MyClass& other );
MyClass( MyClass& other );
MyClass( volatile const MyClass& other );
MyClass( volatile MyClass& other );

对于operator=,您可以在以下几种可能性之间进行选择:

代码语言:javascript
复制
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 );
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28944632

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档