1. Написал на Qt activeX контролл. У него есть свойство setColor(QColor). Добавляю этот контролл, например в MFC проект. В редакторе формы MFC все ок, свойство можно настраивать. Однако при попытке программно обратится к этому свойству возникают некоторые вопросы:
1.1 Почему свойство изменило свое имя с setColor на Setcolor?
1.2 Почему в параметрах Setcolor стоит не QColor, а unsigned long? Что туда передавать - COLORREF или как-то нужно по особому формировать данные о цвете?
2. Можно ли передать клиенту (программа на MFC) методы, в качестве параметров в которых стоят типы данных определенные в контролле, например:
Метод setMarker(MarkerProperty prop);
//Класс описывающий свойства маркера
class MarkerProperty : public QObject
{
Q_OBJECT
Q_ENUMS(MarkerStyle)
Q_PROPERTY(QString title READ title WRITE setTitle)
Q_PROPERTY(MarkerStyle style READ style WRITE setStyle)
Q_PROPERTY(int size READ size WRITE setSize)
Q_PROPERTY(QColor color READ color WRITE setColor)
Q_PROPERTY(bool backGround READ backGround WRITE setBackGround)
Q_PROPERTY(QColor bgColor READ bgColor WRITE setBgColor)
Q_PROPERTY(QColor bgColor READ bgColor WRITE setBgColor)
Q_PROPERTY(QPointF position READ position WRITE setPosition)
public:
MarkerProperty(QObject *parent = 0);
//копирующий конструктор
MarkerProperty(const MarkerProperty &marker) : QObject( marker.parent() ) {
assign(marker);
}
//Перегрузка оператора присваивания
inline MarkerProperty& operator = (const MarkerProperty &marker) {
assign(marker);
return *this;
}
//Копирование полей класса
void assign(const MarkerProperty &marker);
private:
void initialize();
public:
//Тип маркера
enum MarkerStyle{
NoMarker,
Arc,
Quad,
X,
Plus,
PlusNx,
Romb,
TriDown,
TriUp,
TriLeft,
TriRight,
Star5,
Star6
};
QString title() const{ return m_title; }
MarkerStyle style() const{ return m_style; }
int size() const{ return m_size; }
QColor color() const{ return m_color; }
bool backGround() const{ return m_backGround; }
QColor bgColor() const{ return m_bgColor; }
QPointF position() const{ return m_position; }
void emitAll();
public slots:
void setTitle(QString text);
void setStyle(MarkerStyle style);
bool setStyle(int style);
void setSize(int size);
void setColor(QColor color);
void setBackGround(bool on);
void setBgColor(QColor color);
void setPosition(QPointF pos);
signals:
void propertyChanged();
void titleChanged(QString);
void styleChanged(MarkerStyle);
void styleChanged(int);
void sizeChanged(int);
void colorChanged(QColor);
void backGroundChanged(bool);
void bgColorChanged(QColor);
void positionChanged(QPointF);
private:
QString m_title; //Надпись маркера
MarkerStyle m_style;//Тип маркера
int m_size; //Размер маркера (диаметр)
QColor m_color; //Цвет маркера
bool m_backGround; //Заполнять внутри контура маркера определенным цветом
QColor m_bgColor; //Цвет заливки маркера
QPointF m_position; //Позиция маркера
};
Вообще, в идеале хотелось бы добится того, чтобы в MFC-клиенте можно было сделать так:
m_pMyControll.GetMarker()->setSize(...);
Привожу код самого контролла, прошу не пинать за то, что это немного видоизмененный пример AxBouncer из примеров книги про Qt - "Qt4 программирование GUI на C++" Жасмин Бланшет)
class BInterface
{
public:
virtual ~BInterface() {}
virtual void setCurveData(int id) = 0;
};
QT_BEGIN_NAMESPACE
Q_DECLARE_INTERFACE(BInterface,
"com.Bouncer.BInterface/1.0")
QT_END_NAMESPACE
class AxBouncer : public QWidget, public QAxBindable, public BInterface
{
Q_OBJECT
Q_ENUMS(SpeedValue)
Q_PROPERTY(QColor color READ color WRITE setColor)
Q_PROPERTY(SpeedValue speed READ speed WRITE setSpeed)
Q_PROPERTY(int radius READ radius WRITE setRadius)
Q_PROPERTY(bool running READ isRunning)
Q_INTERFACES(BInterface)
public:
void setCurveData(int id);
enum SpeedValue { Slow, Normal, Fast };
AxBouncer(QWidget *parent = 0);
void setSpeed(SpeedValue newSpeed);
SpeedValue speed() const { return ballSpeed; }
SpeedValue speed2() const { return ballSpeed; }
void setRadius(int newRadius);
int radius() const { return ballRadius; }
void setColor(const QColor &newColor);
QColor color() const { return ballColor; }
bool isRunning() const { return myTimerId != 0; }
QSize sizeHint() const;
QAxAggregated *createAggregate();
public slots:
void start();
void stop();
void stop3();
void stop4(QRect);
void setProp(MarkerProperty pr){prop = pr;}
MarkerProperty getProp(){ return prop;}
signals:
void bouncing();
protected:
void paintEvent(QPaintEvent *event);
void timerEvent(QTimerEvent *event);
private:
int intervalInMilliseconds() const;
QColor ballColor;
SpeedValue ballSpeed;
int ballRadius;
int myTimerId;
int x;
int delta;
MarkerProperty prop;
};
Вот кстати еще не понимаю, почему интерфейс stop3() и stop4(QRect) доступны из клиента, а метод setCurveData нет? Потому, что они объвлены в блоке public slots? и кстати для stop4 экспортируется класс QRect, правда без методов, а QColor почему-то нет.
main.cpp:
#include <QAxFactory>
#include "axbouncer.h"
QAXFACTORY_DEFAULT(AxBouncer,
"{5e2461aa-a3e8-4f7a-8b04-307459a4c08c}",
"{533af11f-4899-43de-8b7f-2ddf588d1015}",
"{772c14a5-a840-4023-b79d-19549ece0cd9}",
"{dbce1e56-70dd-4f74-85e0-95c65d86254d}",
"{3f3db5e0-78ff-4e35-8a5d-3d3b96c83e09}")
p.s. для проверки, вы можете взять пример из книги и изменить его как тут написано