QAction не запускается после удаления QAction из QMenu

Я кодирую программу с типичным интерфейсом главного окна графического интерфейса с QMainWindow а также QMdiWindow Классы Qt 5.4 аналогичны приведенным ниже рисункам (из официальной документации).

Qt MDI

Каждый раз, когда активное подокно меняет updateWindowMenu() метод вызывается, и он очищает и населяет Window меню с QActions указывая на одно из каждого подокна, то есть, когда вы щелкаете действие, подокно, связанное с этим действием, переносится на передний план и становится активным подокном. Ассоциация сделана с QSignalMapper так как updateWindowMenu() нуждается в текущем активном подокне (если есть).

Проблема возникает, когда я щелкаю по действию, его сигнал не срабатывает и, следовательно, связанное подокно не выводится на передний план. Проведя расследование, я понял, что препятствием для запуска является вызов menuWindow->removeAction(mySubwindowActions->at(n)) (menuWindow исходит от .iu файл, созданный с помощью Qt Designer). Вот и все, если я закомментирую

// for (int n=0; n<mySubwindowActions->size(); ++n)
//    menuWindow->removeAction(mySubwindowActions->at(n));

дублированные действия на Window меню будет добавляться каждый раз updateWindowMenu() называется, но они будут работать как положено, и они выведут на передний план соответствующее подокно.

Почему это аномальное поведение? Как я могу удалить действия, не мешая нормальной работе новых добавленных действий?

WindowMain.h

class WindowMain : public QMainWindow, public Ui::mainWindow {
    Q_OBJECT

    private:
        QSignalMapper* mySignalMapper;
        QList<QAction*>* mySubwindowActions;

    private slots:
        void updateWindowMenu(QMdiSubWindow*);
        void setActiveSubWindow(QWidget*);
}

WindowMain.cpp

void WindowMain::WindowMain() {
    connect(myMdiArea, &QMdiArea::subWindowActivated, this, &WindowMain::updateWindowMenu);

    mySignalMapper = new QSignalMapper(this);
    connect(mySignalMapper, static_cast<void (QSignalMapper::*)(QWidget*)>(&QSignalMapper::mapped), this, &WindowMain::setActiveSubWindow);

    mySubwindowActions = new QList<QAction*>();
}


void WindowMain::updateWindowMenu(QMdiSubWindow* mdiSubwindow) {
    for (int n=0; n<mySubwindowActions->size(); ++n)
        menuWindow->removeAction(mySubwindowActions->at(n));
    mySubwindowActions->clear();

    if (mdiSubwindow != 0) {
        QList<QMdiSubWindow*> subwindows = myMdiArea->subWindowList();
        for (int n=0; n<subwindows.size(); ++n) {
            QAction* actionSubwindow = menuWindow->addAction(subwindows.at(n)->widget()->windowTitle());
            mySubwindowActions->append(actionSubwindow);
            mySignalMapper->setMapping(actionSubwindow, subwindows.at(n));
            connect(actionSubwindow, &QAction::triggered, mySignalMapper, static_cast<void (QSignalMapper::*)()>(&QSignalMapper::map));
        }
    }
}


void WindowMain::setActiveSubWindow(QWidget* subWindow) {
    myMdiArea->setActiveSubWindow(qobject_cast<QMdiSubWindow*>(subWindow));
}

0 ответов

Другие вопросы по тегам