这几天不写学习总结好像缺少了什么,心里有点不踏实。想想还是动动手,写个学习总结吧。创建主窗口从何下手呢??面对长长的代码,似乎一点头晕。面对这个情况,还不如静下心来寻找突破点~,能把主窗口创建好也有它们的先后顺序。创建主窗口包含下面这些内容:(1)子类化QMainWindow2)创建菜单和工具栏(3)设置状态栏(4)实现File菜单(5)使用对话框(6)存储设置(7)多文档(8)程序启动画面
那个简单的例子先实现前三个功能先吧。创建子类化QMainWindow、创建菜单和工具栏、设置状态栏…..
实现创建子类化QMainWindow,创建一个便于自己识别的目录,我这里定义一个工程名为spreadsheet目录,为空工程项目。
找到左边的创建的spreadsheet项目文件,点击鼠标右键,弹出菜单列表,选择添加新项,弹出新项对话框,默认单选项是创建源文件,文件名定义为mainwindow.cpp,然后选择创建的项目的目录/root/spreadsheet,点击确定。在点击是,在同一个位置上创建头文件。
接着以同样的方式创建主函数源文件,这次可以不在同一位上创建main.cpp源文件的头文件。点击否
先定义主函数,然后定义基本的框架以后,创建一个主窗口构造函数对象,然后将它主窗口部件显示出来
定义一个继承公共的主窗口部件 MainWindow 的类,在公共主窗口中,声明一个公共 MainWindow 构造函数,定义一个 QMdiArea 对象类, QMdiArea 部件提供了一个 MDI 窗口,其中显示面积。定义一个私有的 QMdiArea 指针。
声明类初始化的头文件,接着声明继承构造函数 MainWindow ,在继承的 MainWindow ()函数中将 mdiArea 设置为中央窗口部件
声明创建一个私有动作函数,再声明一个 QAction 动作类,然后设置 QAction 动作 File 菜单栏下的动作指针 , 如:新建、打开、保存、另存为、退出等等。
要用到构造函数 MainWindow 的定义创造动作的函数,要先声明。当点击 File 菜单下的动作的时候,就会找到构造函数,然后找到动作函数具体声明,接着连接信号与槽实现对应的功能。在字符串的周围的 tr() 函数的调用是把它们翻译成其他语言的标记。使用“与”操作的符号“ & ”来表示快捷键。可以用来控制焦点快捷键标签,如 : 新建 (Ctrl+N) 、打开 (Ctrl+O) 等等。 this 指的是对象 . 然后调用 setShortcut() 函数 , 将快捷键显示出来。
设置好动作后,重新构建,启动程序是弹出出来看不到效果,要添加一个菜单栏,将动作显示出来。在mainwindow.h头文件中,声明一个菜单类,定义一个File菜单指针。创建一个创建菜单的函数
接着在构造函数中声明创建菜单函数,接着声明createMenu()创建菜单函数是重构造函数中来的,在创建函数中实现File菜单功能,菜单栏中增加一个菜单快捷键File,在File菜单栏中增加一些动作
做完以后重新构建,启动程序。可以看到效果了
实现工具栏也是一样的方法,在 mainwindow.h 头文件中声明 QToolBar 工具栏类,在声明一个私有的创建工具状态函数 createToolBars()
说到工具栏大伙都非常熟悉,最明显的特征是用图标显示指定的功能。所有要定义一个资源,在 spreadsheet 工程目录中添加资源,资源以 .qrc 结尾。应用资源时,就像下面定义,指定用 p_w_picpaths 目录下的图标。装图标资源的 p_w_picpaths 目录要复制到 spreadsheet 工程目录 .
在资源文件说明引用p_w_picpaths下资源以后,转到mainwindow.cpp源文件,应用资源图标用”:/”声明工具栏函数中,创建一个工具栏,接着将工具栏动作添加进去,重新构建,启动程序。可以看到工具栏的运行效果了
最后实现状态栏的功能,添加一个标签窗口部件显示指定状态栏的信息。创建一个状态栏函数。
在主函数显示状态栏函数的功能,在状态栏中添加一个标签窗口部件。用来显示状态栏的信息。
重新构建,检查一下最后的成果吧
#ifndef __MAINWINDOW_H__
#define __MAINWINDOW_H__
#include <QMainWindow>
class QMdiArea;
class QAction;
class QMenu;
class QToolBar;
class QLabel;
// place your code here
class MainWindow:public QMainWindow
{
      public:
      MainWindow();
     
      private:
      void createActions();
      void createMenus();
      void createToolBars();
      void createStatusBar();
     
      QMenu *fileMenu;
     
      QToolBar *fileToolBar;
     
      QMdiArea *mdiArea;
      QLabel *readyLabel;
     
      QAction *newAction;
      QAction *openAction;
      QAction *saveAction;
      QAction *saveAsAction;
      QAction *exitAction;
};
#endif // __MAINWINDOW_H__
 
#include "mainwindow.h"
#include <QtGui>
MainWindow::MainWindow()
{
       mdiArea = new QMdiArea;
       setCentralWidget(mdiArea);
      
       createActions();
       createMenus();
       createToolBars();
       createStatusBar();
       setWindowTitle(tr("MDI Editor"));
}
// place your code here
void MainWindow::createActions()
{
    newAction = new QAction(tr("&New"), this);
    newAction->setShortcut(QKeySequence::New);
    newAction->setIcon(QIcon(":/p_w_picpaths/new.png"));
    newAction->setStatusTip(tr("Create a new file"));
   
    openAction = new QAction(tr("&Open..."), this);
    openAction->setShortcut(QKeySequence::Open);
    openAction->setIcon(QIcon(":/p_w_picpaths/open.png"));
    openAction->setStatusTip(tr("Open an existing file"));
   
    saveAction = new QAction(tr("&Save"), this);
    saveAction->setShortcut(QKeySequence::Save);
    saveAction->setIcon(QIcon(":/p_w_picpaths/save.png"));
    saveAction->setStatusTip(tr("Save the file to disk"));
   
    saveAsAction = new QAction(tr("Save &As..."), this);
    saveAsAction->setStatusTip(tr("Save the file under a new name"));
   
    exitAction = new QAction(tr("E&xit"), this);
    exitAction->setShortcut(tr("Ctrl+Q"));
    exitAction->setStatusTip(tr("Exit the application"));
}
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

void MainWindow::createMenus()
{
    fileMenu = menuBar()->addMenu(tr("&File"));
    fileMenu->addAction(newAction);
    fileMenu->addAction(openAction);
    fileMenu->addAction(saveAction);
    fileMenu->addAction(saveAsAction);
    fileMenu->addSeparator();
    fileMenu->addAction(exitAction);
}

 

void MainWindow::createToolBars()
{
    fileToolBar = addToolBar(tr("File"));
    fileToolBar->addAction(newAction);
    fileToolBar->addAction(openAction);
    fileToolBar->addAction(saveAction);
}

 

void MainWindow::createStatusBar()
{
    readyLabel = new QLabel(tr(" Ready"));
    statusBar()->addWidget(readyLabel, 1);
}
#include <QApplication>
#include "mainwindow.h"

 

int main(int argc,char *argv[])
{
     QApplication app(argc,argv);
     MainWindow mainWin;
     mainWin.show();
     return app.exec();
}
 
 
 
呵呵。最后我想说,其实实现这些功能也没有想象中的那么难。关键要勤动手试,多思考。