COM应用程序的例子展示了如何使用ActiveQt来开发一个可以通过COM自动化的Qt应用程序。不同的基于QObject的类被暴露为COM对象,与运行中的Qt应用程序的GUI进行通信。这些COM对象的API被设计成类似于标准COM应用程序的API,即那些来自Microsoft Office的API。
class Application : public QObject
{
Q_OBJECT
Q_CLASSINFO("ClassID", "{b50a71db-c4a7-4551-8d14-49983566afee}")
Q_CLASSINFO("InterfaceID", "{4a427759-16ef-4ed8-be79-59ffe5789042}")
Q_CLASSINFO("RegisterObject", "yes")
Q_PROPERTY(DocumentList* documents READ documents)
Q_PROPERTY(QString id READ id)
Q_PROPERTY(bool visible READ isVisible WRITE setVisible)
public:
explicit Application(QObject *parent = nullptr);
DocumentList *documents() const;
QString id() const { return objectName(); }
void setVisible(bool on);
bool isVisible() const;
QTabWidget *window() const { return m_ui.data(); }
public slots:
void quit();
private:
QScopedPointer <DocumentList> m_docs;
QScopedPointer <QTabWidget> m_ui;
};
第一个类Application代表应用对象。它公开了只读属性documents和id来获取对文档列表的访问,以及一个标识符。一个读/写属性visible控制应用程序基于QTabWidget的用户界面是否应该可见,一个槽quit()终止应用程序。
RegisterObject属性被设置为确保该类的实例在COM的运行对象表(ROT)中被注册--这允许COM客户端连接到一个已经实例化的COM对象。
class DocumentList : public QObject
{
Q_OBJECT
Q_CLASSINFO("ClassID", "{496b761d-924b-4554-a18a-8f3704d2a9a6}")
Q_CLASSINFO("InterfaceID", "{6c9e30e8-3ff6-4e6a-9edc-d219d074a148}")
Q_PROPERTY(Application* application READ application)
Q_PROPERTY(int count READ count)