LINUX.ORG.RU

Qt4 и setViewportMargins


0

0

Допустим я установил для QAbstractScrollArea маргины, вижу серую рамку вокруг viewport-а. А как в этой области что-нибудь нарисовать???

anonymous

QPalette palette;
palette.setColor(m_itemsLWidget.viewport()->backgroundRole(), Qt::transparent);
widget.viewport()->setPalette(palette);

сдеалет вьюпорт прозрачным. Если нужно ченьть рисовать рисуй на widget.viewport()

vgudkov
()
Ответ на: комментарий от vgudkov

Честно говоря не совсем вас понял...

Вот есть код (на 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). Как теперь сделать так, что бы можно было нарисовать прямоугольник еше и в верхнем маргине?

anonymous
()
Ответ на: комментарий от anonymous

QAbstractScrollArea - комплексный виджет, состоящий минимум из фрейма, вьюпорта и скроллбаров. Размеры вьюпорта на фрейме задаются через setViewportMargins. Если нужно рисовать, за пределами вьюпорта, то можно попробовать рисовать на фрейме.

т.е. создавать еще и QPainter q(this), естетственно, того что находится под вьюпортом видно не будет, если не сделать его прозрачным.

vgudkov
()
Ответ на: комментарий от vgudkov

> т.е. создавать еще и QPainter q(this), естетственно, того что находится под вьюпортом видно не будет, если не сделать его прозрачным.

Вот проблема вся в том и заключается... Не понятно где использовать это самый QPainter q(this)! Если разместить QPainter q(this) в paintEvent то в консоле вылезает:

QPainter::begin: Widget painting can only begin as a result of a paintEvent

QPainter::end: Painter not active, aborted

и ни кого эффекта! Что делать не понимаю...

anonymous
()
Ответ на: комментарий от anonymous

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().

Т.е получается на фрейме рисовать нельзя. Но как вариант его можно сделать прозрачным и рисовать на виджете под ним.

vgudkov
()
Ответ на: комментарий от vgudkov

> 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-е продуман куда лучше, хотя все остальное в нем буэ-э-э-э.

anonymous
()

После долгих ковыряний в исходниках реализации 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++ врагу не пожелаешь!

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.