Russian Qt Forum
Ноябрь 28, 2024, 09:22 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QPainter:Internal error; no available GC  (Прочитано 7140 раз)
Germiona
Гость
« : Июнь 15, 2009, 10:38 »

Добрый день!

В QScrollView добавляю виджет, на котором производится рисование с помощью класса QPainter.
Размеры виджета изменяются пропорциально изменению размеров QScrollView. При запуске приложени все нормально, но при изменениях размеров окна появляется сообщение вида:
Код:
QPainter:Internal error; no available GC
С чем это может быть связано?
Записан
mugabe
Гость
« Ответ #1 : Июнь 15, 2009, 10:43 »

Исходники покажи, где происходит отрисовка.
Записан
Germiona
Гость
« Ответ #2 : Июнь 15, 2009, 11:36 »

Да даже отрисовка элементарного прямоугольника:

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

Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #3 : Июнь 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);
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Germiona
Гость
« Ответ #4 : Июнь 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());
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #5 : Июнь 15, 2009, 12:42 »

painter удаляется при выходе из Diagram::paintEvent?
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Germiona
Гость
« Ответ #6 : Июнь 15, 2009, 13:09 »

нет,это переменная класса.
Вся проблема в
Код:
painter->viewport()
?
Просто отрисовку диаграмм выполняют функции другого класса при передачи им объекта painter, также им необходимы значения ширины и высоты виджета,на котором рисуются диараммы. Мне казалось, painter->viewport() как раз и дает мне эти значения
Записан
Hellraiser
Бывалый
*****
Offline Offline

Сообщений: 451


Просмотр профиля
« Ответ #7 : Июнь 15, 2009, 18:54 »

Это сколько же паинтеров будет?
Цитировать
Код:
void Diagram::paintEvent(QPaintEvent *e)
{
QPainter *painter = new QPainter(this);
painter->setViewport(0,0,size().width(),size().height());
...
}
Как вариант - переопределить для виджета, на котором будет отрисовка resizeEvent( QResizeEvent *), где и узнавать размеры. Эти размеры можно хранить в членах класса. А паинтер там держать не надо - ресурсов не хватит при таком выделении. Об этом и говорит ошибка.
Записан
mugabe
Гость
« Ответ #8 : Июнь 16, 2009, 07:30 »

Germiona, давай весь код, телепаты в отпуске.

Тем более что ты уже дважды меняла показания Улыбающийся

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

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

Код
C++ (Qt)
void Diagram::paintEvent(QPaintEvent *e)
{
QPainter painter(this);
...
}
Записан
Germiona
Гость
« Ответ #9 : Июнь 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);
...
}
Ошибка все равно сохраняется... Грустный
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #10 : Июнь 16, 2009, 11:21 »

>>Паинтер создается один раз, в методе paintEvent()
А он там удаляется?
Или всякий раз, когда происходит событие рисования создаётся новый, а старый где-то  безсмысленно занимает память?

Записан

Юра.
spectre71
Гость
« Ответ #11 : Июнь 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();
...
 
}
 
Записан
BRE
Гость
« Ответ #12 : Июнь 16, 2009, 11:35 »

А где ты удаляешь его?
У тебя на каждый paintEvent создается новый QPainter а на старый указатель для тебя теряется!
В памяти плодится куча QPainter.
Мало того, что в памяти плодится куча объектов QPainter, так и занимаются графические контексты Иксов. После чего и начинаются сыпаться эти сообщения.
Записан
Germiona
Гость
« Ответ #13 : Июнь 16, 2009, 11:42 »

Да,точно....что-то я как-то упустила этот момент. Всем большое спасибо,проблема решена
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.128 секунд. Запросов: 23.