第三十六课、文本编辑器中的功能交互

一 、判断未保存的数据

1、QPlainTextEdit能够触发与编辑功能相关的信号

2、解决方案

(1)、定义槽函数void onTextChanged()

(2)、映射textChanged()到槽函数

(3)、定义成员变量bool m_isTextChanged = false;

(4)、当文本框内容发生改变时, m_isTextChanged = true;

(5)、当m_isTextChanged 为真时,则保存数据

二、文本编辑器的持续开发

1、文件打开操作

2、文件新建操作

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMenuBar>
#include <QMenu>
#include <QAction>
#include <QString>
#include <QtGui/QMainWindow>
#include <QToolBar>
#include <QIcon>
#include <QSize>
#include <QStatusBar>
#include <QLabel>
#include <QPlainTextEdit>
#include <QFileDialog>
class MainWindow : public QMainWindow
{
    Q_OBJECT
private:
        QPlainTextEdit mainEdit;
        QLabel statusLabel;
        QString m_filePath;//记得在构造函数里初始化
        bool m_isTextChanged;//构造函数里初始化为false

        MainWindow(QWidget *parent = 0);
        MainWindow(const MainWindow& obj);
        MainWindow* operator = (const MainWindow& obj);
        bool construct();

        bool initMenuBar();//菜单栏
        bool initToolBar();//工具栏
        bool initStatusBar();//状态栏
        bool initinitMainEditor();//编辑窗口

        bool initFileMenu(QMenuBar* mb);//文件菜单
        bool initEditMenu(QMenuBar* mb);//编辑菜单
        bool initFormatMenu(QMenuBar* mb);//格式菜单
        bool initViewMenu(QMenuBar* mb);//视图菜单
        bool initHelpMenu(QMenuBar* mb);//帮助菜单

        bool initFileToolItem(QToolBar* tb);//工具选项
        bool initEditToolItem(QToolBar* tb);
        bool initFormatToolItem(QToolBar* tb);
        bool initViewToolItem(QToolBar* tb);

        bool makeAction(QAction*& action,QMenu* menu, QString text, int key);//菜单项
        bool makeAction(QAction*& action,QToolBar* tb, QString tip, QString icon);

        QString showFileDialog(QFileDialog::AcceptMode mode, QString title);//文件对话框
        void showErrorMessage(QString message);//错误消息对话框
        int showQuesstionMessage(QString message);//问题消息对话框
        QString saveCurrentData(QString path = "");
        void preEditorChanged();

private slots:
        void onFileNew();
        void onFileOpen();
        void onFlieSave();
        void onFileSaveAs();
        void onTextChanged();
public:
     static MainWindow* NewInstance();
    ~MainWindow();
};

#endif // MAINWINDOW_H

MainWindow.h

#include "MainWindow.h"
#include <QDebug>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent), statusLabel(this)
{
    m_filePath = "";
    m_isTextChanged = false;
    setWindowTitle("NotePad-[New]");
}

bool MainWindow::construct()
{
    bool ret = true;
    ret = ret && initMenuBar();
    ret = ret && initToolBar();
    ret = ret && initStatusBar();
    ret = ret && initinitMainEditor();
    return ret;
}
MainWindow* MainWindow::NewInstance()
{
    MainWindow* ret = new MainWindow();

    if((ret==NULL) || (!ret->construct()))
    {
        delete ret;
        ret = NULL;
    }

    return ret;
}
bool MainWindow::initMenuBar()//菜单栏
{
    bool ret = true;

    QMenuBar* mb = menuBar();//一定要注意是menuBar(),这是普通成员函数,不是构造函数

    ret = ret && initFileMenu(mb);//传一个参数是为了在initFileMenu()函数将menu加入菜单栏
    ret = ret && initEditMenu(mb);
    ret = ret && initFormatMenu(mb);
    ret = ret && initViewMenu(mb);
    ret = ret && initHelpMenu(mb);

    return ret;

}

bool MainWindow::initToolBar()//工具栏
{
    bool ret = true;

    QToolBar* tb = addToolBar("Tool Bar");
    //tb->setMovable(false);
    //tb->setFloatable(false);
    tb->setIconSize(QSize(16,16));

    ret = ret && initFileToolItem(tb);
    tb->addSeparator();
    ret = ret && initEditToolItem(tb);
    tb->addSeparator();
    ret = ret && initFormatToolItem(tb);
    tb->addSeparator();
    ret = ret && initViewToolItem(tb);

    return ret;
}

bool MainWindow::initStatusBar()//状态栏
{
    bool ret = true;

    QStatusBar* sb = statusBar();

    QLabel* label = new QLabel("Made By LGC");

    if(label != NULL)
    {
        statusLabel.setMinimumWidth(200);
        statusLabel.setAlignment(Qt::AlignHCenter);
        statusLabel.setText("Ln:1    Col:1");

        label->setMinimumWidth(200);
        label->setAlignment(Qt::AlignHCenter);

        sb->addPermanentWidget(new QLabel());//单纯加入分隔符
        sb->addPermanentWidget(&statusLabel);
        sb->addPermanentWidget(label);
    }
    else
    {
        ret = false;
    }
    return ret;
}
bool MainWindow::initinitMainEditor()//编辑窗口
{
    bool ret = true;

    mainEdit.setParent(this);
    setCentralWidget(&mainEdit);

    connect(&mainEdit, SIGNAL(textChanged()), this, SLOT(onTextChanged()));

    return ret;
}

/************************************************文件菜单********************************************************/
bool MainWindow::initFileMenu(QMenuBar* mb)
{
    bool ret = true;

    QMenu* menu = new QMenu("File(&F)");//创建文件菜单,(&F)是为了可以Alt+F打开
    ret = (menu != NULL);
    if(ret)
    {
        QAction* action = NULL;

        //New
        ret = ret &&  makeAction(action, menu, "New(&N)",Qt::CTRL + Qt::Key_N);
        if(ret)
        {
           connect(action, SIGNAL(triggered()), this, SLOT(onFileNew()));
           menu->addAction(action);
        }

        menu->addSeparator();

        //Open
        ret = ret &&  makeAction(action,  menu,"Open(&O)...",Qt::CTRL + Qt::Key_O);
        if(ret)
        {
           connect(action, SIGNAL(triggered()), this, SLOT(onFileOpen()));
           menu->addAction(action);
        }

        menu->addSeparator();

        //Save
        ret = ret &&  makeAction(action,  menu,"Save(&S)",Qt::CTRL + Qt::Key_S);
        if(ret)
        {
            connect(action, SIGNAL(triggered()), this ,SLOT(onFlieSave()));
            menu->addAction(action);
        }

        menu->addSeparator();

        //Save As
        ret = ret &&  makeAction(action, menu, "Save As(&A)...",0);
        if(ret)
        {
           connect(action, SIGNAL(triggered()), this, SLOT(onFileSaveAs()));
           menu->addAction(action);

        }

        menu->addSeparator();

        //print
        ret = ret &&  makeAction(action, menu, "Print(&P)...",Qt::CTRL + Qt::Key_P);
        if(ret)
        {
           menu->addAction(action);
        }

        menu->addSeparator();

        //Exit
        ret = ret &&  makeAction(action,  menu,"Exit(&X)",0);
        if(ret)
        {
           menu->addAction(action);//将菜单项加入到菜单
        }

    }
    if(ret)
    {
        mb->addMenu(menu);//将菜单加入到菜单栏
    }
    else
    {
        delete mb;
    }
    return ret;
}

/************************************************编辑菜单********************************************************/
bool MainWindow::initEditMenu(QMenuBar* mb)
{
    bool ret = true;

    QMenu* menu = new QMenu("Edit(&E)");
    ret = (menu != NULL);
    if(ret)
    {
        QAction* action = NULL;

        //Undo
        ret = ret &&  makeAction(action,  menu,"Undo(&U)",Qt::CTRL + Qt::Key_Z);
        if(ret)
        {
           menu->addAction(action);
        }

        menu->addSeparator();

        //Redo
        ret = ret &&  makeAction(action,  menu,"Redo(&R)...",Qt::CTRL + Qt::Key_Y);
        if(ret)
        {
           menu->addAction(action);
        }

        menu->addSeparator();

        //Cut
        ret = ret &&  makeAction(action,  menu,"Cut(&T)",Qt::CTRL + Qt::Key_X);
        if(ret)
        {
           menu->addAction(action);
        }

        menu->addSeparator();

        //Copy
        ret = ret &&  makeAction(action,  menu,"Copy(&C)...",Qt::CTRL + Qt::Key_C);
        if(ret)
        {
           menu->addAction(action);
        }

        menu->addSeparator();

        //Pase
        ret = ret &&  makeAction(action,  menu,"Pase(&P)...",Qt::CTRL + Qt::Key_V);
        if(ret)
        {
           menu->addAction(action);
        }

        menu->addSeparator();

        //Delete
        ret = ret &&  makeAction(action, menu, "Delete(&L)",Qt::Key_Delete);
        if(ret)
        {
           menu->addAction(action);
        }

        menu->addSeparator();

        //Find
        ret = ret &&  makeAction(action,  menu,"Find(&F)...",Qt::CTRL + Qt::Key_F);
        if(ret)
        {
           menu->addAction(action);
        }

        menu->addSeparator();

        //Replace
        ret = ret &&  makeAction(action,  menu,"Replace(&R)...",Qt::CTRL + Qt::Key_H);
        if(ret)
        {
           menu->addAction(action);
        }

        menu->addSeparator();

        //Goto
        ret = ret &&  makeAction(action,  menu,"Goto(&G)",Qt::CTRL + Qt::Key_G);
        if(ret)
        {
           menu->addAction(action);
        }

        menu->addSeparator();

        //Select All
        ret = ret &&  makeAction(action, menu, "Select All(&A)",Qt::CTRL + Qt::Key_A);
        if(ret)
        {
           menu->addAction(action);
        }

    }
    if(ret)
    {
        mb->addMenu(menu);
    }
    else
    {
        delete mb;
    }
    return ret;
}

/************************************************格式菜单********************************************************/
bool MainWindow::initFormatMenu(QMenuBar* mb)
{
    bool ret = true;

    QMenu* menu = new QMenu("Format(&O)");
    ret = (menu != NULL);
    if(ret)
    {
        QAction* action = NULL;

        //Auto Wrap
        ret = ret &&  makeAction(action,  menu,"Auto Wrap(&W)",0);
        if(ret)
        {
           menu->addAction(action);
        }

        menu->addSeparator();

        //Font
        ret = ret &&  makeAction(action,  menu,"Font(&F)...",0);
        if(ret)
        {
           menu->addAction(action);
        }

    }
    if(ret)
    {
        mb->addMenu(menu);
    }
    else
    {
        delete mb;
    }
    return ret;
}

/************************************************视图菜单********************************************************/
bool MainWindow::initViewMenu(QMenuBar* mb)
{
    bool ret = true;

    QMenu* menu = new QMenu("View(&V)");
    ret = (menu != NULL);
    if(ret)
    {
        QAction* action = NULL;

        //Tool Bar
        ret = ret &&  makeAction(action, menu,"Tool Bar(&T)",0);
        if(ret)
        {
           menu->addAction(action);
        }

        menu->addSeparator();

        //Status Bar
        ret = ret &&  makeAction(action, menu,"Status Bar(&S)",0);
        if(ret)
        {
           menu->addAction(action);
        }

    }
    if(ret)
    {
        mb->addMenu(menu);
    }
    else
    {
        delete mb;
    }
    return ret;
}

/************************************************帮助菜单********************************************************/
bool MainWindow::initHelpMenu(QMenuBar* mb)
{
    bool ret = true;

    QMenu* menu = new QMenu("Help(&H)");
    ret = (menu != NULL);
    if(ret)
    {
        QAction* action = NULL;

        //User Manual
        ret = ret &&  makeAction(action,  menu,"User Manual",0);
        if(ret)
        {
           menu->addAction(action);
        }

        menu->addSeparator();

        //About NotePad
        ret = ret &&  makeAction(action,  menu,"About NotePad...",0);
        if(ret)
        {
           menu->addAction(action);
        }

    }
    if(ret)
    {
        mb->addMenu(menu);
    }
    else
    {
        delete mb;
    }
    return ret;
}
/*****************************************工具************************************************************/
bool MainWindow::initFileToolItem(QToolBar* tb)
{
    bool ret = true;
    QAction* action = NULL;

    ret = ret && makeAction(action, tb, "New", ":/Res/pic/new.png");
    if(ret)
    {
        connect(action, SIGNAL(triggered()), this, SLOT(onFileNew()));
        tb->addAction(action);

    }

    ret = ret && makeAction(action,  tb,"Open", ":/Res/pic/open.png");
    if(ret)
    {
        connect(action, SIGNAL(triggered()), this, SLOT(onFileOpen()));
        tb->addAction(action);
    }

    ret = ret && makeAction(action,  tb,"Save", ":/Res/pic/save.png");
    if(ret)
    {
        connect(action, SIGNAL(triggered()), this ,SLOT(onFlieSave()));
        tb->addAction(action);
    }

    ret = ret && makeAction(action,  tb,"Save As", ":/Res/pic/saveas.png");
    if(ret)
    {
        connect(action, SIGNAL(triggered()), this, SLOT(onFileSaveAs()));
        tb->addAction(action);
    }
    ret = ret && makeAction(action, tb,"Print",  ":/Res/pic/print.png");
    if(ret)
    {
        tb->addAction(action);
    }
    return ret;

}
bool MainWindow::initEditToolItem(QToolBar* tb)
{
    bool ret = true;
    QAction* action = NULL;

    ret = ret && makeAction(action, tb,"Undo",  ":/Res/pic/undo.png");
    if(ret)
    {
        tb->addAction(action);
    }
    ret = ret && makeAction(action,  tb,"Redo", ":/Res/pic/redo.png");
    if(ret)
    {
        tb->addAction(action);
    }

    ret = ret && makeAction(action, tb, "Cut",  ":/Res/pic/cut.png");
    if(ret)
    {
        tb->addAction(action);
    }

    ret = ret && makeAction(action,  tb,"Copy", ":/Res/pic/copy.png");
    if(ret)
    {
        tb->addAction(action);
    }

    ret = ret && makeAction(action, tb,"Paste",  ":/Res/pic/paste.png");
    if(ret)
    {
        tb->addAction(action);
    }

    ret = ret && makeAction(action, tb,"Find",  ":/Res/pic/find.png");
    if(ret)
    {
        tb->addAction(action);
    }
    ret = ret && makeAction(action, tb,"Replace",  ":/Res/pic/replace.png");
    if(ret)
    {
        tb->addAction(action);
    }
    ret = ret && makeAction(action, tb,"Goto",  ":/Res/pic/goto.png");
    if(ret)
    {
        tb->addAction(action);
    }

    return ret;
}
bool MainWindow::initFormatToolItem(QToolBar* tb)
{
    bool ret = true;
    QAction* action = NULL;

    ret = ret && makeAction(action, tb, "Auto Wrap", ":/Res/pic/wrap.png");
    if(ret)
    {
        tb->addAction(action);
    }
    ret = ret && makeAction(action, tb,"Font",  ":/Res/pic/font.png");
    if(ret)
    {
        tb->addAction(action);
    }

    return ret;
}
bool MainWindow::initViewToolItem(QToolBar* tb)
{
    bool ret = true;
    QAction* action = NULL;

    ret = ret && makeAction(action,  tb,"Tool Bar", ":/Res/pic/tool.png");
    if(ret)
    {
        tb->addAction(action);
    }
    ret = ret && makeAction(action,  tb,"Status Bar", ":/Res/pic/status.png");
    if(ret)
    {
        tb->addAction(action);
    }

    return ret;
}

bool MainWindow::makeAction(QAction*& action,QMenu* menu, QString text, int key)//菜单项
{
    bool ret = true;
    action = new QAction(text, menu);
    if(action != NULL)
    {
        action->setShortcut(QKeySequence(key));//创建快捷键
    }
    else
    {
        ret = false;
    }

    return ret;
}
bool MainWindow::makeAction(QAction*& action,QToolBar* tb, QString tip, QString icon)
{
    bool ret = true;
    action = new QAction("", tb);
    if(action != NULL)
    {
        action->setToolTip(tip);
        action->setIcon(QIcon(icon));
    }
    else
    {
        ret = false;
    }
    return ret;
}
MainWindow::~MainWindow()
{

}

MainWindowUI.cpp

#include <QFileDialog>
#include <QStringList>
#include <QFile>
#include <QDebug>
#include <QMessageBox>
#include "MainWindow.h"

QString MainWindow::showFileDialog(QFileDialog::AcceptMode mode, QString title)
{
    QString ret = "";
    QFileDialog fd;

    fd.setWindowTitle(title);
    fd.setAcceptMode(mode);
    QStringList filters;
    filters.append("Text(*.txt)");
    filters.append("All Files(*.*)");
    fd.setNameFilters(filters);

    if(mode==QFileDialog::AcceptOpen)
    {
        fd.setFileMode(QFileDialog::ExistingFile);
    }

    if(fd.exec()==QFileDialog::Accepted)
    {
        ret = fd.selectedFiles()[0];
    }

    return ret;
}

void MainWindow::showErrorMessage(QString message)
{
    QMessageBox mb(this);

    mb.setWindowTitle("Quession");
    mb.setText(message);
    mb.setIcon(QMessageBox::Critical);
    mb.setStandardButtons(QMessageBox::Ok);

    mb.exec();
}

int MainWindow::showQuesstionMessage(QString message)
{
    QMessageBox mb(this);

    mb.setWindowTitle("Error");
    mb.setText(message);
    mb.setIcon(QMessageBox::Question);
    mb.setStandardButtons(QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel);

    return  mb.exec();
}

QString MainWindow::saveCurrentData(QString path)
{
    QString ret = path;
    if(ret == "")
    {
        ret = showFileDialog(QFileDialog::AcceptSave, "Save");

    }

    if(ret != "")
    {
        QFile file(ret);
        if(file.open(QIODevice::WriteOnly | QIODevice::Text))
        {
            QTextStream out(&file);

            out << QString(mainEdit.toPlainText());

            file.close();

            setWindowTitle("NotePad - [" + ret + "]");

            m_isTextChanged = false;//保存后修改状态值
        }
        else
        {
            showErrorMessage(QString("Open file Error!\n\n") + "\"" + m_filePath + "\"");
            ret = "";
        }
    }

    return ret;

}
void MainWindow::preEditorChanged()
{
    if(m_isTextChanged)
    {
        int r = showQuesstionMessage("Do you want to Save?");
        switch (r)
        {
        case QMessageBox::Yes:
            saveCurrentData(m_filePath);
            break;
        case QMessageBox::No:
            m_isTextChanged = false;
            break;
        case QMessageBox::Cancel:
            break;

        }

    }
}
void MainWindow::onFileNew()
{
    preEditorChanged();
    if(!m_isTextChanged)
    {
        mainEdit.clear();

        m_filePath = "";

        m_isTextChanged = false;

        setWindowTitle("NotePad-[New]");
    }
}
void MainWindow::onFileOpen()
{

    preEditorChanged();

    if(!m_isTextChanged)
    {
        QString path = showFileDialog(QFileDialog::AcceptOpen, "open");

        if(path != "")
        {
            QFile file(path);
            if(file.open(QIODevice::ReadOnly | QIODevice::Text))
            {
                mainEdit.setPlainText(QString(file.readAll()));

                file.close();

                m_filePath = path;//报存当前文件路径

                setWindowTitle("NotePad - [" + m_filePath + "]");
            }
            else
            {
                showErrorMessage(QString("Open file Error!\n\n") + "\"" + m_filePath + "\"");
            }
        }
    }

}

void MainWindow::onFlieSave()
{
    QString path = saveCurrentData(m_filePath);

    if(path != "")
    {
        m_filePath = path;
    }
}

void MainWindow::onFileSaveAs()
{
    QString path = saveCurrentData();//使用默认参数

    if(path != "")
    {
        m_filePath = path;
    }

}
void MainWindow::onTextChanged()
{
    if(!m_isTextChanged)
    {
        setWindowTitle("*" + windowTitle());
    }
    m_isTextChanged = true;

}

MainWindowSlots.cpp

#include <QtGui/QApplication>
#include "MainWindow.h"
#include <QTextCodec>

int main(int argc, char *argv[])
{
    QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK")); //路径名支持中文
    QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK")); //QString支持中文
    QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GBK")); //string支持中文
    QApplication a(argc, argv);
    MainWindow* w = MainWindow::NewInstance();
    int ret = -1;
    if(w != NULL)
    {
        w->show();
        ret = a.exec();
    }

    delete w;
    return ret;
}

main.cpp

三、小结

(1、)文本编辑组件能够触发与编辑操作相关的信号

(2)、textChanged()能够用于检测数据变化

(3)、文本编辑器项目中需要设置状态变量

(4)、功能件的交互通过状态变量完成

时间: 2024-10-25 15:05:00

第三十六课、文本编辑器中的功能交互的相关文章

NeHe OpenGL教程 第三十六课:从渲染到纹理

转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线教程的编写,以及yarn的翻译整理表示感谢. NeHe OpenGL第三十六课:从渲染到纹理 放射模糊和渲染到纹理: 如何实现放射状的滤镜效果呢,看上去很难,其实很简单.把渲染得图像作为纹理提取出来,在利用OpenGL本身自带的纹理过滤,就能实现这种效果,不信,你试试. 嗨,我是Dario Corn

2018-08-24 第三十六课

第三十六课 非关系统型数据库-mangodb 目录 二十四 mongodb介绍 二十五 mongodb安装 二十六 连接mongodb 二十七 mongodb用户管理 二十八 mongodb创建集合.数据管理 二十九 php的mongodb扩展 三十 php的mongo扩展 三十一 mongodb副本集介绍 三十二 mongodb副本集搭建 三十三 mongodb副本集测试 三十四 mongodb分片介绍 三十五 mongodb分片搭建 三十六 mongodb分片测试 三十七 mongodb备份

Egret入门学习日记 --- 第三十六篇(书中 10.7 ~ 10.8 节 内容)

第三十六篇(书中 10.7 ~ 10.8 节 内容) 开始 书中 10.7 节内容. 书中 10.7 节内容结束. 书中重点: 1.导出素材. 2.配置粒子库. 3.播放动画. 开始操作: 1.导出素材. 我设置好了雪花的效果. 接着是导出. 这是导出后的资源文件. 导入Egret的预加载资源组中. 2.配置粒子库. 下载好官方的粒子库. https://github.com/egret-labs/egret-game-library 拷贝粒子库到项目外,记住 项目文件夹外! 配置好 egret

第三十八课、Qt中的事件处理(上)

一.图形界面应用程序的消息处理模型 二.Qt的事件处理 1.Qt平台将系统产生的消息转换为Qt事件(每一个系统消息对象Qt平台的一个事件) (1).Qt事件是一个QEvent的对象 (2).Qt事件用于描述程序内部或者外部发生的动作 (3).任意的QObject对象都具备事件处理的能力 2.GUI应用程序的事件处理方式 (1).Qt事件产生后立即被分发到QWidget对象 (2).QWidget中的event(QEvent*)进行事件处理 (3).event()根据事件类型调用不同的事件处理函数

第35课 文本编辑器中的数据存取

1. QAction的信号 (1)QAction被点击后,会产生一个triggered信号 (2)通过信号与槽机制能够捕捉对QAction对象的操作 (3)项目中可以将多个信号映射到同一个槽函数 connect(action, SIGNAL(triggered()), this, SLOT(slot_function())); 2. 文件打开操作 3. 文件“保存”和“另存为”操作                     [编程实验]文本编辑器的数据存取 4. 小结 (1)Qt项目中尽量将界面代

第三十二课、Qt中的文件操作

一.Qt中的IO操作 1.Qt中IO操作的处理方式 (1).Qt通过统一的接口简化了文件与外部设备的操作方式 (2).Qt中的文件被看做是一种特殊的外部设备 (3).Qt中的文件操作与外部设备操作相同 2.IO操作中的关键函数接口 注意:IO操作的本质:连续存储空间的数据读写 3.Qt中IO设备类型 (1).顺序存储设备:只能从头开始顺序读写数据,不能指定数据的读写位置(串口) (2).随机存储设备:可以定位到任意位置进行数据读写(seek function函数)(文件) 4.Qt中IO设备 的

第四十六课、继承中的构造与析构

一.子类对象的构造方法 1.子类中可以定义构造函数 2.子类构造函数:必须对继承来的成员进行初始化 (1).直接通过初始化列表或者赋值方式进行初始化(但可能继承来的是private成员) (2).调用父类构造函数进行初始化 A.默认调用:适用于无参构造函数和使用默认参数的构造函数 B.显示调用:通过初始化列表进行调用(适用于所有父类的构造函数) #include<iostream> #include<string> using namespace std; class Parent

第三十六课:Ajax详解2

本课主要教大家如何书写一个完整的ajax模块,讲解的代码主要跟ajax有关,而jQuery的ajax模块添加了Deferred异步编程的机制,因此对ajax的理解难度增大,还是忽略掉.但是我要讲解的代码跟jQuery的ajax模块思路是一样的,只是没有加入Deferred异步编程的思想,这样更有利于大家理解ajax的原理. $.ajax = function(opts){    //大家如果用过jQuery的ajax,应该记得$.ajax({url:...,data:....,type:'POS

第三十六课 Spark之TaskScheduler Spark shell案例运行日志详解、TaskScheduler和SchedulerBackend、FIFO与FAIR、Task运行时本地性算法详

</pre></h2><div><p>本节课内容:</p><p>1.     TaskSchedulerBackend与SchedulerBackend</p><p>2.     FIFO与FAIR两种调度模式</p><p>3.     Task数据本地性资源的分配</p></div><h3>一.Scheduler运行过程(Spark-shell角度)