Почему не рисуется QDateTimeAxis?

278
09 ноября 2017, 06:31

При использовании библиотеки QtCharts столкнулся с проблемой - не отрисовывается ось QDateTimeAxis в том случае, если добавление данных на график и связывание их с осями происходит после отрисовки окна/виджета (по событию), содержащего QChartView. При этом с осью ординат типа QValueAxis такой проблемы нет. При замене типа оси абсцисс на QValueAxis, соответственно, тоже проблемы не наблюдается.

Генерация данных и добавление их на график происходит в методе plot. Если внутри него для оси абсцисс установить аттрибут (например, setTitleText), то отрисовка произойдет. Не совсем понятно такое поведение.

Могу лишь предположить, что QChart хранит указатели на оси как QAbstractAxis и по какой-то причине невозможно преобразование QDataTime в значения, соответсвующие оси, что приводит к ошибке, и ось не выводится. Т.е. нет информации, что эта ось именно QDateTimeAxis.

#include <QApplication>
#include <QDebug>
#include <QMainWindow>
#include <QVBoxLayout>
#include <QPushButton>
#include <QtCore/QDateTime>
#include <QtCharts/QChartView>
#include <QtCharts/QDateTimeAxis>
#include <QtCharts/QValueAxis>
#include <QtCharts/QLineSeries>
QT_CHARTS_USE_NAMESPACE
class MyWindow : public QMainWindow
{
    Q_OBJECT
private:
    QChart *chart;
public:
    explicit MyWindow(QObject *parent = nullptr);
    void plot();
};

MyWindow::MyWindow(QObject *parent)
{
    chart = new QChart();
    chart->legend()->hide();
    QDateTimeAxis *axisX = new QDateTimeAxis;
    // QValueAxis *axisX = new QValueAxis; // - попытка замены типа оси
    axisX->setLinePenColor(QColor(Qt::red));
    chart->addAxis(axisX, Qt::AlignBottom);
    QValueAxis *axisY = new QValueAxis;
    axisY->setLinePenColor(QColor(Qt::red));
    chart->addAxis(axisY, Qt::AlignLeft);
    QChartView *chartView = new QChartView(chart);
    chartView->setRenderHint(QPainter::Antialiasing);
    QWidget *wgd = new QWidget();
    QVBoxLayout *box = new QVBoxLayout();
    QPushButton *btn = new QPushButton("test");
    connect(btn, &QPushButton::clicked, this, &MyWindow::plot); // добавление данных по нажатию
    box->addWidget(btn);
    box->addWidget(chartView);
    wgd->setLayout(box);
    setCentralWidget(wgd);
    resize(820, 600);
    // plot(); // вызов до отрисовки главного окна выполняется с отрисовкой осей
}
void MyWindow::plot()
{
    QLineSeries *series0 = new QLineSeries();
    qint64 x0 = QDateTime::currentMSecsSinceEpoch();
    for(int i = 0; i < 10; i++) {
        series0->append(x0 + i * 1e5, qrand());
    }
    chart->addSeries(series0);
    QList <QAbstractAxis *> axis = chart->axes();
    qDebug() << series0->attachAxis(axis[0]);
    qDebug() << series0->attachAxis(axis[1]);
    // прикрепление к осям проходит успешно
    // axis[0]->setTitleText("Test"); // при установке аттрибута ось будет отрисована
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MyWindow window;
    window.show();
    return a.exec();
}
#include <main.moc>
READ ALSO
Передача потока чтения из файла в функцию C++

Передача потока чтения из файла в функцию C++

В общем, передаю поток чтения из файла в функцию, чтобы строку считала, но вадаёт ошибку:

276
Создание структур C++

Создание структур C++

Не очень понимаю, что я делаю не такПрограмма просто завершается (с кодом 0) и ничего не выводит

373
Ошибка [Error] expected primary-expression before &#39;}&#39; token

Ошибка [Error] expected primary-expression before '}' token

При компиляции выводит 10 48 [Error] expected primary-expression before '}' token Уже полчаса бьюсь, что делать?

260
Segmentation fault при использовании структуры addrinfo в sendto

Segmentation fault при использовании структуры addrinfo в sendto

Есть такая обёртка для подключения:

246