Qt 操作words实例 --- 幼儿快算题生成器

Qt 操作words实例 — 幼儿快算题生成器

幼儿教育一直受到重视,一年级开始,一般学校都会要求口算达标,为了更好的促进孩子学习,是否可以制作这样一款word 口算练习题生成器呢?不妨用Qt来试试看吧!

先看下界面:
在这里插入图片描述
代码实现:
1、。pro 文件中添加:
CONFIG += qaxcontainer

2、将word操作的函数单独写类
请看:qword.h文件

#ifndef QWORD_H
#define QWORD_H

#define _WIN32_DCOM

#include <QMainWindow>
#include"qmainwindow.h"
#include <QString>
#include <QVariant>
#include <ActiveQt/QAxObject>
#include <ActiveQt/QAxWidget>
#include "objbase.h"
//#include "GlobalAppData.h"

class QWord : public QObject
{
	Q_OBJECT

public:
	QWord(QObject *parent = 0);
	~QWord();

public:
	QAxObject* getDocuments(){return m_documents;}
	QAxObject* getDocument(){return m_document;}
	QAxObject* getWordApp(){return m_word;}	
public:
	/**************************************************************************/
	/* 文件   操作                                                            */
	/**************************************************************************/
	void save();				//保存操作内容	
	void close();				//关闭 退出 析构时候也会自动调用一次
	void saveAs();				//新建word另存为
	bool createWord(QString reportname );		//创建一个新的word文档
	void openWord();			//打开一个现有的word文档
	bool createNewWord(const QString& filePath );		//创建一个新的word文档

	void setTableAutoFitBehavior(int flag);//表格自动拉伸列: 0 固定  1根据内容调整  2 根据窗口调整
	void setPageOrientation(int flag);	//设置页面0为纵向wdOrientPortrait  1为横向wdOrientLandscape 
	void setWordPageView(int flag);	//设置页面视图,是web视图wdWebView 6还是页面视图wdPrintView 3 或者阅读视图wdReadingView 7
	void setFontSize(int fontsize);						//设置字体大小
	void setFontName(QString& fontName);				//设置字体	比如 “宋体”
	void setFontBold(bool flag);						//字体加粗
	void setParagraphAlignment(int flag);				//设置选中位置文字居左 0 ,居中 1 ,居右 2
	void setRowAlignment(int tableIndex,int row,int flag);
	//同时设置列宽和列高可以固定图片的大小
	void setColumnWidth(int column, int width);			//设置列宽
	void setColumnHeight(int column, int height);		//设置列高
	void setRowHeight(int nTable,int Row, int height);
	void setCellString(int row, int column, const QString& text);
	void setCellFontBold(int row, int column, bool isBold);			//设置内容粗体  isBold控制是否粗体
	void setCellFontSize(int row, int column, int size);			//设置文字大小
	void setOptionCheckSpell(bool flags);		//设置审阅的拼写检查  true开启检查  false 取消检查 

	QString GetText();												//获取内容
	void getUsedRange(int *topLeftRow, int *topLeftColumn, int *bottomRightRow, int *bottomRightColumn);
	void setSelectionRange(int start,int end);	//"SetRange(1, 9)"第1个字符后开始,到第9个字符结束范围
	QVariant getCellValue(int row, int column);						//获取单元格内容 
	int getTableCount();											//获取word中表格总数	


	QString getStrErrorInfo(){return m_strError;}					//获取代码中出现的错误信息可以用QMessageBox::information打印 在cpp不用QMessageBox 是怕你们在线程中调导出报表  
	void deleteSelectColumn(int column);							//删除指定的列
	void moveForEnd();												//移动选定对象到文档末尾
	void insertCellPic(int row,int column,const QString& picPath);	//单元格插入图片
	void intsertTable(int row,int column);							//插入一个几行几列表格
	void insertMoveDown();											//插入回车
	void insertText(const QString& text);							//插入文字
	void insertTable(int tableIndex,int row,int column);
	void MergeCells(int tableIndex, int nStartRow,int nStartCol,int nEndRow,int nEndCol);//合并单元格	
	bool open(const QString& strFilePath,bool bVisable);
	bool openword(bool bVisable);
	bool isOpen();


	void setColumnWidth(int nTable,int column,int width);
   // void setRowHeight(int nTable,int row,int height);
	void setCellString(int nTable,int row,int column,const QString& text);
	void insertCellPic(int nTable,int row,int column,const QString& picPath);
	void setCellFontBold(int nTable,int row,int column,bool isBold);
	void setCellFontSize(int nTable,int row,int column,int size);
	//void addTableRow(int nTable ,int nRow,int rowCount);
	void addTableRow(int tableIndex ,int nRow,int rowCount);
	void setColumnHeight(int nTable,int column, int height);
	void intsertTable(int tableIndex, int row,int column);

public:
	void setVisible(bool isVisible);

private:
	QAxObject* m_word;
	QAxObject* m_documents;	
	QAxObject* m_document;	
	QString  m_fileName;
	QString  m_saveName;
	QString  m_strError;
	QString  m_strFilePath;
	bool m_bOpened;

};

#endif // QWORD_H

关于这部分程序的撰写,这里先不做过多的解释,在《Qt5 开发与实例 第四版中有介绍》,网上也有一些介绍。
这里有一篇博客写得不错,
http://www.360doc.com/content/14/0227/16/7918060_356177077.shtml

接着我们来看关键代码部分

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include "Word/qword.h"
#include <QDateTime>
#include<QDir>
#include<qrandom.h>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    minValue = 1;   //最小值
    maxValue = 10;   //最大值
    maxResult = 100;  //结果上限
    pages = 10;      //生成的份数


    _addEn  = true;
    _minusEn = true;
    _mulitEn = true;
    _divideEn = true;

}

MainWindow::~MainWindow()
{
    delete ui;
}

//生成快题
void MainWindow::on_pushButton_produce_clicked()
{

    QString current_Date_Time = QDateTime::currentDateTime().toString("yyyyMMddhhmmss");
    QString fileName = tr("幼儿快速口算训练习题")+"_" + "_" + current_Date_Time;
    fileName.replace("-", "");
    fileName.replace(":", "");
    fileName.replace(" ", "");
    QString filePath = "";
    QDate Cur_Date= QDate::currentDate();
    QString strCurDate = Cur_Date.toString("yyyy-MM-dd");
    filePath = "E:/demo/QWordDemo/ReportWord/"+strCurDate+"/";

    QDir dirReportPath(filePath);
    if (!dirReportPath.exists())
    {
        if (dirReportPath.mkpath(filePath))
        {
            filePath += fileName + tr(".doc");
        }
    }
    else
    {
        filePath += fileName + tr(".doc");
    }

    QWord word;
    if( !word.createNewWord(filePath) )
    {
        QString error = tr("Failed to export exercise,") + word.getStrErrorInfo();
        return;
    }


    word.setPageOrientation(0);			//页面方向
    word.setWordPageView(3);			//页面视图

    for(int p = 1;p<= pages;p++)
    {

        word.setParagraphAlignment(0);		//下面文字位置
        word.setFontSize(30);				//字体大小
        word.setFontBold(true);				//字体加粗
        word.insertText(tr("幼儿快速口算训练习题( ")+QString::number(p)+ " )");
        word.setFontBold(false);
        word.insertMoveDown();
        word.setFontSize(10);
        word.setParagraphAlignment(2);
       // QString current_Time = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");
        word.insertText(tr("日期________________ 时间________________ 分数________________"));

        word.insertMoveDown();
        word.insertMoveDown();


        QString str = "";
        word.intsertTable(36,5);

        for(int row = 1;row<=36;row++)
        {

            for(int colum = 1;colum<=5;colum++)
            {
                str.clear();
                QTime time;
                time= QTime::currentTime();
                qsrand(time.msec()+time.second()*1000);
                qrand();
                qrand();
                nums0=qrand()%(maxValue - minValue) + minValue;
                nums1=qrand()%(maxValue - minValue) + minValue;

                while(DoOperation())

                str.clear();

                str = QString::number(nums0)  + operator_str + QString::number(nums1) + " =";

                word.setCellString(p,row,colum,str);
            }
            word.setRowAlignment(p,row,3);
        }

        word.setTableAutoFitBehavior(0);

        word.moveForEnd();
  }

    word.setVisible(true);
    word.saveAs();
}

bool MainWindow:: DoOperation()
{
    bool loopflag = true;
    QTime time;
    time= QTime::currentTime();
    qsrand(time.msec()+time.second()*1000);
    qrand();

    int var = qrand()%4 + 1;
    switch (var) {
    case 1:
        loopflag = (_addEn==true)?false:true;
        if(!loopflag)
        {
            operator_str = " + ";
        }
        break;
    case 2:
       loopflag = (_addEn==true)?false:true;
        if(!loopflag)
        {
            operator_str = " - ";
        }
        break;
    case 3:
        loopflag = (_addEn==true)?false:true;
        if(!loopflag)
        {
            operator_str = " × ";
        }
        break;
    case 4:
        loopflag = (_addEn==true)?false:true;
        if(!loopflag)
        {
            operator_str = " ÷ ";
        }

        break;
    default:
        loopflag = true;
        break;
    }
    return loopflag;
}

void MainWindow::on_checkBox_add_clicked(bool checked)
{
    if(checked)
    {
        _addEn = true;
    }
    else
    {
        _addEn = false;
    }
}

void MainWindow::on_checkBox_multi_clicked(bool checked)
{
    if(checked)
    {
        _mulitEn = true;
    }
    else
    {
        _mulitEn = false;
    }
}

void MainWindow::on_checkBox_minus_clicked(bool checked)
{
    if(checked)
    {
        _minusEn = true;
    }
    else
    {
        _minusEn = false;
    }
}

void MainWindow::on_checkBox_divide_clicked(bool checked)
{
    if(checked)
    {
        _divideEn = true;
    }
    else
    {
        _divideEn = false;
    }
}


void MainWindow::on_spinBox_minValue_valueChanged(int arg1)
{
    minValue = arg1;
}

void MainWindow::on_spinBox_maxValue_valueChanged(int arg1)
{
    maxValue = arg1;
}

void MainWindow::on_spinBox_maxResult_valueChanged(int arg1)
{
    maxResult = arg1;
}

void MainWindow::on_spinBox_pages_valueChanged(int arg1)
{
    pages = arg1;
}

效果:
在这里插入图片描述

总结:

Qt 操作word 还是非常方便的,关键在于理解操作的机制,这样才能灵活应用。

下载链接:
https://download.csdn.net/download/qq_21291397/12299262

原创文章 41 获赞 0 访问量 2034

猜你喜欢

转载自blog.csdn.net/qq_21291397/article/details/105290633
今日推荐