Я кодирую программу с типичным интерфейсом главного окна графического интерфейса с QMainWindow
а также QMdiWindow
Классы Qt 5.4 аналогичны рисункам ниже (из официальная документация).
Каждый раз, когда активное подокно меняет 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));
}
Задача ещё не решена.