LINUX.ORG.RU

QPainter* и головная боль


0

0

Запутался в классах QPainter*.
Я создаю 2 собственных виджета и добавляю их GridLayout. 1 выводится, 2 нет. Как создать 2 области рисования с отдельными логическими системами координат? 
Код в следующем посте.

#include <QApplication>
#include <QWidget>
#include <QGridLayout>
#include <QSlider>
#include <QPainter>
#include <QPaintEvent>

//============================================
class DraftWidget : public QWidget{
protected:
	virtual void paintEvent(QPaintEvent*);
	void drawFrame(QPainter* painter);
public:
	DraftWidget(QWidget* parent);
};

DraftWidget::DraftWidget(QWidget* parent)
	: QWidget(parent)
{
}

void DraftWidget::paintEvent(QPaintEvent* /*event*/)
{
	QPainter* painter = new QPainter(this);
	drawFrame(painter);
}

void DraftWidget::drawFrame(QPainter* painter) // рисует рамку для потомков DraftWidget
{
	painter->setWindow(-50,-50,101,101);
	painter->drawLine(-50,-50,50,-50);
	painter->drawLine(50,-50,50,50);
	painter->drawLine(50,50,-50,50);
	painter->drawLine(-50,50,-50,-50);
}

int main(int argc, char *argv[])
{
	QApplication app(argc, argv);
	QWidget* window = new QWidget(0);
	QGridLayout *mainbox = new QGridLayout(window);
	QSlider *spinx = new QSlider(Qt::Horizontal, window);
	QSlider *spiny = new QSlider(Qt::Horizontal, window);
	QSlider *spinz = new QSlider(Qt::Horizontal, window);
	DraftWidget *draft1 = new DraftWidget(window);
	DraftWidget *draft2 = new DraftWidget(window);
	draft1->setMinimumSize(200,200);
	draft2->setMinimumSize(200,200);
	mainbox->addWidget(draft1,0,0,2,2);
	mainbox->addWidget(draft2,0,2,2,2);
	mainbox->addWidget(spinx,2,0,1,4);
	mainbox->addWidget(spiny,3,0,1,4);
	mainbox->addWidget(spinz,4,0,1,4);
	window->show();	
	return app.exec();
} 

Brodobrey
() автор топика

Сам спрашиваю, сам отвечаю :) решилось следующим образом: void DraftWidget::paintEvent(QPaintEvent* /*event*/) { QPainter* painter = new QPainter(); drawFrame(painter); }

void DraftWidget::drawFrame(QPainter* painter) { painter->begin(this); painter->setWindow(-50,-50,101,101); painter->drawLine(-50,-50,50,-50); painter->drawLine(50,-50,50,50); painter->drawLine(50,50,-50,50); painter->drawLine(-50,50,-50,-50); painter->end(); }

Brodobrey
() автор топика

Сам спрашиваю, сам отвечаю :) 
решилось следующим образом:
void DraftWidget::paintEvent(QPaintEvent* /*event*/)
{
	QPainter* painter = new QPainter();
	drawFrame(painter);
}

void DraftWidget::drawFrame(QPainter* painter)
{
	painter->begin(this);
	painter->setWindow(-50,-50,101,101);
	painter->drawLine(-50,-50,50,-50);
	painter->drawLine(50,-50,50,50);
	painter->drawLine(50,50,-50,50);
	painter->drawLine(-50,50,-50,-50);
	painter->end();
}

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

delete painter Пушкин будет делать?

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

Блин, извиняюсь. Действительно delete надо делать или локально создать.

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