crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> custom widget, как сделать "составные" property?
zamnach
  опции профиля:
сообщение 16.9.2008, 15:44
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 36
Регистрация: 18.7.2008
Пользователь №: 239

Спасибо сказали: 0 раз(а)




Репутация:   0  


синопсис: есть класс MyWidget, хочу прикрутить к нему свойство примерно так
Q_PROPERTY (mytype format READ GetFormat);
// но класс mytype - не относится к QString, bool, int и т.п.
и видимо поэтому, свойство format в QtDesigner не появилось.
в чем подвох?
спасибо
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 16.9.2008, 16:03
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


не пробывал такие штуки делать, но предположу:
Нужно зарегестрировать свой тип данных в Qt'ях

см. Q_DECLARE_METATYPE ( Type )
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
bobdva
  опции профиля:
сообщение 8.10.2008, 15:48
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 29
Регистрация: 2.10.2008
Из: Москва
Пользователь №: 377

Спасибо сказали: 0 раз(а)




Репутация:   0  


интересно как решилась проблема ?
c Q_DECLARE_METATYPE (myType) что-то не пошло...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 8.10.2008, 15:59
Сообщение #4


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(bobdva @ 8.10.2008, 19:48) *
c Q_DECLARE_METATYPE (myType) что-то не пошло...
совершенно не информативная фраза, нужно что-нибудь конкретнее.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
bobdva
  опции профиля:
сообщение 8.10.2008, 16:18
Сообщение #5


Студент
*

Группа: Участник
Сообщений: 29
Регистрация: 2.10.2008
Из: Москва
Пользователь №: 377

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Litkevich Yuriy @ 8.10.2008, 16:59) *
Цитата(bobdva @ 8.10.2008, 19:48) *
c Q_DECLARE_METATYPE (myType) что-то не пошло...
совершенно не информативная фраза, нужно что-нибудь конкретнее.


для класса продекларировано:
Q_PROPERTY(myType propertyName READ propertyName WRITE setPropertyName)

где myType - собственный тип, при этом
setProperty("propertyName", myTypeObject);

метод не отрабатывает, хотя директива
Q_DECLARE_METATYPE ( myType )

есть.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 8.10.2008, 16:21
Сообщение #6


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


можешь собрать наипростейший пример, где объявляется свой тип и регистрируется в системе метаинформации Qt?
т.е. минимальный, без объявления свойств виджета. Попробую поэксперементировать.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
bobdva
  опции профиля:
сообщение 8.10.2008, 16:36
Сообщение #7


Студент
*

Группа: Участник
Сообщений: 29
Регистрация: 2.10.2008
Из: Москва
Пользователь №: 377

Спасибо сказали: 0 раз(а)




Репутация:   0  


someinfo.h
#include <QString>
#include <QMetaType>

class SomeInfo {
public:
    SomeInfo(){}
    SomeInfo &operator = (const SomeInfo &);
    SomeInfo(const SomeInfo&);
    
    QString getName() const;
    void setName(const QString name);
    
private:
    QString name;
};
Q_DECLARE_METATYPE ( SomeInfo )


и someinfo.cpp
SomeInfo &SomeInfo::operator = (const SomeInfo &){return *this;}
SomeInfo::SomeInfo(const SomeInfo&){}
    
QString SomeInfo::getName() const {
    return name;
}

void SomeInfo::setName(const QString value){
    name = value;
    std::cout << " setName " << value.constData() << std::endl;
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 8.10.2008, 16:39
Сообщение #8


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


bobdva, "Хорошо начал, не разменивайся на мелочах" :)
Т.е. и main.cpp давай
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
bobdva
  опции профиля:
сообщение 8.10.2008, 17:21
Сообщение #9


Студент
*

Группа: Участник
Сообщений: 29
Регистрация: 2.10.2008
Из: Москва
Пользователь №: 377

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Litkevich Yuriy @ 8.10.2008, 17:39) *
bobdva, "Хорошо начал, не разменивайся на мелочах" :)
Т.е. и main.cpp давай

оказывается не правильно использовал setProperty - надо передавать в него QVariant, но каким-то образом собиралось с просто SomeInfo...

итого - всё работает
widget.h
#include <QWidget>
#include "someinfo.h"

class Widget : public QWidget
{
    Q_OBJECT
    Q_PROPERTY(SomeInfo someInfo READ getSomeInfo WRITE setSomeInfo)
    
public:
    Widget(QWidget *parent = 0): QWidget(parent){};
    
    SomeInfo getSomeInfo() const;
    void setSomeInfo(SomeInfo someInfo);
    
protected:
    SomeInfo someInfo;
};

widget.cpp
#include "widget.h"
#include <iostream>

SomeInfo Widget::getSomeInfo() const{
    return someInfo;
}

void Widget::setSomeInfo(SomeInfo value){
    std::cout << "setSomeInfo" << std::endl;
    someInfo = value;
}

main.cpp
#include <QApplication>
#include <QVariant>
#include "widget.h"

int main(int argc, char **argv)
{
    QApplication app(argc, argv);

    Widget *w = new Widget();

    SomeInfo s;    
    QVariant var;
    var.setValue(s);
    w->setProperty("someInfo", var);

    w->show();
    return app.exec();
}


а теперь вопрос - а как бы это всё можно было бы использовать через ui ???
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
zamnach
  опции профиля:
сообщение 10.10.2008, 15:59
Сообщение #10


Студент
*

Группа: Участник
Сообщений: 36
Регистрация: 18.7.2008
Пользователь №: 239

Спасибо сказали: 0 раз(а)




Репутация:   0  


за пример - благодарствую. будем посмотреть
по поводу "использовать через ui ??? ", задайте четко вопрос и я попробую найти ответ.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 22.12.2024, 21:09