Wednesday, 7 August 2013

Qt - Can't paint over axis values

Qt - Can't paint over axis values

I'm coding a plot window for real-time input in QtCreator, with data
waveforms which writes over themselves in a cyclic manner with a
user-specified period.
The actual plotter and the axis initialization are working great, but I'm
having some trouble getting the time axis to update at the end of each
period. I thought that erasing all data in the label area and re-drawing
using the new values would work, but instead the entire axis is erased at
the end of the first period. I suspect some problem with my use of
QPainter.
First post, go easy on me.
void T_AxisWidget::initAxis(double window_period) { period =
window_period; t_pixmap = QPixmap(size()); t_pixmap.fill(Qt::black);
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) { double start =
period*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(this); painter.drawPixmap(0, 0, t_pixmap); }

No comments:

Post a Comment