Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: Sun от Май 09, 2005, 04:07



Название: Рисование!!!
Отправлено: Sun от Май 09, 2005, 04:07
Помогите разобраться в ошибке, не знаю как ее исправить.
Создаю свой класс, который должен рисовать прямоугольники на главном окне приложения. Описываю свойства для чтения и записи размеров этого прямоугольника. А компилятор выдает следующие ошибки:


g++ -c -pipe -Wall -W -O2 -fomit-frame-pointer -pipe -march=i586 -mcpu=pentiumpro  -DQT_NO_DEBUG -DQT_SHARED -DQT_THREAD_SUPPORT -I/usr/lib/qt3/mkspecs/default -I. -I. -I/usr/lib/qt3//include -o main.o main.cpp
In file included from main.cpp:10:
Qprect.h:30:18: warning: no newline at end of file
main.cpp: In function `int main(int, char**)':
main.cpp:34: error: `set_X' undeclared (first use this function)
main.cpp:34: error: (Each undeclared identifier is reported only once for each function it appears in.)
main.cpp:35: error: `set_Y' undeclared (first use this function)
main.cpp:36: error: `set_W' undeclared (first use this function)
main.cpp:37: error: `set_H' undeclared (first use this function)
main.cpp:42:2: warning: no newline at end of file
make: *** [main.o] Ошибка 1

вот файл qprect.h:

class QPainterRect : public QWidget
{
    Q_OBJECT
    Q_PROPERTY( int x READ x WRITE se_tX )
    Q_PROPERTY( int y READ y WRITE set_Y )
    Q_PROPERTY( int w READ w WRITE set_W )
    Q_PROPERTY( int h READ h WRITE set_H )
       public:
    QPainterRect(QWidget *parent=0,char const *name=0,WFlags f=0);
    ~QPainterRect();
 
    int x() {return fx;}
    int y() {return fy;}
    int w() {return fw;}
    int h() {return fh;}  
   
    void set_X(int a);
    void set_Y(int b);
    void set_W(int c);
    void set_H(int d);
   
    protected:  
    void paintEvent( QPaintEvent * );  

    private:
    int fx, fy, fw, fh;  
};

а вот main.cpp:

int main( int argc, char **argv )
{
    QApplication a( argc, argv );      
    QSize sz;
    QColor clr;
    sz.setWidth (640);
    sz.setHeight (480);
    clr.setRgb (255, 255, 255);
    mw = new QWidget(0,0,0);
    mw->resize(sz);
    mw->setPalette( QPalette(clr) );
    mw->show();
   
    QWidget *prect;
    prect = new QPainterRect(mw,0,0);
    prect->set_X(10);
    prect->set_Y(10);
    prect->set_W(100);
    prect->set_H(100);
   
    a.setMainWidget(mw);
    prect->show();
    return a.exec();            
}


Название: Re: Рисование!!!
Отправлено: Hellenna от Май 09, 2005, 09:18
Цитата: "Sun"

   
    QWidget *prect;
    prect = new QPainterRect(mw,0,0);

неправильно так делать, у тебя объект класса QPainterRect при присвоении преобразуется к классу QWidget у которого нет тех функций, которые ты определил в классе QPainterRect
надо так:
Код:
QPainterRec *prect;
prect = new QPainterRect(mw,0,0);


Название: Рисование!!!
Отправлено: Sun от Май 10, 2005, 06:18
Спасибо большое!
А как правильно описывать свойства Q_PROPERTY для чтения и записи? Есть int fx, fy, fw, fh (размеры прямоугольника). А то все попытки вылетают в ошибки :(((


Название: Рисование!!!
Отправлено: Sun от Май 10, 2005, 08:25
Уже разобралась :)


Название: Рисование!!!
Отправлено: Sun от Май 10, 2005, 08:43
Люди добрые!!!! Подскажите как сделать так, чтобы когда рисовались 2 и более фигурок, то они не перекрывали друг друга……А то у меня получаеться что рисуется последняя.

int main( int argc, char **argv )
{
    QApplication a( argc, argv );      
    QSize sz;
    QColor clr;
    sz.setWidth (640);
    sz.setHeight (480);
    clr.setRgb (255, 255, 255);
    mw = new QWidget(0, 0, 0);
    mw->resize(sz);
    mw->setPalette( QPalette(clr) );
    mw->show();
   
    QPainterRect *prect1, *prect2;
    prect1 = new QPainterRect(mw, 0, 0);
    prect1->set_X(10);
    prect1->set_Y(10);
    prect1->set_W(20);
    prect1->set_H(20);

    prect2 = new QPainterRect(mw, 0, 0);
    prect2->set_X(30);
    prect2->set_Y(30);
    prect2->set_W(40);
    prect2->set_H(40);

    a.setMainWidget(mw);

    prect1->show();
    prect2->show();    
   
    return a.exec();            
}

За ранее спасибо!!!


Название: Рисование!!!
Отправлено: Sun от Май 10, 2005, 08:47
и забыла еще
class QPainterRect : public QWidget


Название: Рисование!!!
Отправлено: Hellenna от Май 11, 2005, 15:46
Рисуются оба, только виден последний потому что объекты класса  QPainterRect  просто перекрывают друг дурга (по умолчанию у них выставлениы одинаковые размеры и координаты).
Вижу два пути решения проблемы:
1. Рисовать оба прямоугольника на одном компоненте
2. Задавать координаты объектов класса  QPainterRect  так чтобы они не перекрывали друг друга (см. QWidget::setGeometry(...))
Мне кажется что первый путь более логичный, хотя все зависит от специфики твоей задачи. :)


Название: Рисование!!!
Отправлено: Sun от Май 30, 2005, 18:01
Спасибочки, буду думать дальше


Название: Рисование!!!
Отправлено: west от Июнь 01, 2005, 16:39
А если Вы разобрались с Q_PROPERTY , то поясните, плз, че этто такое и для чего, каюсь, ни разу не видел такой конструкции, уже иду пробовать...


Название: Рисование!!!
Отправлено: Keiko от Июнь 01, 2005, 23:43
Assistant -> Index -> "Properties"