Qt操作Office的一个实例--口算题生成器制作。

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;
}

效果:

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值