COM App Example (ActiveQt)▲
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 &
lt;DocumentList&
gt; m_docs;
QScopedPointer &
lt;QTabWidget&
gt; m_ui;
}
;
The first class Application represents the application object. It exposes read-only properties documents and id to get access to the list of documents, and an identifier. A read/write property visible controls whether the QTabWidget-based user interface of the application should be visible, and a slot quit() terminates the application.
The RegisterObject attribute is set to make sure that instances of this class are registered in COM's running object table (ROT) - this allows COM clients to connect to an already instantiated COM object.
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)
public
:
explicit
DocumentList(Application *
application);
int
count() const
;
Application *
application() const
;
public
slots:
Document *
addDocument();
Document *
item(int
index) const
;
private
:
QList&
lt;Document *&
gt; m_list;
}
;
The DocumentList class stores a list of documents. It provides an API to read the number of documents, to access each document by index and to create a new document. The application property returns the root object.
class
Document : public
QObject
{
Q_OBJECT
Q_CLASSINFO("ClassID"
, "{2b5775cd-72c2-43da-bc3b-b0e8d1e1c4f7}"
)
Q_CLASSINFO("InterfaceID"
, "{2ce1761e-07a3-415c-bd11-0eab2c7283de}"
)
Q_PROPERTY(Application *
application READ application)
Q_PROPERTY(QString title READ title WRITE setTitle)
public
:
explicit
Document(DocumentList *
list);
virtual
~
Document();
Application *
application() const
;
QString title() const
;
void
setTitle(const
QString &
amp;title);
private
:
QScopedPointer &
lt;QWidget&
gt; m_page;
}
;
The Document class finally represents a document in the application. Each document is represented by a page in the application's tab widget, and has a title that is readable and writable through the document's API. The application property again returns the root object.
Document::
Document(DocumentList *
list)
:
QObject(list)
{
QTabWidget *
tabs =
list-&
gt;application()-&
gt;window();
m_page.reset(new