123---5 (8)4 6 9 7---10
class CMenuItemID : public QObject{ Q_OBJECTpublic: CMenuItemID(CMenuItemID* parent, QAction *action) : m_pParent(parent), m_pAction(action) { connect(action, SIGNAL(hovered()), this, SLOT(onHovered())); }; virtual ~CMenuItemID() {};public slots: void onHovered() // <<------- Процедура генерации нового подменю { //Твой код }; private: CMenuItemID *m_pParent; QAction *m_pAction;};
class CMenuItemID : public QObject { Q_OBJECT public: CMenuItemID(CMenuItemID* parent, QAction *action) : m_pParent(parent), m_pAction(action) { connect(action, SIGNAL(hovered()), this, SLOT(onHovered())); }; virtual ~CMenuItemID() { delChildNodes(); //Удаляем все свои дочерние узлы //Здесь, если хочешь, можешь удивать также объект QAction //Хотя, наверно, так и придется делать. }; CMenuItemID* addNode(CMenuItemID* node) { //Здесь твой код return node; } void delChildNodes() { if (m_pNodes.count() > 0) { QVector<CMenuItemID*>::iterator first = m_pNodes.begin(); QVector<CMenuItemID*>::iterator last = m_pNodes.end(); for(; first != last; ++first) { //Удаляем узел, он в свою очередь в деструкторе удалит //все свои дочерние узлы delete (CMenuItemID*) *first; } m_pNodes.clear(); // C помощью этих трех строчек QVector buf; // освобождаем память, занимаемую swap(buf, m_pNodes); // вектором указателей на дочерние узлы } }public slots: void onHovered() // <<------- Процедура генерации нового подменю { //Твой код }; private: CMenuItemID *m_pParent; QAction *m_pAction; QVector<CMenuItemID*> m_pNodes; // <<- вектор дочерних узлов};