予期しないときに削除される QObject に問題があります。
私はこのクラスを持っています (Q_OBJECT を宣言していないことに注意してください)
class MyEntry : public QTreeWidgetItem
{
public:
MyEntry(QTreeWidgetItem* _parent, QString _name = "noname") :
QTreeWidgetItem(_parent, QStringList() << _name) {}
... it holds a few QStrings and has some setter/getter methods for them
};
QTreeWidget を含むクラスでこのオブジェクトを作成して使用します。時々、このクラスは MyEntry の 1 つを別のクラスに「送信」します。このクラスは、送信されている MyEntry からの情報を使用して、保持している QLabel にテキストを設定します。次の QEvent を使用します。
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;
};
このイベントを次のように送受信します (レシーバーは parent() で、lp_currentEntry は MyEntry オブジェクトです)。
Class that contains the QTreeWidget:
QApplication::postEvent(parent() , new MyEvent(lp_currentEntry));
Class that contains the QLabels:
void MyOtherClass::customEvent(QEvent* _p_ev)
{
return;
}
私が抱えている問題は、イベントが配信されるとすぐに 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