При использовании библиотеки 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>
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
В общем, передаю поток чтения из файла в функцию, чтобы строку считала, но вадаёт ошибку:
Не очень понимаю, что я делаю не такПрограмма просто завершается (с кодом 0) и ничего не выводит
При компиляции выводит 10 48 [Error] expected primary-expression before '}' token Уже полчаса бьюсь, что делать?
Есть такая обёртка для подключения: