Я кодирую окно графика для ввода в реальном времени в QtCreator, с волнами данных, которые циклически перезаписывают себя с заданным пользователем периодом.
Фактический плоттер и инициализация оси работают отлично, но у меня возникают некоторые проблемы с обновлением оси времени в конце каждого периода. Я думал, что стирание всех данных в области метки и повторное рисование с использованием новых значений будет работать, но вместо этого вся ось будет стерта в конце первого периода. Я подозреваю некоторую проблему с моим использованием QPainter.
Первый пост, успокойся на мне.
void T_AxisWidget :: initAxis (double window_period) {
period = window_period;
t_pixmap = QPixmap (size ());
t_pixmap.fill (Qt :: черный);QPainter painter(&t_pixmap); painter.initFrom(this); painter.setPen(Qt::red); painter.drawLine(0, 0, size().width(), 0); painter.drawLine(0, 0, 0, TICK_LENGTH); //always draw first tick at origin int tick_interval = size().width()/(num_ticks); int remainder = (size().width()%(num_ticks))-1; //pixels to be skipped to cover entire axis painter.drawText(0, TICK_LENGTH+2, tick_interval/2, size().height()-TICK_LENGTH+2, Qt::AlignLeft | Qt::AlignTop, QString::number(0)); qDebug() << "width = " << size().width(); qDebug() << "interval = " << size().width()/(num_ticks); for(int i=tick_interval; i<=size().width()-tick_interval; i+=tick_interval) { if (remainder>0) { ++i; //space ticks an extra pixel apart initially to achieve an even spread --remainder; qDebug() << "remainder = " << remainder; qDebug() << "tick = " << i; } painter.drawLine(i, 0, i, TICK_LENGTH); painter.drawText(i-(tick_interval/2), TICK_LENGTH+2, tick_interval, size().height()-TICK_LENGTH+2, Qt::AlignHCenter | Qt::AlignTop, QString::number((period/(double)num_ticks)*(i/tick_interval))); } painter.drawLine(size().width()-1, 0, size().width()-1, TICK_LENGTH); painter.drawText(size().width()-tick_interval/2, TICK_LENGTH+2, tick_interval/2, size().height()-TICK_LENGTH+2, Qt::AlignRight | Qt::AlignTop, QString::number(period)); }
void T_AxisWidget :: setTValues (int multiplier) {
двойной старт = период * множитель;
int tick_interval = period / num_ticks;QPainter painter(&t_pixmap); painter.initFrom(this); painter.setPen(Qt::red); QRect eraseblock(0, TICK_LENGTH+2, size().width(), size().height()); painter.eraseRect(eraseblock); painter.drawText(0, TICK_LENGTH+2, tick_interval/2, size().height()-TICK_LENGTH+2, Qt::AlignLeft | Qt::AlignTop, QString::number(start));for(int i=1; i<num_ticks; i++) { painter.drawText(i*tick_interval-(tick_interval/2), TICK_LENGTH+2, tick_interval, size().height()-TICK_LENGTH+2, Qt::AlignHCenter | Qt::AlignTop, QString::number(start+(i*period/(double)num_ticks))); } painter.drawText(size().width()-(tick_interval/2), TICK_LENGTH+2, tick_interval/2, size().height()-TICK_LENGTH+2, Qt::AlignRight | Qt::AlignTop, QString::number(period*multiplier));
}
void T_AxisWidget :: paintEvent (QPaintEvent * / * event * /) {
QStylePainter Painter (это);
painter.drawPixmap (0, 0, t_pixmap); }
Задача ещё не решена.
Других решений пока нет …