在 QMap 中插入 QObject * - 无法初始化或传递指针

Posted

技术标签:

【中文标题】在 QMap 中插入 QObject * - 无法初始化或传递指针【英文标题】:Inserting QObject * in QMap - cannot initialize or pass the pointer 【发布时间】:2015-09-24 18:56:00 【问题描述】:

我设置了两个类,InputFileInputStream。两者都继承QObject,并使用Q_OBJECT 宏进行初始化。

InputFile 包含一个QMap<int,InputStream*>,创建InputStream 对象并将它们插入QMap

InputStream 使用显式构造函数初始化,然后像这样插入到地图中:

InputStream myStream = InputStream(this, *myParameter);
_myMap.insert(myInt, *myStream);

编译器返回一些关于我的插入调用的错误:

/opt/Qt5.5.0/5.5/gcc/include/QtCore/qobject.h:461: error: 'QObject::QObject(const QObject&)' is private
 Q_DISABLE_COPY(QObject)
                ^  

/home/myusername/Documents/Projects/MyProject/inputfile.cpp:17: error: no match for 'operator*' (operand type is 'InputStream')
             _myMap.insert(myInt, *myStream);
                                ^

然后我尝试将InputStream 初始化为指针:

InputStream *myStream = InputStream(this, *myParameter);

在这种情况下,编译器会返回以下错误:

/home/myusername/Documents/Projects/MyProject/inputfile.cpp:16: error: cannot convert 'InputStream' to 'InputStream*' in initialization
             InputStream *myStream = InputStream(this, *myParameter);
                                                                        ^

我也尝试在插入调用中使用引用 (&),但这仍然返回第一个错误。

如何根据需要初始化我的对象并将其插入我的QMap

【问题讨论】:

【参考方案1】:

第一个错误意味着您无法复制 QObject 子类,因此您应该使用指向它的指针(正如您在开头所说的那样),因此您需要第二种方法,但是您忘记了分配内存和构造对象(您忘记了 new关键词)。所以只使用:

InputStream *stream = new InputStream(...);

【讨论】:

【参考方案2】:

如果_myMap 真的是QMap<int,InputStream*>,那么你应该只插入原始指针,而不是指针指向的对象:

_myMap.insert(myInt, myStream);

错误信息告诉你不能复制 QObjects。 Here 解释了为什么 QObjects 不可复制。

【讨论】:

以上是关于在 QMap 中插入 QObject * - 无法初始化或传递指针的主要内容,如果未能解决你的问题,请参考以下文章

QMap与QHash

QMap 和 QMultiMap 中的项目顺序

QMap 的增删改查

编译器错误 C2248:“QObject::Qobject”:无法访问在类“QObject”中声明的私有成员

查找“无法访问在类'QObject'中声明的私有成员”的根本原因

(QNativeSocketEngine)QObject:无法为不同线程中的父级创建子级