Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: Germiona от Июнь 15, 2009, 10:38



Название: QPainter:Internal error; no available GC
Отправлено: Germiona от Июнь 15, 2009, 10:38
Добрый день!

В QScrollView добавляю виджет, на котором производится рисование с помощью класса QPainter.
Размеры виджета изменяются пропорциально изменению размеров QScrollView. При запуске приложени все нормально, но при изменениях размеров окна появляется сообщение вида:
Код:
QPainter:Internal error; no available GC
С чем это может быть связано?


Название: Re: QPainter:Internal error; no available GC
Отправлено: mugabe от Июнь 15, 2009, 10:43
Исходники покажи, где происходит отрисовка.


Название: Re: QPainter:Internal error; no available GC
Отправлено: Germiona от Июнь 15, 2009, 11:36
Да даже отрисовка элементарного прямоугольника:

Код:
QPainter *painter->drawRect(0,0,painter->viewport().width(),painter->viewport().height());



Название: Re: QPainter:Internal error; no available GC
Отправлено: pastor от Июнь 15, 2009, 12:23
Цитировать
QPainter *painter->drawRect(0,0,painter->viewport().width(),painter->viewport().height());

Ты не находишь эту строку странной? Где создается сам обїект QPainter? Должно быть что-то вроде:

Код
C++ (Qt)
QPainter painter(this);
painter.drawRect(0,0,some_width,some_height);


Название: Re: QPainter:Internal error; no available GC
Отправлено: Germiona от Июнь 15, 2009, 12:37
Это просто пример. Объект QPainter создается в методе QPaintEvent:
Код:
void Diagram::paintEvent(QPaintEvent *e)
{
QPainter *painter = new QPainter(this);
painter->setViewport(0,0,size().width(),size().height());
...
}

А прямоугольник должен покрыть весь виджет и зависит от его размеров, поэтому и:
Код:
painter->drawRect(0,0,painter->viewport().width(),painter->viewport().height());


Название: Re: QPainter:Internal error; no available GC
Отправлено: pastor от Июнь 15, 2009, 12:42
painter удаляется при выходе из Diagram::paintEvent?


Название: Re: QPainter:Internal error; no available GC
Отправлено: Germiona от Июнь 15, 2009, 13:09
нет,это переменная класса.
Вся проблема в
Код:
painter->viewport()
?
Просто отрисовку диаграмм выполняют функции другого класса при передачи им объекта painter, также им необходимы значения ширины и высоты виджета,на котором рисуются диараммы. Мне казалось, painter->viewport() как раз и дает мне эти значения


Название: Re: QPainter:Internal error; no available GC
Отправлено: Hellraiser от Июнь 15, 2009, 18:54
Это сколько же паинтеров будет?
Цитировать
Код:
void Diagram::paintEvent(QPaintEvent *e)
{
QPainter *painter = new QPainter(this);
painter->setViewport(0,0,size().width(),size().height());
...
}
Как вариант - переопределить для виджета, на котором будет отрисовка resizeEvent( QResizeEvent *), где и узнавать размеры. Эти размеры можно хранить в членах класса. А паинтер там держать не надо - ресурсов не хватит при таком выделении. Об этом и говорит ошибка.


Название: Re: QPainter:Internal error; no available GC
Отправлено: mugabe от Июнь 16, 2009, 07:30
Germiona, давай весь код, телепаты в отпуске.

Тем более что ты уже дважды меняла показания :)

То ты используешь painter из ниоткуда, то он создается в методе, а потом он оказывается уже член класса.

По сути, у тебя должно быть:

Код
C++ (Qt)
void Diagram::paintEvent(QPaintEvent *e)
{
QPainter painter(this);
...
}


Название: Re: QPainter:Internal error; no available GC
Отправлено: Germiona от Июнь 16, 2009, 10:54
Код слишком громоздкий, я не могу его привести.

Цитировать
А паинтер там держать не надо - ресурсов не хватит при таком выделении. Об этом и говорит ошибка

Почему ресурсов не хватит?? Паинтер создается один раз, в методе paintEvent()
Код:
class Diagram:public QWidget
{
...
public:
          QPainter *painter;
}

void Diagram::paintEvent(QPaintEvent *e)
{
...
painter = new QPainter(this);
...
}

Далее painter просто ипользуется функциями отрисовки диаграмм.
Каких ресурсов может не хватит?

К тому же сообщение "QPainter:Internal Error; no available GC" является просто предупреждением, программа работает корректно и все диаграммы отрисовываются как надо.

Убираю painter из переменных класса, создаю в методе paintEvent:
Код:
void Diagram::paintEvent(QPaintEvent *e)
{
QPainter *painter = new QPainter(this);
...
}
Ошибка все равно сохраняется... :(


Название: Re: QPainter:Internal error; no available GC
Отправлено: lit-uriy от Июнь 16, 2009, 11:21
>>Паинтер создается один раз, в методе paintEvent()
А он там удаляется?
Или всякий раз, когда происходит событие рисования создаётся новый, а старый где-то  безсмысленно занимает память?



Название: Re: QPainter:Internal error; no available GC
Отправлено: spectre71 от Июнь 16, 2009, 11:23
painter = new QPainter(this);
А где ты удаляешь его?
У тебя на каждый paintEvent создается новый QPainter а на старый указатель для тебя теряется!
В памяти плодится куча QPainter.

Сделай так:
Код
C++ (Qt)
class Diagram:public QWidget
{
...
public:
   QPainter painter;
}
 
void Diagram::paintEvent(QPaintEvent *e)
{
...
painter.begin(this);
...                
...
painter.end();
...
 
}
 


Название: Re: QPainter:Internal error; no available GC
Отправлено: BRE от Июнь 16, 2009, 11:35
А где ты удаляешь его?
У тебя на каждый paintEvent создается новый QPainter а на старый указатель для тебя теряется!
В памяти плодится куча QPainter.
Мало того, что в памяти плодится куча объектов QPainter, так и занимаются графические контексты Иксов. После чего и начинаются сыпаться эти сообщения.


Название: Re: QPainter:Internal error; no available GC
Отправлено: Germiona от Июнь 16, 2009, 11:42
Да,точно....что-то я как-то упустила этот момент. Всем большое спасибо,проблема решена