新手求教Qt的初级问题,关于创建动作的

blunder 2012-07-24 01:20:35
头文件

#ifndef MAINWINDOW_COPY_H
#define MAINWINDOW_COPY_H

#include <QMainWindow>

class QAction;
class QLabel;
class Spreadsheet;



class MainWindow_copy : public QMainWindow
{

Q_OBJECT

public:
MainWindow_copy();
Spreadsheet *spreadsheet;

public:
QMenu *fileMenu;
QMenu *editMenu;
QMenu *toolsMenu;
QMenu *optionsMenu;
QMenu *helpMenu;
QLabel *locationLabel;
QLabel *formulaLabel;
QToolBar *fileToolBar;
QToolBar *editToolBar;
QAction *newAction;


private:
void createMenus();
void createStatusBar();
void createToolBar();
void createActions();

};

#endif // MAINWINDOW_COPY_H



cpp文件
#include <QMainWindow>
#include <QtGui>
#include <QtGui/QMenuBar>
#include <mainwindow_copy.h>
#include "spreadsheet.h"

MainWindow_copy::MainWindow_copy()
{
createMenus();
spreadsheet = new Spreadsheet;
setCentralWidget(spreadsheet);
createStatusBar();
createToolBar();

}

void MainWindow_copy::createMenus()
{
fileMenu = menuBar()->addMenu(tr("&File"));
fileMenu->addAction(newAction);
editMenu= menuBar()->addMenu(tr("&Edit"));
toolsMenu = menuBar()->addMenu(tr("&Tools"));
optionsMenu = menuBar()->addMenu(tr("&Options"));
helpMenu = menuBar()->addMenu(tr("&Help"));
}

void MainWindow_copy::createStatusBar()
{

locationLabel = new QLabel("W999");
statusBar()->addWidget(locationLabel);
formulaLabel = new QLabel;
statusBar()->addWidget(formulaLabel,1);

}

void MainWindow_copy::createActions()
{
newAction = new QAction(tr("&New"),this);
newAction->setShortcut(QKeySequence::New);
newAction->setIcon(QIcon(":/images/new.png"));
newAction->setStatusTip("this is a Create new file");
connect(newAction,SIGNAL(triggered()),this,SLOT(close()));
}

主函数

#include <QApplication>

#include "mainwindow_copy.h"

int main(int argc,char *argv[])
{
QApplication app(argc,argv);
MainWindow_copy lxb;
lxb.show();
return app.exec();
}


参照经典Qt教程C++ GUI Qt4第三章的例子我想把整个例子再组装一遍,先是创建了窗口,菜单栏,工具栏,还有spreadsheet(上面程序没有包括相关的文件),但是往菜单栏File选项添加动作的时候出现问题了
出现问题的语句: fileMenu->addAction(newAction);
删掉它,窗口正确显示
添上它,提示错误如下:
Starting /home/lxb/qt/mainwindow_copy/mainwindow_copy...
The program has unexpectedly finished.
/home/lxb/qt/mainwindow_copy/mainwindow_copy exited with code 0

我参照示例程序,感觉程序应该没有问题,但是就是报这个错

求高人指点,不胜感激!
...全文
118 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
chenzhp 2012-07-24
  • 打赏
  • 举报
回复
你在createActions()函数中,会创建一个Action的实例。就是:newAction = new QAction(tr("&New"),this);
newAction是一个成员变量。
而你的函数createMenu()中,会用到这个成员变量。
所以,必须先让成员变量newAction有一个值,才能使用。否则,你提前就在createMenu()里面调用newAction,而newAction这个时候是null,肯定会出错的

所以有先后顺序。
blunder 2012-07-24
  • 打赏
  • 举报
回复
感谢你的回答 你说得很对
MainWindow_copy::MainWindow_copy()
{
createMenus();
spreadsheet = new Spreadsheet;
setCentralWidget(spreadsheet);
createStatusBar();
createToolBar();
createActions();
}

其实我的构造函数里是加了createActions()的,提问题的刚修改了程序,没加上去。

但是上面的也不行

不过经过你的提点
我发现CreateActions()必须要在createMenus()之后
也就是说

构造函数改成这样
MainWindow_copy::MainWindow_copy()
{

createActions();
createMenus();
spreadsheet = new Spreadsheet;
setCentralWidget(spreadsheet);
createStatusBar();
createToolBar();

}
就对了,想问一句构造函数里的函数调用有顺序么??
最后非常感谢!!
chenzhp 2012-07-24
  • 打赏
  • 举报
回复

void MainWindow_copy::createMenus()
{
fileMenu = menuBar()->addMenu(tr("&File"));
createActions();//加上这一句,先创建Action啊,不然action都没有,你怎么添加
fileMenu->addAction(newAction);
editMenu= menuBar()->addMenu(tr("&Edit"));
toolsMenu = menuBar()->addMenu(tr("&Tools"));
optionsMenu = menuBar()->addMenu(tr("&Options"));
helpMenu = menuBar()->addMenu(tr("&Help"));
}

16,211

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧