Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: break от Декабрь 12, 2007, 03:45



Название: Виджет имеющий в качестве Property другой объект со свойствамми
Отправлено: break от Декабрь 12, 2007, 03:45
Пытаюсь создать виджет (для использования в QDisigner), который будет иметь свойство - другой объект, у которого также есть свойства. Например как свойство QFont у QWidget.

Есть код:

Код:
#ifndef SCALE_CONTROL_H
#define SCALE_CONTROL_H

#include <QWidget>

class CArrow : public QObject
{
Q_OBJECT;
Q_PROPERTY(QColor COLOR READ getColor WRITE setColor);
protected:
QColor m_color;
inline QColor getColor() const {return m_color;};
inline void setColor(QColor const &newColor) {m_color = newColor;};
};

class ScaleControl : public QWidget
{
Q_OBJECT;
Q_PROPERTY(CArrow arrow1 READ getArrow1 /*WRITE setArrow1*/);
public:
ScaleControl(QWidget *parent = 0);

protected:
void paintEvent(QPaintEvent *event);

CArrow m_arrow1;
inline const CArrow &getArrow1() const {return m_arrow1;};
//inline void setArrow1(const CArrow &) {};
};

#endif

Подскажите где я запутался?


Название: Re: Виджет имеющий в качестве Property другой объект со свойствамми
Отправлено: Mikhail от Декабрь 12, 2007, 08:11
Пытаюсь создать виджет (для использования в QDisigner), который будет иметь свойство - другой объект, у которого также есть свойства. Например как свойство QFont у QWidget.

Есть код:

Код:
#ifndef SCALE_CONTROL_H
#define SCALE_CONTROL_H

#include <QWidget>

class CArrow : public QObject
{
Q_OBJECT;
Q_PROPERTY(QColor COLOR READ getColor WRITE setColor);
protected:
QColor m_color;
inline QColor getColor() const {return m_color;};
inline void setColor(QColor const &newColor) {m_color = newColor;};
};

class ScaleControl : public QWidget
{
Q_OBJECT;
Q_PROPERTY(CArrow arrow1 READ getArrow1 /*WRITE setArrow1*/);
public:
ScaleControl(QWidget *parent = 0);

protected:
void paintEvent(QPaintEvent *event);

CArrow m_arrow1;
inline const CArrow &getArrow1() const {return m_arrow1;};
//inline void setArrow1(const CArrow &) {};
};

#endif

Подскажите где я запутался?

Не объявил переменные для хранения значения свойства.

Дожно быть QColor COLOR вместо QColor m_color, а в другом классе CArrow arrow1 вместо CArrow m_arrow1.

Ассистент тебе поможет.


Название: Re: Виджет имеющий в качестве Property другой объект со свойствамми
Отправлено: break от Декабрь 12, 2007, 10:24
поменял названия свойств хранения (не думал что это имеет значение) ошибка осталась прежняя:

/usr/include/qt4/QtCore/qobject.h:287: error: ‘QObject& QObject::operator=(const QObject&)’ is private
release/../src/ScaleControl.h:7: error: within this context

release/moc_ScaleControl.cpp:140: note: synthesized method ‘CArrow& CArrow::operator=(const CArrow&)’ first required here


Название: Re: Виджет имеющий в качестве Property другой объект со свойствамми
Отправлено: break от Декабрь 12, 2007, 10:26
Дело в том что с QColor все работает (проверял в Дизайнере), а вот когда я свой CArrow пытаюсь в качестве свойства использовать уже не компилир-ся.


Название: Re: Виджет имеющий в качестве Property другой объект со свойствамми
Отправлено: Вячеслав от Декабрь 12, 2007, 10:46
А оператор присваивания написать , тот который компилятор хотит ?
Он-же тебе русским английским сказал "CArrow& CArrow::operator=(const CArrow&)" нада ;)


Название: Re: Виджет имеющий в качестве Property другой объект со свойствамми
Отправлено: Tonal от Декабрь 12, 2007, 11:10
QObject не поддерживает копирования, о чём собственно и говорит сообщение компилятора об ошибке.
А с объектными свойствами - посмотри в ассистенте - тот же QFont или QColor не наследуются от QObject и свойств, а так же сигналов со слотами не имеют.

Если таки действительно нужен наследник QObject-а - возвращай указатель.


Название: Re: Виджет имеющий в качестве Property другой объект со свойствамми
Отправлено: break от Декабрь 17, 2007, 17:57
Кто нибудь делал такое - уже запутался (с QT только разбираюсь), хочется пример аналогичный первому моему посту, но рабочий, наследник QObject не нужен.

Вообще задача такая - компонент виджет часы - у него стрелки(их то я и хотел в отдельный компонент выделить), кот. имеют собственные цвета, признак видимости и др. сейчас все работает но вместо свойств Arrow1, Arrow2, Arrow3 с соотв. подсвойствами все в кучу пришлось слить в сам компонент - неудобно. Если не получится конечно прийдется оставить так, но ведь QFont работает.

В ассистенте ничего не нашел, в исходниках QFont.cpp следующее:

Код:

class Q_GUI_EXPORT QFont
{
    Q_GADGET
    Q_ENUMS(StyleStrategy)
public:
    enum StyleHint {
        Helvetica,  SansSerif = Helvetica,
        Times,      Serif = Times,
        Courier,    TypeWriter = Courier,
        OldEnglish, Decorative = OldEnglish,
        System,
        AnyStyle
    };

    enum StyleStrategy {
        PreferDefault    = 0x0001,
        PreferBitmap     = 0x0002,
        PreferDevice     = 0x0004,
        PreferOutline    = 0x0008,
        ForceOutline     = 0x0010,
        PreferMatch      = 0x0020,
        PreferQuality    = 0x0040,
        PreferAntialias  = 0x0080,
        NoAntialias      = 0x0100,
        OpenGLCompatible = 0x0200,
        NoFontMerging    = 0x8000
    };

Что такое class Q_GUI_EXPORT, и  Q_GADGET - у меня Асистент не находит ничего...


Название: Re: Виджет имеющий в качестве Property другой объект со свойствамми
Отправлено: pastor от Декабрь 17, 2007, 18:30
Что такое class Q_GUI_EXPORT, и  Q_GADGET - у меня Асистент не находит ничего...

Q_GUI_EXPORT - это макрос импорта\экспорта; см. qglobal.h
Q_GADGET - это макрос позвляет добавить мета-информацию в не QObject-класс; см. qobjectdefs.h