Честно говоря не совсем вас понял...
Вот есть код (на Java через Jambi, но не суть важно):
public class Scroll extends QAbstractScrollArea {
public Scroll(QWidget p) {
super(p);
setViewportMargins(0, 20, 0, 0);
}
protected void paintEvent(QPaintEvent arg) {
QPainter q = new QPainter();
q.begin(viewport());
q.drawRect(0, 0, 100, 100);
q.end();
}
}
Рисует в viewport прямоугольник (0,0,100,100). Как теперь сделать так, что бы можно было нарисовать прямоугольник еше и в верхнем маргине?
QAbstractScrollArea - комплексный виджет, состоящий минимум из фрейма, вьюпорта и скроллбаров. Размеры вьюпорта на фрейме задаются через setViewportMargins. Если нужно рисовать, за пределами вьюпорта, то можно попробовать рисовать на фрейме.
т.е. создавать еще и QPainter q(this), естетственно, того что находится под вьюпортом видно не будет, если не сделать его прозрачным.
> т.е. создавать еще и QPainter q(this), естетственно, того что находится под вьюпортом видно не будет, если не сделать его прозрачным.
Вот проблема вся в том и заключается... Не понятно где использовать это самый QPainter q(this)! Если разместить QPainter q(this) в paintEvent то в консоле вылезает:
QPainter::begin: Widget painting can only begin as a result of a paintEvent
void QAbstractScrollArea::paintEvent ( QPaintEvent * event ) [virtual protected] This event handler can be reimplemented in a subclass to receive paint events (passed in event), for the viewport() widget. Note: If you open a painter, make sure to open it on the viewport().
Т.е получается на фрейме рисовать нельзя. Но как вариант его можно сделать прозрачным и рисовать на виджете под ним.
> void QAbstractScrollArea::paintEvent ( QPaintEvent * event ) [virtual protected] This event handler can be reimplemented in a subclass to receive paint events (passed in event), for the viewport() widget. Note: If you open a painter, make sure to open it on the viewport().
Это я знаю. :)))
> Т.е получается на фрейме рисовать нельзя. Но как вариант его можно сделать прозрачным и рисовать на виджете под ним.
Ы-ы? Под самим QAbstractScrollArea? Да уж, перанальней решение сложно придумать... Короче говоря придется забыть про маргины и рисовать все вместе, с помощью мата...
Это момент в swing-е продуман куда лучше, хотя все остальное в нем буэ-э-э-э.
После долгих ковыряний в исходниках реализации QTableView пришел к выводу, что это должно делаться примерно так:
public class Scroll extends QAbstractScrollArea {
protected final int m = 20;
protected Header h;
public Scroll(QWidget p) {
super(p);
h = new Header(this);
setViewportMargins(0, m, 0, 0);
}
protected void resizeEvent(QResizeEvent arg__1) {
QRect hg = viewport().geometry();
h.setGeometry(hg.topLeft().x(), hg.topLeft().y()-m, hg.width(), m);
}
protected void paintEvent(QPaintEvent arg) {
QPainter q = new QPainter();
q.begin(viewport());
q.drawRect(0, 0, 100, 100);
q.end();
}
}
public class Header extends QWidget {
Header(QWidget p) {
super(p);
}
protected void paintEvent(QPaintEvent e) {
QPainter q = new QPainter();
q.begin(this);
q.drawRect(0, 0, 1000, 1000);
q.end();
}
}
Блин, хотя бы троллтехи пример простой какой бы выложили... Курить код на C++ врагу не пожелаешь!