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));
}

1

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]