Qt рисует фигуры в одном окне

#c #qt #qpainter

#c #qt #qpainter

Вопрос:

  1. Я создаю класс Widget, он создает window, этот класс рисует что-то в окне (т. е. он работает так, как я хочу).
  2. Я создаю еще один класс, Circle, который я хочу нарисовать в окне виджета class.
  3. Я передаю адрес виджета и пытаюсь нарисовать виджет с помощью QPainter paint (адрес виджета); (в примере Circle), но я ничего не вижу.

Я постарался сделать код как можно короче, во время выполнения программы я ввожу адрес object 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(); }
  

окружность заголовка.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);
            }
  

Главная

     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();
        }
  

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

Комментарии:

1. QWidget::paintEvent() защищен. Кроме того, Circle::paintEvent не вызывается, поскольку вы не добавили circle в качестве дочернего элемента основного виджета.

2. я объявляю его общедоступным. и, кроме того, если я напишу в main.cpp Виджет * w = новый виджет; w-> paintEvent() , Qt позволит мне это сделать. это означает, что paintEvent является общедоступным. правильно ли я думаю?

3. Вам не следует вызывать paintEvent() самостоятельно, фреймворк сделает это, когда виджет нужно будет раскрасить. Просто поместите нужный код рисования внутрь paintEvent (), и он будет вызван при необходимости.

4. должен ли я делать это всегда? но я делаю это в виджете, и это работает. почему я не должен делать это в Circle?

5. я пытался это изменить — ничего, результат все тот же

Ответ №1:

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

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

Ответ №2:

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

this -> SetParent(виджет);

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

исходный код находится здесь, исходный код

введите описание изображения здесь