Qt操作Office的一个实例–口算题生成器制作。
学校里经常会要求口算达标。如果手写口算题效率太慢,何不用Qt做一个口算生成器呢?
虽然Qt自带文本编辑功能,不过这次还是想尝试操作COM对象来实现。
于是从网上下载一个文档QWord.cpp 来了解Qt操作COM对象的方法。
粗略分析了QWord.cpp 的文档,基本了解如下:
1、关联QAxObject
要操作office需要 include <ActiveQt/QAxObject>,同时QT += axcontainer
什么是QAxObject ?
QAxObject 类提供了封装COM对象的一些操作。
QAxObject可以被实例化一个空的对象,或者指向COM组件的一个指针。如果这个COM对象提供了IDispatch接口。那么该COM对象的属性、方法和事件可以通过Qt的属性、槽、信号来实现。
例如:初始化一个COM对象:
QAxObject* m_word;
m_word = new QAxObject(parent);
2、操作Word文档:
这里引用一段代码文档
void QWord::setPageOrientation(int flag) //设置页面1 横向 还是0竖向
{
QAxObject* selection = m_word->querySubObject("Selection"); //返回当前选定COM对象的指针、
if(NULL== selection)
{
return;
}
QString page;
switch (flag)
{
case 0:
page = "wdOrientPortrait";
break;
case 1:
page = "wdOrientLandscape";
break;
}
selection->querySubObject("PageSetUp")->setProperty("Orientation",page);//设置Page的横向或者竖向的属性。
}
从上段代码中可以发现:用Qt可以很方便的操作word文档的属性。
3、设计界面
在了解了word 操作之后,我们接着来实现口算生成器的界面
这里我们设置加减乘除四项运算。设置两个运算数的最大值和最小值。设置得数的上限,设置试题的份数。
4、关键代码
#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 = 1; //生成的份数
_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(12);
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(20,4);
for(int row = 1;row<=20;row++)
{
//
for(int colum = 1;colum<=4;colum++)
{
word.setColumnHeight(colum,25);
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.setRowHeight(p,row,35);
}
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 = (_minusEn==true)?false:true;
if(!loopflag)
{
operator_str = " - ";
}
break;
case 3:
loopflag = (_mulitEn==true)?false:true;
if(!loopflag)
{
operator_str = " × ";
}
break;
case 4:
loopflag = (_divideEn==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;
}