已经确定错误出现在updateMenus()和connect()两句中。
mainWindow::mainWindow(QWidget *parent)
: QMainWindow(parent)
{
actionSeparator = new QAction(this);
actionSeparator->setSeparator(true);
updateMenus(); // 更新菜单
//有活动窗口时更新菜单
connect(ui.mdiArea, SIGNAL(subWindowActivated(QMidSubWindow *)), this, SLOT(updateMenus()));
ui.setupUi(this);
setActions();
}
void mainWindow::updateMenus()
{
// 根据是否有子窗口来设置各个动作是否可用
bool hasMdiChill = (activeMidChild ()!= NULL);
actionSave->setEnabled(hasMdiChill);
actionSaveAs->setEnabled(hasMdiChill);
actionPaste->setEnabled(hasMdiChill);
actionClose->setEnabled(hasMdiChill);
actionCloseAll->setEnabled(hasMdiChill);
actionTile->setEnabled(hasMdiChill);
actionCascade->setEnabled(hasMdiChill);
actionPrevious->setEnabled(hasMdiChill);
// 设置间隔器是否显示
actionSeparator->setVisible(hasMdiChill);
// 有活动窗口且有文本被选择时,剪切复制才可使用
bool hasSelection = activeMidChild() && (activeMidChild()->textCursor().hasSelection());
actionCut->setEnabled(hasSelection);
actionCopy->setEnabled(hasSelection);
// 有活动文档且文档有撤销操作时撤销动作可用
actionUndo->setEnabled(activeMidChild() && activeMidChild()->document()->isUndoAvailable());
// 有活动文档且文档有恢复操作时恢复动作可用
actionRedo->setEnabled(activeMidChild() && activeMidChild()->document()->isRedoAvailable());
}
MdiClass *mainWindow::activeMidChild()
{
// 如果有活动窗口,则将其中心部件转化为MdiClas类型
if (QMdiSubWindow * activeWindow = ui.mdiArea->activeSubWindow())
{
return qobject_cast<MdiClass *>(activeWindow->widget());
}
return NULL;
}
报错:
0x6463477C (Qt5Widgetsd.dll) (myMdi.exe 中)处的第一机会异常: 0xC0000005: 读取位置 0x00000D50 时发生访问冲突。
0x6463477C (Qt5Widgetsd.dll) (myMdi.exe 中)处有未经处理的异常: 0xC0000005: 读取位置 0x00000D50 时发生访问冲突。
我不太明白这里是什么意思? 求指教
很正常啊,你把ui.setupUi(this);放到最前面就行了,因为你的connect在前面,不过小错误还是有点的.你自己看下吧.
感觉像是 activeMidChild()的问题,这函数直接让它return null,然后试试看还有没有这个问题?
activeMidChild()从装就好哩
当你可以编译成功的时候,会发现输出的地方提示你的信号槽的连接有些问题,因为参数没有对应。
把ui.setupUi(this)放最前面就可以了
ui.setupUi(this); 放到前面
不能再没有定义时使用界面内器件
ui.setupUi(this);移到所在函数体最前面
ui.setupUi(this); 要放到前面,还没有进行ui的setup,ui中所有的控件都没有进行实例化,导致在使用ui.mdiArea的时候出现指针错误
ui.mdiArea 是空的,ui.setupUi(this);提前
问题已解决,感谢各位回复~