Russian Qt Forum
Май 16, 2024, 20:02 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Несколько вопросов про Qt ActiveX  (Прочитано 7718 раз)
dr_Begemot
Гость
« : Июль 14, 2009, 17:04 »

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. для проверки, вы можете взять пример из книги и изменить его как тут написано
Записан
dr_Begemot
Гость
« Ответ #1 : Июль 15, 2009, 15:17 »

Никто не работал с ActiveX в Qt? Грустный
Записан
Spicos
Гость
« Ответ #2 : Июль 15, 2009, 17:39 »

Похоже нет, все молчат. Это тайна покрытая мраком. Смеющийся
Записан
Tonal
Гость
« Ответ #3 : Июль 16, 2009, 10:18 »

1.1 Почему свойство изменило свое имя с setColor на Setcolor?
Похоже на соглашение об именах для COM-а.
Стандартное свойство называется color, сеттер Setcolor.

1.2 Почему в параметрах Setcolor стоит не QColor, а unsigned long? Что туда передавать - COLORREF или как-то нужно по особому формировать данные о цвете?
Клиент ActiveX-а может быть написан на языке, который не в курсе что такое QColor. Поэтому вместо QColor используется unsigned long.
Про COLORREF похоже на правду. Улыбающийся

2. Можно ли передать клиенту (программа на MFC) методы, в качестве параметров в которых стоят типы данных определенные в контролле, например:
Метод setMarker(MarkerProperty prop);
В COM-е параметр может принимать базовые типы, Variant или указатель на известный COM-интерфейс.
Как это выразить в QActiveX я не в курсе. Нужно разбираться. Улыбающийся
Записан
dr_Begemot
Гость
« Ответ #4 : Июль 16, 2009, 10:51 »

1.1 Почему свойство изменило свое имя с setColor на Setcolor?
Похоже на соглашение об именах для COM-а.
Стандартное свойство называется color, сеттер Setcolor.

1.2 Почему в параметрах Setcolor стоит не QColor, а unsigned long? Что туда передавать - COLORREF или как-то нужно по особому формировать данные о цвете?
Клиент ActiveX-а может быть написан на языке, который не в курсе что такое QColor. Поэтому вместо QColor используется unsigned long.
Про COLORREF похоже на правду. Улыбающийся

2. Можно ли передать клиенту (программа на MFC) методы, в качестве параметров в которых стоят типы данных определенные в контролле, например:
Метод setMarker(MarkerProperty prop);
В COM-е параметр может принимать базовые типы, Variant или указатель на известный COM-интерфейс.
Как это выразить в QActiveX я не в курсе. Нужно разбираться. Улыбающийся

Спасибо) Хоть что-то)
Где бы еще найти где почитать про то как сделать возможность в методы передавать указатель на известный COM-интерфейс - я так понимаю, это и сделает возможным setMarker(MarkerProperty prop);...

В Qt доке чет мало по этому вопросу, несколько базовых примеров - демонстрирующих, очень малую часть возможностей Грустный
Записан
Tonal
Гость
« Ответ #5 : Июль 21, 2009, 10:47 »

QActiveX - просто обёртка над MS ActiveX технологией.
Поэтому читать нужно доки по самой MS ActiveX, а в доках по Qt смотреть нюансы реализации. Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.048 секунд. Запросов: 20.