Qt QObject自动删除

Qt QObject自动删除,qt,qt4,qevent,Qt,Qt4,Qevent,当我不希望QObject被删除时,它却出现了一些问题 我有这个类(注意我没有声明Q_对象) 我像这样发送和接收此事件(接收方是parent(),lp_currentEntry是MyEntry对象): 我遇到的问题是,一旦事件交付,MyEvent就会被删除。但它所包含的MyEntry的析构函数也被称为。我从未使用MyEvent作为父对象创建MyEntry,为什么要删除它 我之所以使用这种设置,是因为postEvent通常由非ui线程完成,我非常确定非ui线程不应该更新QLabels等,否则我可以简

当我不希望QObject被删除时,它却出现了一些问题

我有这个类(注意我没有声明Q_对象)

我像这样发送和接收此事件(接收方是parent(),lp_currentEntry是MyEntry对象):

我遇到的问题是,一旦事件交付,MyEvent就会被删除。但它所包含的MyEntry的析构函数也被称为。我从未使用MyEvent作为父对象创建MyEntry,为什么要删除它

我之所以使用这种设置,是因为postEvent通常由非ui线程完成,我非常确定非ui线程不应该更新QLabels等,否则我可以简单地执行
(MyOtherClass*)parent()->updateLabels(lp_currentEntry)-如果我错了,请纠正我

编辑:以下是回溯:

#0  MyEntry::~MyEntry (this=0x7f83a0, __in_chrg=<optimized out>) at ../jb2/containers.cpp:171
#1  0x000000000040ede9 in MyEntry::~MyEntry (this=0x7f83a0, __in_chrg=<optimized out>) at ../jb2/containers.cpp:178
#2  0x0000000000416439 in ~MyEvent (this=0xfc7810, __in_chrg=<optimized out>) at ../jb2/jb2Events.h:28
#3  MyEvent::~MyEvent (this=0xfc7810, __in_chrg=<optimized out>) at ../jb2/jb2Events.h:28
#4  0x0000003ad317b45a in QCoreApplicationPrivate::sendPostedEvents(QObject*, int, QThreadData*) () from /lib64/libQtCore.so.4
#5  0x0000003ad31a5e33 in ?? () from /lib64/libQtCore.so.4
#6  0x0000003b24847825 in g_main_context_dispatch () from /lib64/libglib-2.0.so.0
#7  0x0000003b24847b58 in ?? () from /lib64/libglib-2.0.so.0
#8  0x0000003b24847c14 in g_main_context_iteration () from /lib64/libglib-2.0.so.0
#9  0x0000003ad31a5fc6 in QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () from /lib64/libQtCore.so.4
#10 0x0000003ad4a6a5ee in ?? () from /lib64/libQtGui.so.4
#11 0x0000003ad31766ef in QEventLoop::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () from /lib64/libQtCore.so.4
#12 0x0000003ad3176978 in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) () from /lib64/libQtCore.so.4
#13 0x0000003ad317b768 in QCoreApplication::exec() () from /lib64/libQtCore.so.4
#14 0x0000000000408f53 in main (argc=1, argv=<optimized out>) at ../jb2/main.cpp:10
#0 MyEntry::~MyEntry(this=0x7f83a0,u in_chrg=)位于../jb2/containers.cpp:171
#MyEntry中的0x000000000040ede9::~MyEntry(this=0x7f83a0,u in_chrg=)位于../jb2/containers.cpp:178
#2 0x0000000000416439 in~MyEvent(this=0xfc7810,uu in_chrg=)位于../jb2/jb2Events.h:28
#3 MyEvent::~MyEvent(this=0xfc7810,u in_chrg=)位于../jb2/jb2Events.h:28
#来自/lib64/libQtCore.so.4的QCoreApplicationPrivate::sendPostedEvents(QObject*,int,QThreadData*)()中的4 0x0000003ad317b45a
#5 0x0000003ad31a5e33英寸??()来自/lib64/libQtCore.so.4
#来自/lib64/libglib-2.0.so.0的g_main_context_dispatch()中的6 0x0000003b24847825
#7 0x0000003b24847b58英寸??()来自/lib64/libglib-2.0.so.0
#8 0x0000003b24847c14,位于/lib64/libglib-2.0.so.0的g_main_context_迭代()中
#来自/lib64/libQtCore.so.4的QEventDispatcherGlib::processEvents(QFlags)()中的9 0x0000003ad31a5fc6
#10 0x0000003ad4a6a5ee英寸??()来自/lib64/libQtGui.so.4
#11/lib64/libQtCore.so.4中QEventLoop::processEvents(QFlags)()中的0x0000003ad31766ef
#来自/lib64/libQtCore.so.4的QEventLoop::exec(QFlags)()中的12 0x0000003ad3176978
#13/lib64/libQtCore.so.4中QCoreApplication::exec()中的0x0000003ad317b768
#位于../jb2/main.cpp:10的main(argc=1,argv=)中的14 0x0000000000408f53

我不知道为什么要删除您的对象(您是否尝试在析构函数上放置断点?),但QTreeWidgetItem不是QObject。奇怪的是,如果我这样做:QApplication::postEvent(parent(),new MyEvent(0));一切正常。。当它试图删除空指针时,我不会得到一个分割错误,所以显然它并没有试图调用空指针上的删除在C++中是完全合法的,但是如果你的示例代码是正确的,当然你的MyItIt不应该被MyEnter删除。我认为在任何人能够进一步帮助您之前,您需要获得删除位置的堆栈跟踪。我添加了回溯~MyEntry从~MyEvent调用。不确定“优化输出”消息的含义。在postEvent传递事件之前,您是否有可能在QTreeWidget上调用clear()?
class MyEvent : public QEvent
{
public:
    MyEvent(MyEntry* _ob) : QEvent((QEvent::Type)MYEVENT1), mp_ob(_ob) {}
    ~MyEvent() {}
    MyEntry* getOb() { return mp_ob; }
private:
    MyEntry* mp_ob;
};
Class that contains the QTreeWidget:

QApplication::postEvent(parent() , new MyEvent(lp_currentEntry));


Class that contains the QLabels:

void MyOtherClass::customEvent(QEvent* _p_ev)
{
  return;
}
#0  MyEntry::~MyEntry (this=0x7f83a0, __in_chrg=<optimized out>) at ../jb2/containers.cpp:171
#1  0x000000000040ede9 in MyEntry::~MyEntry (this=0x7f83a0, __in_chrg=<optimized out>) at ../jb2/containers.cpp:178
#2  0x0000000000416439 in ~MyEvent (this=0xfc7810, __in_chrg=<optimized out>) at ../jb2/jb2Events.h:28
#3  MyEvent::~MyEvent (this=0xfc7810, __in_chrg=<optimized out>) at ../jb2/jb2Events.h:28
#4  0x0000003ad317b45a in QCoreApplicationPrivate::sendPostedEvents(QObject*, int, QThreadData*) () from /lib64/libQtCore.so.4
#5  0x0000003ad31a5e33 in ?? () from /lib64/libQtCore.so.4
#6  0x0000003b24847825 in g_main_context_dispatch () from /lib64/libglib-2.0.so.0
#7  0x0000003b24847b58 in ?? () from /lib64/libglib-2.0.so.0
#8  0x0000003b24847c14 in g_main_context_iteration () from /lib64/libglib-2.0.so.0
#9  0x0000003ad31a5fc6 in QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () from /lib64/libQtCore.so.4
#10 0x0000003ad4a6a5ee in ?? () from /lib64/libQtGui.so.4
#11 0x0000003ad31766ef in QEventLoop::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () from /lib64/libQtCore.so.4
#12 0x0000003ad3176978 in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) () from /lib64/libQtCore.so.4
#13 0x0000003ad317b768 in QCoreApplication::exec() () from /lib64/libQtCore.so.4
#14 0x0000000000408f53 in main (argc=1, argv=<optimized out>) at ../jb2/main.cpp:10