Qt之QAxObject用法

    QtConcurrent 是一个构建在QThreadPool之上的上层API,它用于处理最普通的并行计算模式:map, reduce, and filter。同时,QtConcurrent::run()方法提供了一种便于在另一个线程运行一个函数的方法。

    不像QThread 以及QRunnable,QtConcurrent 没有要求我们使用底层的同步原语,QtConcurrent 所有的方法会返回一个QFuture 对象,它包含了结果而且可以用来查询线程计算的状态(它的进度),从而暂停、继续、取消计算。QFutureWatcher 可以用来监听一个QFuture 进度,并且通过信号和槽与之交互(注意QFuture是一个基于数值的类,它并没有继承自QObject).

比如以下示例:

class MyWnd : public QWidget
{
	Q_OBJECT
private:
	static void execMyThr(void *pContext,string fileName,QString saveName);
	void execMy(string fileName,QString saveName);

public slots:
 
	void onClickedMy();
	void MyFinished(QString filePath);

private:
	bool bFinished;

signals:
	void finished(QString);
};
<span style="color:#363534;">#include <fstream>
#include <QFileInfo>

MyWnd::MyWnd(QWidget *parent)
	: QWidget(parent),bFinished(true)
{
	connect(this,SIGNAL(finished(QString)),this,SLOT(MyFinished(QString)));
}

void MyWnd::onClickedMy()
{
	if(!bFinished)
	{
		QMessageBox::warning(this,tr("提示"),tr("上一次执行还未完成, 请稍候..."));
		return;
	}

	string filehs;
	QFileInfo file(QString::fromStdString(filehs));
	if(file.exists())
	{       ///......
		QtConcurrent::run(execExportThr,this,filehs,fileName);
	}
}

void MyWnd::execMy(string filehs,QString saveName)
{   </span><span style="color:#ff0000;">///不能在这个函数中调用QtGUI界面</span><span style="color:#363534;">
	bFinished = false;

	ifstream fread;
	fread.open(filehs.c_str(), ios::in | ios::binary);
	if(fread.good())
	{
		ExcelEngine excel;
		if(excel.IsInstalledExcel())
		{
			while(fread.read((char*)&log, sizeof(LogInfo)))
			{
			}
			excel.Close();
		}
		fread.close();
	}
	emit finished(saveName);
}

void MyWnd::execMyThr( void *pContext,string fileName,QString saveName)
{
	MyWnd *pThis = (MyWnd*)pContext;
	pThis->execMy(fileName,saveName);
}

void MyWnd::MyFinished(QString saveName)
{
	QMessageBox::about(this,"成功",QString("执行完毕!"));
	bFinished = true;
}

</span>



### 使用 QT QAxObject 向 Excel 写入数据 为了通过 `QAxObject` 实现向 Excel 文件写入数据,可以按照如下方法构建应用程序: 创建一个新的 Qt 应用程序实例并设置其可见属性为不可见(即后台运行),这可以通过下面的代码片段完成[^1]。 ```cpp QAxObject* pApplication = new QAxObject("Excel.Application"); pApplication->dynamicCall("SetVisible(bool)", false); ``` 随后,添加工作簿对象到应用中,并获取当前活动的工作表作为目标区域来准备写入数据。此部分逻辑可通过以下 C++ 语句实现: ```cpp QAxObject *workbooks = pApplication->querySubObject("WorkBooks"); workbooks->dynamicCall("Add"); QAxObject *worksheet = pApplication->querySubObject("ActiveSheet"); ``` 对于具体的数据写入操作,则需定义要填充的内容以及指定放置这些内容的位置。这里展示了一个简单的例子,在 B1 到 C12 的范围内填充值列表中的项目[^2]: ```cpp // 准备待写入的数据 QList<QVariant> data; QList<QString> strList; strList << "sdfsd" << "asdfjoasdf"; data << strList; // 获取范围对象并将数据赋给它 QAxObject *rangeAx = worksheet->querySubObject("Range(const QString&)", "B1:C12"); rangeAx->setProperty("Value", QVariant(data)); ``` 最后一步是保存所做的更改至新的或现有的 Excel 文档内,并关闭文档和应用程序以释放资源[^3]: ```cpp QAxObject *saveAsMethod = workbook->querySubObject("SaveAs(const QString&)","C:\\path\\to\\yourfile.xlsx"); delete saveAsMethod; delete rangeAx; delete worksheet; delete workbooks; pApplication->dynamicCall("Quit()"); delete pApplication; ``` 上述流程展示了如何利用 `QAxObject` 类库执行基本的文件 I/O 操作——特别是针对 Microsoft Office Excel 表格的应用场景下的数据录入功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值