Russian Qt Forum

Qt => Вопросы новичков => Тема начата: oBOXPOH от Мая 12, 2017, 10:14



Название: resizeEvent для QChart
Отправлено: oBOXPOH от Мая 12, 2017, 10:14
Всем здравствуйте!

Сейчас стараюсь сделать resizeEvent хотя бы для какого-то элемента.

У меня есть мною созданный ClassChart, который наследует QChart. В нём есть конструктор, который создаёт 2 элемента QGraphicsSimpleTextItem, а также обработчик resizeEvent. Код далее.

Заголовочный:
Код:
#ifndef CLASSCHART_H
#define CLASSCHART_H

#include <QWidget>
#include <QtCharts>
#include <QGraphicsTextItem>

namespace Ui {
class ClassChart;
}

class ClassChart : public QChart
{
    Q_OBJECT

public:
    explicit ClassChart(QGraphicsItem *parent = 0, Qt::WindowFlags wFlags = 0);
    ~ClassChart();

protected:
    void resizeEvent(QResizeEvent *event);

private:
    QGraphicsSimpleTextItem *chartCoordX, *chartCoordY;
};

#endif // CLASSCHART_H

Исходник:
Код:
#include "classchart.h"

ClassChart::ClassChart(QGraphicsItem *parent, Qt::WindowFlags wFlags)
    : QChart(QChart::ChartTypeCartesian, parent, wFlags)
{
    chartCoordX = new QGraphicsSimpleTextItem(this);
    chartCoordX->setText(tr("X: "));
    chartCoordY = new QGraphicsSimpleTextItem(this);
    chartCoordY->setText(tr("Y: "));
}

ClassChart::~ClassChart(){}



void ClassChart::resizeEvent(QResizeEvent *event)
{
    chartCoordX->setPos(size().width()/2 - 50, size().height());
    chartCoordX->setPos(size().width()/2 + 50, size().height());
}

По идее, когда этот ClassChart изменяет размеры, должен вызываться обработчик события QResizeEvent, но этого не происходит - 2 элемента для координат всегда находятся в левом верхнем углу относительно ClassChart.

Если лезть ещё глубже, то у меня есть главное окно, в котором используется созданный виджет, в котором есть этот ClassChart. При изменении размеров главного окна событие в ClassChart не приходит.

Помогите, пожалуйста. Я уже вообще жесть напотел!


Название: Re: resizeEvent для QChart
Отправлено: VPS от Мая 12, 2017, 10:59
Если Вы используете современный синтаксис, то поставьте в конце объявления метода "resizeEvent" спецификатор "override". Думаю, что дальше поймёте в чём дело.


Название: Re: resizeEvent для QChart
Отправлено: oBOXPOH от Мая 12, 2017, 11:41
Если Вы используете современный синтаксис, то поставьте в конце объявления метода "resizeEvent" спецификатор "override". Думаю, что дальше поймёте в чём дело.
Честно, я уже это пробовал, но пишет ошибку, что функция не является перегруженной. А это, скорее всего, потому, что в QChart, от которого я наследую свой класс, метод не является виртуальным.
Есть какие-нибудь ещё идеи? Синтаксис, кстати, я, вроде, использую стандартный.


Название: Re: resizeEvent для QChart
Отправлено: kuzulis от Мая 12, 2017, 11:56
[disclaimer]
Не используйте QChart, т.к. он ооочень медленный и ооочень требовательный к ресурсам.
Используйте Qwt (предпочтительно) или QCustomPlot (на худой конец).
[/disclaimer]


Название: Re: resizeEvent для QChart
Отправлено: VPS от Мая 12, 2017, 12:00
А это, скорее всего, потому, что в QChart, от которого я наследую свой класс, метод не является виртуальным.
Пишет это из-за того, что у класса QChart другой тип параметра в методе resizeEvent (он наследует метод от класса QGraphicsWidget):
Код:
resizeEvent(QGraphicsSceneResizeEvent *event)


Название: Re: resizeEvent для QChart
Отправлено: oBOXPOH от Мая 12, 2017, 12:20
А это, скорее всего, потому, что в QChart, от которого я наследую свой класс, метод не является виртуальным.
Пишет это из-за того, что у класса QChart другой тип параметра в методе resizeEvent (он наследует метод от класса QGraphicsWidget):
Код:
resizeEvent(QGraphicsSceneResizeEvent *event)
Да, сработало! Огромное спасибо! Наверное, да, QResizeEvent не относится к таким графическим виджетам, как QChart. Для QChart надо использовать resizeEvent(QGraphicsSceneResizeEvent *event).

Стало значительно яснее и понятнее! Ещё раз спасибо большое!