幼儿教育一直受到重视,一年级开始,一般学校都会要求口算达标,为了更好的促进孩子学习,是否可以制作这样一款word 口算练习题生成器呢?不妨用Qt来试试看吧!
先看下界面:
代码实现:
1、。pro 文件中添加:
CONFIG += qaxcontainer
2、将word操作的函数单独写类
请看:qword.h文件
#ifndef QWORD_H
#define QWORD_H
#define _WIN32_DCOM
#include
#include"qmainwindow.h"
#include
#include
#include
#include
#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
#include
#include
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