首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

`QObject`子类和复制构造函数出错:`QObject :: QObject(const QObject&)是private`

您好!您提到的问题是关于在使用QObject子类时出现的复制构造函数错误。这个问题是由于QObject类设计为不可复制的,因此其复制构造函数是私有的。

QObject是Qt框架中的一个基础类,它提供了对象的属性、信号和槽机制。由于QObject类的设计理念是对象树结构,每个对象只能有一个父对象,所以为了避免对象之间的父子关系错误,Qt设计者将QObject的复制构造函数设为私有,以防止在对象树中出现错误的复制行为。

如果您需要创建一个新的QObject子类对象,可以通过以下方法:

  1. 使用new操作符创建一个新的对象,并在构造函数中传递父对象指针。
  2. 使用QSharedPointer智能指针创建一个新的对象,并在构造函数中传递父对象指针。

以下是一个简单的示例代码,演示如何使用new操作符创建一个QObject子类对象:

代码语言:cpp
复制
class MyObject : public QObject
{
    Q_OBJECT
public:
    MyObject(QObject *parent = nullptr) : QObject(parent) {}
};

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    MyObject *obj1 = new MyObject();
    MyObject *obj2 = new MyObject(obj1);
    return a.exec();
}

在这个示例中,我们创建了一个名为MyObjectQObject子类,并使用new操作符创建了两个对象。第一个对象没有父对象,第二个对象的父对象是第一个对象。

希望这个答案能够帮助您解决问题!如果您还有其他问题,欢迎随时提问。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

翻译 | 为什么QObject子类不可复制?

&)’ 或更早版本: 错误:'QObject::QObjectconst QObject&)'在此上下文中私有的。   ...此行为设计使然。但是为什么要删除复制构造函数(以及赋值运算符)?如果您仍要复制该怎么办?如果它不可复制,那么它可以移动吗?以下文章将研究这些问题,并探讨在自定义子类中重复删除操作是否一种好习惯。...但是,由于复制构造函数被删除,所以不会隐式地生成move构造函数,如果开发人员试图移动QObject,就会报编译器错误。   ...如果没有宏,则使用Qt4报告以下错误信息: 错误:'QObject::QObject(const QObject&)'在此上下文中私有的。...复制构造函数赋值操作符使用=delete声明,而不再声明私有,从而产生了一个首选的错误消息。   即使错误消息已得到改善,我仍然相信在派生类中重新声明宏有价值的,因为它记录了类的行为。

98210

QThread的用法

建立相关的信号函数函数进行连接,然后发出信号触发QThread的槽函数,使其执行工作。...,即主线程的线程编号0X7a4, 在Controller的构造函数中继续打印当前线程编号,也是主线程编号,之后把work类的工作交给子线程后,给子线程发送信号,子线程收到了信号开始执行,其线程号为0X1218...其最大的区别在于: moveToThread方法,把我们需要的工作全部封装在一个类中,将每个任务定义为一个的槽函数,再建立触发这些槽的信号,然后把信号槽连接起来,最后将这个类调用moveToThread...子类化QThread的方法,就是重写了QThread中的run()函数,在run()函数中定义了需要的工作。这样的结果,我们自定义的子线程调用start()函数后,便开始执行run()函数。...如果你不明白的话,请看,第二个例子中,子类化的线程的槽函数中输出当前线程的ID,而这个ID居然主线程的ID!!

84220
  • Qt QML VideoOutput 显示自定义的 YUV420P 数据流

    在 Qt 官网中,VideoOutput 的介绍中说明,source 属性可以是一个自定义派生于 QObject子类,并提供一个类型为 QMediaObject 的属性命名为 mediaObject...,或者一个派生与 QObject子类并提供一个类型为 QAbstractVideoSurface 的属性命名为 videoSurface。...FrameProvider 注册成一个 QML 可以使用的类型,这种方法也可以,但是你可以看到在 main 函数中需要去从 QML 中搜索该类实例化的对象句柄,然后再绑定信号槽,这个相对麻烦一些。...我们换一种方式就是先 new 对象然后绑定信号函数,最后再把对象注入到全局上下文中,让 QML 在任意位置都可以访问这个对象。...size); f.setStartTime(0); f.unmap(); emit newFrameAvailable(f); } 代码中使用了 QVideoFrame 的第二个构造函数

    5K30

    qt多线程编程实例_lgbt

    在run()函数的实现中,通过在栈中创建这些对象,可以轻松地做到这一点。 C、虽然QObject可重入的,但GUI类,尤其QWidget及其所有子类都不是可重入的,只能被用在GUI线程中。...重要的,切记事件循环可能正在向你的QObject子类发送事件,当你从另一个线程访问该对象时。...如果你正在调用一个QObject子类函数,而该子类对象并不存活于当前线程中,并且该对象是可以接收事件的,那么你必须用一个mutex保护对该QObject子类的内部数据的所有访问,否则,就有可能发生崩溃非预期的行为...Qt信号-槽连接函数原型如下: bool QObject::connect ( const QObject * sender, const char * signal, const QObject *...A、子类化 QThread B、重写run 使其调用 QThread::exec() ,开启线程的事件循环 C、为子类定义信号槽,由于槽函数并不会在新开的 Thread 运行,在构造函数中调用

    1.5K10

    Qt属性系统(Qt Property System)

    QObject中的子类的私有域中使用Q_PROPERTY宏来声明一个属性 image.png 以下来自QWidget类的一些属性声明 Q_PROPERTY(bool focus READ hasFocus...使用元对象系统读写属性   一个属性可以通过QObject::poperty()函数QObject::setProperty()函数访问设置。除了属性的名字之外不用知道类的别的信息。...假设我们有一个简单的类MyClass,它继承自QObject而且在private域中使用了Q_OBJECT。我们想声明一个属性用于跟踪权限值。...动态属性   QObject::setProperty()也可以被用来在运行时期为类实例添加属性。当传入名称值调用该函数时。...可以通过传递一个空的QVariant给setProperty函数来移除属性。QVariant的默认构造函数构造一个无效的QVariant对象。

    1.9K40

    Qt高并发

    线程安全QObject 可重入(reentrant)函数就是一个可以由多个线程同时调用的函数,其中任意的两次调用都不会试图访问相同的数据。...因此,即使你会认为QThread线程可以相互指代的,也是可以理解的。...这些程序使用一种变通方法:在QThread的构造函数中使用moveToThread(this)。这一变通方法的主要问题,在线程退出后,通过post方式派发给该对象的事件如何处理留下不确定性。...另外一种让代码在单独的线程内运行的方法子类化QThread并重新实现run()函数。...当子类化QThread时,记住构造函数在旧线程中执行的,而run()函数在新线程中执行的。如果一个成员变量被两个函数访问,那么变量被两个不同的线程访问。这时得检查这样做是否安全。

    1.5K20

    QT(二).计算器(3)

    信号槽能携带任意数量任意类型的参数,他们类型完全安全的,不会像回调函数那样产生 core dumps 所有从 QObject 或其子类 ( 例如 Qwidget) 派生的类都能够包含信号槽。...同普通的 C++ 成员函数一样,槽函数也分为三种类型,即 public slots、private slots protected slots public slots:在这个区内声明的槽意味着任何对象都可将信号与之相连接...对象的 connect 函数来将某个对象的信号与另外一个对象的槽函数相关联,这样当发射者发射信号时,接收者的槽函数将被调用 bool QObject::connect ( const QObject...* sender, const char * signal, const QObject * receiver, const char * member ) [static] 这个函数的作用就是将发射者...bool QObject::disconnect ( const QObject * sender, const char * signal, const Object * receiver,

    38420

    Qt自定义信号槽

    信号槽Qt的核心机制,只要是继承了QObject类的子类或者间接子类都可以使用信号槽机制,无论是不是GUI程序。...listen(const QString & str) { qDebug() << "老师讲的内容:" << str; } signals: }; #endif...为了能使用信号槽机制,我们的TeacherStudent都继承自QObject。并且在类中的第一行就写上了Q_OBJECT宏。...信号函数声明必须放在signals之下,另外signals受到public,protectedprivate限制。如果上面代码中的私有信号,那么我们将无法使用它。...因此,自定义信号槽需要三个步骤: 声明信号函数定义槽函数 连接信号槽 发射信号 信号可以连接到信号,这信号槽的连接没有本质区别; 一个信号可以连接多个槽函数,但是槽函数的执行顺序不确定的,不建议这么做

    1K10

    QT中界面间传值方式

    在Qt界面之间传递参数通常可以使用以下两种方法:一、使用信号槽机制在发送参数的界面中定义一个信号,然后在接收参数的界面中定义一个相应的槽函数。...下面一个简单的示例:发送界面的头文件:class SenderWidget : public QWidget{ Q_OBJECTsignals: void sendData(const QString...(winform构造函数传参)在构造函数或成员函数参数中传递参数:可以在创建接收界面对象时将需要传递的参数作为参数传递给构造函数,或者在调用接收界面的成员函数时传递参数。...下面一个简单的示例:接收界面的头文件:class ReceiverWidget : public QWidget{Q_OBJECTpublic:explicit ReceiverWidget(const...QWidget(parent){ label = new QLabel(data, this);}这是一个简单的示例代码,演示了使用信号槽机制以及构造函数传递参数两种方法来在Qt界面之间传递参数

    1.1K51

    7.QT-Qt对象间的父子关系

    Qt对象之间可以存在父子关系 继承于QObject类或者其子类的对象,都称为Qt对象 当指定Qt对象的父对象时 需要通过setParent()成员函数来设置对象间的父子关系 子对象将会把自己的指针地址保存在父对象的...children List链表里(因为父对象可以拥有多个子对象) 子对象内部会有一个指向其父对象的指针,可以通过parent()成员函数查看 代码试验 需要用到的函数: void QObject::setParent...( QObject * parent );    //设置为parent对象为自己的父对象 const QObjectList & QObject::children ();     //返回一个...obj2->setParent(obj1); //设置obj1为obj2的父对象 obj3->setParent(obj1); //设置obj1为obj3的父对象 const...代码试验delete 代码如下: #include #include class MObj : public QObject { private: QString

    98220

    使用元对象编译器

    * parent=0, const char * name=0 ); ~MyClass(); }; 这三个概念:信号槽、属性元对象数据可以组合在一起的。...多重继承需要把QObject放在第一个 如果你使用多重继承,元对象编译器假设首先继承的类QObject的一个子类。也就是说,确信仅仅首先继承的类QObject。...函数指针不能作为信号槽的参数 在你考虑使用函数指针作为信号/槽的参数的大多数情况下,我们认为继承一个不错的替代方法。...public slots: void apply( ApplyFunctionType, char * ); }; 有时用继承函数、信号槽来替换函数指针更好的。...为什么一个人会把一个构造函数放到信号部分或者槽部分,这对于我们来说都是很神秘的。

    97640

    QT信号槽机制

    回调实际上利用函数指针来实现,当我们希望某件事发生时处理函数能够获得通知,就需要将回调函数的指针传递给处理函数,这样处理函数就会在合适的时候调用回调函数。...回调有两个明显的缺点: 它们不是类型安全的,我们无法保证处理函数传递给回调函数的参数都是正确的。 回调函数处理函数紧密耦合,源于处理函数必须知道哪一个函数被回调。...槽普通的C++成员函数几乎一样的,它可以是虚函数,可以被重载,可以是共有、私有或是保护的,也同样可以被其他成员函数调用。它的函数参数也可以是任意类型的。唯一不同的:槽还可以信号连接在一起。...信号松耦合的:发出信号的类不关心哪些类将接收它的信号。QT的信号槽机制吧哦这里在正确的时间,槽能够接收到信号的参数并调用。信号槽都可以有任意个数的参数,它们都是类型安全的。...自定义信号槽的一个例子 首先我们要知道的,所有继承自QObject或者它的子类(如QWidget)都可以包含信号槽。我们写的类须继承自QObject(或其子类)。

    81930

    QObject

    一、 QObject概述 说到Qt,你肯定首先想到的就是信号槽,而这就不得不提到Qobject,这次大家分享下QObject的相关内容,并对一些内容进行代码说明,方便理解。...QObjectQt对象模型,Qt绝大部分类都是继承该类实现的。 该模型的核心特点提供了一种对象之间的通讯机制——信号槽。...详细情况请参考installEventFilter()eventFilter()。 最后要注意的一点QObject在Qt中提供了基本的计时器支持。 有关定时器的高级支持,请参见QTimer 。...Qt官方强烈建议在QObject的所有子类中都使用该宏,不论它们是否实际使用信号插槽或属性,因为不这样做可能会导致某些奇葩的错误。我个人不愿意解决奇葩的错误的,比较浪费精力。...所有Qt的窗体都继承自QObject。 便捷函数isWidgetTye()返回对象是否窗体部件的bool值。一些QObject函数(例如children())返回QObjectList。

    1.2K10

    QT信号槽机制

    回调实际上利用函数指针来实现,当我们希望某件事发生时处理函数能够获得通知,就需要将回调函数的指针传递给处理函数,这样处理函数就会在合适的时候调用回调函数。...回调有两个明显的缺点: 它们不是类型安全的,我们无法保证处理函数传递给回调函数的参数都是正确的。 回调函数处理函数紧密耦合,源于处理函数必须知道哪一个函数被回调。...槽普通的C++成员函数几乎一样的,它可以是虚函数,可以被重载,可以是共有、私有或是保护的,也同样可以被其他成员函数调用。它的函数参数也可以是任意类型的。唯一不同的:槽还可以信号连接在一起。...信号松耦合的:发出信号的类不关心哪些类将接收它的信号。QT的信号槽机制吧哦这里在正确的时间,槽能够接收到信号的参数并调用。信号槽都可以有任意个数的参数,它们都是类型安全的。...自定义信号槽的一个例子 首先我们要知道的,所有继承自QObject或者它的子类(如QWidget)都可以包含信号槽。我们写的类须继承自QObject(或其子类)。

    1.7K20
    领券