Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ QAction从QMenu中删除后未触发QAction_C++_Qt_Qmenu_Qaction - Fatal编程技术网

C++ QAction从QMenu中删除后未触发QAction

C++ QAction从QMenu中删除后未触发QAction,c++,qt,qmenu,qaction,C++,Qt,Qmenu,Qaction,我正在用一个典型的主窗口GUI界面编写一个程序,该界面包含QMainWindow和QMdiWindowQt5.4类,类似于下图中的一个(来自) 每次活动子窗口更改时,都会调用updateWindowMenu()方法,清除并重新填充Window菜单,其中QActions指向每个子窗口中的一个,即,单击某个操作时,与此操作关联的子窗口将显示在最前面,并将成为活动子窗口。关联是通过QSignalMapper完成的,因为updateWindowMenu()需要当前活动的子窗口(如果有) 当我点击一个动

我正在用一个典型的主窗口GUI界面编写一个程序,该界面包含
QMainWindow
QMdiWindow
Qt5.4类,类似于下图中的一个(来自)

每次活动子窗口更改时,都会调用
updateWindowMenu()
方法,清除并重新填充
Window
菜单,其中
QActions
指向每个子窗口中的一个,即,单击某个操作时,与此操作关联的子窗口将显示在最前面,并将成为活动子窗口。关联是通过
QSignalMapper
完成的,因为
updateWindowMenu()
需要当前活动的子窗口(如果有)

当我点击一个动作时,问题就出现了,它的信号不会被触发,因此关联的子窗口不会被带到前面。经过调查,我意识到阻碍动作触发的是调用
menuWindow->removeAction(mySubwindowActions->at(n))
menuWindow
来自使用Qt设计器创建的
.iu
文件)。就是这样,如果我不加评论的话

// for (int n=0; n<mySubwindowActions->size(); ++n)
//    menuWindow->removeAction(mySubwindowActions->at(n));
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));
}
void WindowMain::WindowMain(){
连接(myMdiArea,&QMdiArea::subWindowActivated,this,&WindowMain::updateWindowMenu);
mySignalMapper=新的QSignalMapper(此);
连接(mySignalMapper、static_cast(&QSignalMapper::mapped)、this和&WindowMain::setActiveSubWindow);
mySubwindowActions=new QList();
}
void WindowMain::updateWindowMenu(qmdusubwindow*mdiSubwindow){
对于(int n=0;nsize();++n)
menuWindow->removeAction(mySubwindowActions->at(n));
mySubwindowActions->clear();
如果(mdiSubwindow!=0){
QList subwindows=myMdiArea->subWindowList();
对于(int n=0;naddAction(subwindows.at(n)->widget()->windowTitle());
mySubwindowActions->append(actionSubwindow);
mySignalMapper->setMapping(actionSubwindow,subwindows.at(n));
连接(actionSubwindow,&QAction::triggered,mySignalMapper,static_cast(&QSignalMapper::map));
}
}
}
void WindowMain::setActiveSubWindow(QWidget*子窗口){
myMdiArea->setActiveSubWindow(qobject_cast(subWindow));
}

这不是你的完整代码。你在哪里初始化代码> MunuWele>代码?还有,你使用QT和C++的版本吗?@ zeta信息添加到问题中。这不是你的完整代码。你在哪里初始化代码>菜单窗口< /C>?还有,你使用QT和C++的版本吗?@ zeta信息加上这个问题。
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));
}