Qt рисует фигуры в одном окне - PullRequest
0 голосов
/ 30 мая 2011
  1. Я создаю класс Widget, он создает окно, этот класс что-то рисует в окне (т.е. он работает так, как я хочу).
  2. Я создаю еще один класс, Circle, на котором я хочу рисоватьокно класса Widget.
  3. Я передаю адрес Widget и пытаюсь рисовать на Widget с помощью краски QPainter (адрес Widget);(в случае с Circle), но я ничего не вижу.

Я пытался сделать код как можно короче во время выполнения программы, я набираю адрес объекта Widget.Это не меняется.Это означает, что адрес Widget был передан правильно.

Везде, где я печатаю адрес Widget, я получаю один и тот же адрес.Вот код:

заголовок виджета

            class Widget : public QWidget
            {
                public:
                int  mi,mcount;
                Widget(QWidget *parent = 0);
                QPaintEvent *ev;
                virtual void paintEvent(QPaintEvent *);
            void drawcircle();
            };

Widget.cpp

Widget::Widget(QWidget *parent) : QWidget(parent)
{
    QWidget::paintEvent(ev);

    qDebug()<<this<<"\n";  //
}

        void Widget::drawcircle()
        {
        QPainter paint(this);
        paint.drawEllipse(0,0,100,100);
        }


void Widget::paintEvent(QPaintEvent *ev)
{    this->drawcircle(); }

заголовок Circle.h

        class Circle :public QWidget
        {
            public:
            Circle(Widget *widget);    // i do trick here!!!
            Widget *mwidg;
        QPaintEvent *ev;

        virtual void paintEvent(QPaintEvent *);
        void drawcircle(Widget *mwidg);
        };

Circle.cpp

    Circle::Circle(Widget *widget)
        {
        qDebug()<<"circle widget"<<widget;
        QWidget::paintEvent(ev);
        mwidg=widget;
        qDebug()<<"\n"<<mwidg;
        }



    void Circle::paintEvent(QPaintEvent *ev)
    {  qDebug()<<"circle paintEvent mwidget"<<mwidg<<"\n";
    this->drawcircle(mwidg);
        }


        void Circle::drawcircle(Widget *mwidg)
            {
                QPainter paint(mwidg);
                paint.drawEllipse(20,10,40,40);
            paint.drawLine(0,0,500,500);
            }

main

    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        Widget *w=new Widget;

            qDebug()<<"main address of widget"<<w<<"\n";
        Circle *f=new Circle(w);
        w->show();

        return a.exec();
        }

Программа успешно скомпилирована и связана

Ответы [ 2 ]

0 голосов
/ 31 мая 2011

хорошо, спасибо за ваши попытки помочь но все, что мне было нужно:

this -> setParent (widget);

в конструкторе Circle :: Circle, если кто-то захочет увидеть мое решение, можно увидеть, что цифры сдвинуты

исходный код здесь исходный код

enter image description here

0 голосов
/ 30 мая 2011

Чего именно вы пытаетесь достичь? Вы можете рисовать только на любом виджете в его собственном обработчике paintEvent (), и вам не следует вызывать paintEvent () самостоятельно, он не будет работать. Кроме того, избавьтесь от переменных-членов QPaintEvent.

Я бы предложил сделать Circle дочерним для Widget, а затем нарисовать круг из Circle :: paintEvent (). В качестве альтернативы используйте QGraphicsView.

...