QT GUI界面中集成VISIO绘图区详细说明
1.背景
項(xiàng)目需要在界面中集成VISIO的工作區(qū),就開始研究這個(gè)問題,本以為是一個(gè)非常簡(jiǎn)單的問題,找到工作區(qū)窗口,調(diào)用SetParent接口就好了。但是實(shí)際操作中發(fā)現(xiàn)這個(gè)思路是行不通的。
這種方法,在WIN7操作系統(tǒng)中,32為VISIO可以集成,正常操作也沒有問題。但是在其他配置的情況下就不行了,比如WIN10。
用QT的QWidget的接口函數(shù)也是同樣的情況。
昨天,偶然間在微軟官網(wǎng)發(fā)現(xiàn)VISIO的工作區(qū)實(shí)際是一個(gè)ActiveX控件,那就簡(jiǎn)單了。需要Qt中的axcontainer模塊就能搞定。
2.過程
首先用Creator新建一個(gè)GUI的工程。
修改pro文件,添加
QT += axcontainer,引入這個(gè)模塊。
在UI文件中添加一個(gè)QAxWidget控件。
在控件中右鍵點(diǎn)擊,選擇【設(shè)置控件】會(huì)出現(xiàn)如下界面
在這個(gè)界面中能找到 VISIO繪圖控件。
再在這個(gè)控件中添加槽函數(shù),右鍵單擊控件,選擇【轉(zhuǎn)到槽】。就出現(xiàn)下面的界面。Creator會(huì)自動(dòng)生成槽函數(shù)的。
?3、控件的接口函數(shù)調(diào)用方法。
這個(gè)是我想說的最重要的部分,照我的理解大致是有三種方法。
第一種方法,也是QT幫助文件中的方法。
QAxWidget::dynamicCall("SetSrc (QString Src)",params)//接口函數(shù)調(diào)用 QAxWidget::setProperty("Src",params)//設(shè)置屬性的值 QAxWidget::property("Src")//得到屬性的值這種方法對(duì)于一些不支持的數(shù)據(jù)類型是不支持的。也就是可能某一些方法會(huì)調(diào)用失敗。
第二種方法,也是QT幫助中的辦法,利用bumpcpp生成.h和.cpp文件。直接在工程中引用。但是我在試驗(yàn)的時(shí)候發(fā)現(xiàn),生成的類型是QAxObject,我理解應(yīng)該是QAxWidget所以這種辦法沒有試成功。
第三種辦法,應(yīng)該是最理想的辦法,但是過程稍微有點(diǎn)麻煩。
首先,用VS生成一個(gè)空的win32控制臺(tái)程序,然后添加一個(gè)cpp文件,在文件中加上如下代碼。
#import "C:\\visio\\Office14\\VISLIB.DLL"#import "C:\\visio\\Office14\\VISOCX.DLL"void main() {}然后直接編譯就可以了。
編譯完成后,在debug文件夾中會(huì)出現(xiàn)如下4個(gè)文件
這4個(gè)文件中tlh實(shí)際是頭文件,tli應(yīng)該就是cpp文件。
把這4個(gè)文件加入到我們的工程中,我們就可以使用全部的接口了。
ui->axWidget->setControl("{E4615FA3-23B0-4976-BD3E-D611DDBE330E}");VisOcx::IDrawingControl* drawing;QUuid id = QUuid::fromString(QLatin1String("{9BF6FD73-F05B-406E-B938-09E2B413528E}"));ui->axWidget->queryInterface(id,(void**)&drawing);//得到控件提供的接口_bstr_t host = drawing->GetHostID();drawing->put_Src(_bstr_t("d:\\draw.vsd"));Visio::IVWindowPtr window = drawing->Window;COLORREF color = RGB(255, 0, 0);window->PutBackgroundColor((OLE_COLOR)color);window->PutViewFit(2);上面是我做的測(cè)試的代碼。
connect(ui->axWidget, SIGNAL(DocumentChanged(Visio::IVDocument *)), this, SLOT(onDocumentChanged(Visio::IVDocument *)));QObject::connect(ui->axWidget, SIGNAL(MouseMove(int, int, double, double, bool &)), this, SLOT(onMouseMove(int, int, double, double, bool &)));connect(ui->axWidget, SIGNAL(ShapeAdded(struct Visio::IVShape *)), this, SLOT(onShapeAdded(struct Visio::IVShape *)));這是連接槽函數(shù)的代碼。
第一次調(diào)用ActiveX,第一次做QTGUI程序,成就感滿滿,希望對(duì)后來的諸位能有幫助,也希望我將來還能用到。
總結(jié)
以上是生活随笔為你收集整理的QT GUI界面中集成VISIO绘图区详细说明的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用Firefox或Chrome的雇员表
- 下一篇: [Leedcode][JAVA][第47