QT插入图片1

本文展示了如何使用Qt库结合ActiveX技术与Excel进行交互,包括创建工作簿、添加工作表、设置单元格值、粘贴图像、保存文件等操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自https://github.com/joonhwan/study/blob/master/qt/QtMoreActiveX/main.cpp


#include <QApplication>
#include <QAxObject>
#include <QClipboard>
#include <QImage>
#include <QSharedPointer>
#define USE_DUMPCPP_EXCEL
#ifdef USE_DUMPCPP_EXCEL
#include "excel.h"
#endif
#include <QDebug>
#include <ole2.h>
#include <QUuid>
#include "WDispatchDriver.h"

#if defined(_DEBUG) && defined(WIN32)
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
class MemLeakDetector
{
public:
	MemLeakDetector()
	{
		_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
	}
	~MemLeakDetector()
	{
	}
} detector;
#endif

typedef QSharedPointer<QAxObject> QAxObjectPtr;

void test1()
{
	QAxObject excel( "Excel.Application", 0);
	excel.setProperty("Visible", true);

	QAxObjectPtr workbooks(excel.querySubObject("Workbooks"));
	QAxObjectPtr workbook(workbooks->querySubObject("Add()"));
	QAxObjectPtr sheets(workbook->querySubObject("Worksheets"));
	sheets->dynamicCall("Add()");
	QAxObjectPtr sheet(sheets->querySubObject( "Item( int )", 1 ));
	// sheet->setProperty("Name","Nova Planilha");

	QAxObjectPtr range(sheet->querySubObject("Cells(int,int)",1,1));
	range->setProperty("Value", QVariant(1234));

	QImage image("c:/Users/jhlee/Dropbox/orgwiki/img/class01.png");
	QClipboard* clip = QApplication::clipboard();
	clip->setImage(image);
	QAxObjectPtr shapes(sheet->querySubObject("Shapes"));
	sheet->dynamicCall("Paste()");
	int shapeCount = shapes->property("Count").toInt();
	QAxObjectPtr shape(shapes->querySubObject(QString::fromLatin1("Item(%1)").arg(shapeCount).toAscii()));

	// shapes->dynamicCall("AddPicture( QString&, bool, bool, double, double, double, double","c:\\Users\\jhlee\\Dropbox\\orgwiki\\img\\class01.png",true,true,100,100,70,70);

	excel.setProperty("DisplayAlerts", false);
	workbook->dynamicCall("SaveAs(QString&)", "c:\\temp\\testexcel.xlsx");
	// //workbook->dynamicCall("Close()");
	// //excel.dynamicCall("Quit()");
	// workbook->dynamicCall("Close (Boolean)", true);
	excel.dynamicCall("Quit()");
}

void test2()
{
	QAxObject* excel = new QAxObject( "Excel.Application", 0);
	excel->setProperty("Visible", true);
	excel->dynamicCall("Quit()");
	delete excel;
}

void test3()
{
#ifdef USE_DUMPCPP_EXCEL
	Excel::Application excel;
	if (excel.isNull()) {
		return;
	}
	excel.SetVisible(true);

	Excel::Workbooks* workbooks = excel.Workbooks();
	Excel::Workbook* workbook = workbooks->Add();
	Excel::Sheets* sheets = workbook->Worksheets();
	Excel::_Worksheet sheet(sheets->Item(1));
	sheet.SetName("MyName");
	Excel::Range* range = sheet.Cells();
	range->SetItem(1,1,"Hello Seoyeon..");
	range->SetItem(2,1,"Hello Myungbakiee..");

	workbook->SaveAs("c:\\temp\\test.xls");
	workbook->Close();
	excel.Quit();
#endif
}

void test4()
{
	QAxObjectPtr xcom(new QAxObject("{717b131f-e3dd-4053-87a6-c4e2b2e983c2}"));
	if (xcom->isNull()) {
		return;
	}
	QAxObjectPtr com(new QAxObject("{4701EA53-53D6-4F06-86A2-B211A4F84000}"));
	if (com->isNull()) {
		return;
	}

	{
		int value = 0;
		QList<QVariant> vars;
		vars << 10;
		vars << 20;
		vars << 0;
		com->dynamicCall("Add(int,int,int&)", vars);
		value = vars[2].toInt();
		qDebug() << "answer = " << value;
	}

	{
		IDispatch* disp = 0;
		QUuid id("{00020400-0000-0000-C000-000000000046}");
		com->queryInterface(id, (void**)&disp);
		if (disp) {
			WDispatchDriver driver;
			driver.Attach(disp);
			disp->Release();

			short data[10];
			int len = 0;
			VARIANT* v = driver.InvokeMethod("GetSampleArrayData", 10, data, &len);
			Q_ASSERT(len==8);
		}
	}
}

int main(int argc, char** argv)
{
	QApplication excel(argc, argv);
	QCoreApplication::setOrganizationName("joonhwan");
	QCoreApplication::setOrganizationDomain("www.joonhwan.org");
	QCoreApplication::setApplicationName("QActiveXTester"); 

	// test1();
	// test2();
	// test3();
	test4();

	// return excel.exec();
	return 0;
}


### 如何在Qt中将图片插入到UI界面 在Qt中,可以通过多种方式将图片插入到UI界面。以下是几种常见的方法及其具体实现: #### 方法一:通过 `QTextEdit` 插入图片 如果目标是在 `QTextEdit` 中插入图片,则可以利用 HTML 的 `<img>` 标签来完成此操作。这种方式无需提前调整图片尺寸,因为可以在 HTML 层面指定宽高属性。 ```cpp QString imagePath = "path/to/image.png"; ui->textEdit->append(QString("<img src=\"%1\" width=\"200\" height=\"150\">").arg(imagePath)); ``` 这里的关键在于使用了 HTML 的 `<img>` 标签,并指定了宽度 (`width`) 和高度 (`height`) 参数[^1]。 --- #### 方法二:通过样式表 (Style Sheet) 设置背景图片 当需要为整个窗口或某个控件设置背景图片时,可以借助 Qt 的样式表功能。例如,以下代码展示了如何为一个 `QWidget` 添加背景图片: ```cpp this->setStyleSheet("background-image: url(path/to/background.jpg); background-repeat: no-repeat;"); ``` 需要注意的是,如果该图片是从 `.ui` 文件加载而来,可能还需要额外处理资源文件(`.qrc`)。这是因为某些情况下,资源未被正确编译可能导致图片无法正常显示[^2]。 --- #### 方法三:使用自定义控件绘制图片 对于更复杂的场景,比如动态生成的图像或者特定区域内的绘图需求,可以选择重写 `paintEvent()` 函数来自定义绘制逻辑。下面是一个简单的例子: ```cpp void CustomWidget::paintEvent(QPaintEvent *) { QPainter painter(this); QPixmap pixmap("path/to/image.png"); // 绘制图片至指定位置 painter.drawPixmap(10, 10, pixmap.scaled(200, 150, Qt::KeepAspectRatio)); } ``` 这种方法提供了更大的灵活性,适合于那些需要精细控制的情况[^4]。 --- #### 方法四:基于 Qt Quick 使用 Image 控件 如果是采用 QML 进行开发,则推荐直接使用内置的 `Image` 类型来进行图片展示。这不仅简单直观,而且能够很好地融入现代 UI 设计流程之中。 ```qml import QtQuick 2.15 import QtQuick.Controls 2.15 ApplicationWindow { visible: true width: 640 height: 480 Image { id: backgroundImage source: "path/to/image.png" fillMode: Image.PreserveAspectFit anchors.fill: parent } } ``` 此外,还可以结合不同的主题风格进一步优化视觉效果[^3]。 --- ### 总结 以上介绍了四种主要的方法用于在 Qt 应用程序中插入图片。每种方案都有其适用范围和特点,请根据实际项目需求选择合适的技术路线。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值