新手求教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

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

求高人指点,不胜感激!
...全文
125 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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"));
}
内容概要:本文档是2025年全国广播电视技术能手竞赛IPTV专业的竞赛内容大纲,旨在指导参赛选手准备比赛。竞赛分为理论和实操两大部分。理论部分涵盖基本知识、基础理论和专业知识,包括法律法规、技术标准、IPTV技术基础、信号传输与分发、网络和数据安全等。实操部分则涉及IPTV系统设备、仪器设备的操作使用和指标测量。具体内容包括IPTV系统架构、传输技术与指标、设备配置及维护、专业技能如测量工具使用、视音频指标测量、直播点播协议分析、播出网络性能测量、网络安全数据分析以及系统故障排查等。 适合人群:从事或有意从事IPTV相关工作的技术人员,尤其是有志于参加全国广播电视技术能手竞赛的专业人士。 使用场景及目标:①帮助参赛选手全面了解并掌握IPTV相关的法规文件和技术标准;②提升选手对IPTV系统架构、传输技术和设备配置的理解;③增强选手在实际操作中的测量、分析和故障排查能力;④确保选手能够熟练运用各种测量工具和分析软件进行视音频指标测量和网络安全数据分析。 阅读建议:由于文档内容详尽且专业性强,建议读者在学习过程中结合实际案例和操作练习,同时参考相关技术文献,以便更好地理解和掌握竞赛所需的知识和技能。

16,818

社区成员

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

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