PDA

View Full Version : Painting on QWidget issue on QScrollBars



AlbertoN
15th October 2013, 17:58
Hi all,

I'm going to open a new thread as I guess other doesn't get attention (maybe 'cause i didn't open a new more specific thread, and other users didn't scroll at the end). I hope to do stuff in right way (about forum section, how to "up" a post, and so on...) if it's not the case sorry in advance.

This is my question (http://www.qtcentre.org/threads/54728-QGraphicsView-get-fullscreen?p=252636#post252636), but I'm going to re-write it here so it's more handy.

I tried to drow my calendar in a QWidget as Santosh (http://www.qtcentre.org/threads/54728-QGraphicsView-get-fullscreen?p=244956#post244956) suggested. But some stuff are hard to do.
When I zoom in scrollbar can't let me see the whole calendar. Maybe it's a QScrollArea issue.
I read this (http://stackoverflow.com/questions/18703286/qscrollarea-missing-scrollbar) post for widgets nesting. Adding a further QWidget I got QScrollBars visible. So actually my widgets nesting is this(1):



QGroupBox (with vertical layout)
|
|-some stuff for header bar (with zoom in/out buttons, and so on)
|-QScrollArea (with vertical layout, widgetResizable property set to "true")
|
|-QWidget (as used into above post)
|
|-QWidget promoted to my DailyWidget class


I have part of the code into an Abstract class as I plan to create several calendar's views (daily,weekly,and so on..)
Therefore zoom in/out methods are into this abstract class(2):



//zoom in and out:
void AbstractWidget::slotZoom(int delta)
{
qreal scaleTemp = m_scaleFactor;
if(delta>0)
{
scaleTemp *= 1.25;
}else{
scaleTemp *= 0.8;
}
if(scaleTemp>=1.0 && scaleTemp<3.0)
{
m_scaleFactor = scaleTemp;

if(!m_scrollarea)
getScrollArea();
if(m_scrollarea)
{
QScrollBar *sb = m_scrollarea->horizontalScrollBar();

adjustScrollBar(sb, scaleTemp);

sb = m_scrollarea->verticalScrollBar();

adjustScrollBar(sb, scaleTemp);
}
update();
updateGeometry();
}
}

void AbstractWidget::adjustScrollBar(QScrollBar *scrollBar, double factor)
{
if(scrollBar)
{
scrollBar->setValue(int(factor * scrollBar->value() + ((factor - 1) * scrollBar->pageStep()/2)));
}
}


getScrollArea method is a bit ugly and it rely on the widgets nesting to get scrollarea(3):



void AbstractWidget::getScrollArea()
{
m_scrollarea = (QScrollArea *)this->parent()->parent()->parent()->parent();
}


and finally this is the painting code of my DailyWidget(4):



DailyWidget::DailyWidget(QWidget *parent)
: AbstractWidget(parent),
m_timer(new QTimer(this))
{
m_view = AbstractWidget::DailyView;
m_scaleFactor = 1.0;
m_fontFactor = 12;
setSizePolicy(QSizePolicy::Expanding,QSizePolicy:: Expanding);
connect(m_timer, SIGNAL(timeout()), this, SLOT(slotUpdateHourHighlightLine()));
}

void DailyWidget::paintEvent(QPaintEvent *event)
{
QWidget::paintEvent(event);
QPainter m_painter(this);
m_painter.scale(m_scaleFactor,m_scaleFactor);
m_painter.setRenderHints(QPainter::Antialiasing|QP ainter::TextAntialiasing|QPainter::HighQualityAnti aliasing,true);
QSize s(997*m_scaleFactor,580*m_scaleFactor);
resize(s);
drawGrid(m_painter);
}

void DailyWidget::drawGrid(QPainter &painter)
{
const int linesNumber = 48;
QSize msize = size();
int width = msize.width();
int counter = 0;
qreal leftLine = 0.0;
qreal y = 0;//initialized with paddingtop
qreal gridSize = msize.height()/(qreal)linesNumber;
QTime time;
QFont textFont("Times New Roman",gridSize/2);
painter.setBrush(whiteBrush);
painter.setPen(blackPen);
painter.drawRect(0,0,width,msize.height());

painter.setFont(textFont);
m_eventRect = QRectF();
painter.setBrush(whiteBrush);
time.setHMS(counter+1,0,0);
QRectF textRect = painter.boundingRect(QRect(0,0,0,0),time.toString("hh:mm"));
leftLine = textRect.width()+10;
painter.setBrush(whiteBrush);
for(int i=counter;i<linesNumber;i++)
{
if(i%2==0)
{//hours:
painter.setPen(hourPen);
painter.drawLine(0,y,width,y);

time.setHMS(counter++,0,0);
painter.setPen(blackPen);
painter.drawText(5,y+textRect.height(),time.toStri ng("hh:mm"));
}else{//half hour:
painter.setPen(halfHourPen);
painter.drawLine(leftLine+10,y,width,y);
}
y += gridSize;
}
painter.setPen(hourPen);
painter.drawLine(0,y,width,y);

painter.setPen(redPen);
painter.drawLine(leftLine+10,0,leftLine+10,y);
m_eventRect.setX(0.0);
m_eventRect.setY(0.0);
m_eventRect.setWidth(width);
m_eventRect.setHeight(y);
QSize AdjustSize = this->size();
setMinimumSize(AdjustSize);
}


As explained above when I zoom in drawing is zoomed as well, but QScrollArea can't let user reach the end of chart.
I'm going to attach two images, respectively zoom out and zoom in.

Last note: I tried to do several test i.e. added and removed row 18 at (4), but the point is that I don't have any clue about where to look at.

Thanks all for any advice.
Alberto

96969697