по ходу действительно так.
вот что про это говорит assistant:
paintEvent() is called whenever the widget needs to be repainted. Every widget displaying custom content must implement it. Painting using a QPainter can only take place in a paintEvent() or a function called by a paintEvent().
Кроме того, что его необходимо вызывать, нужно еще и свой класс писать, наследовать его и параметры для рисования туда передавать и процедуру переписывать.
Короче - одна морока.
Вобщем мое мнение о Qt резко упало на пару пунктов.
P.S. Честно говоря удивило, что все так сложно. Может быть кто-нибудь подскажет, для чего такие танцы с музыкальными инструментами были придуманны. Можно ведь оставить возможность для рисования на виджете в любобй момент и было бы все проще дышать.
> P.S. Честно говоря удивило, что все так сложно. Может быть кто-нибудь подскажет, для чего такие танцы с музыкальными инструментами были придуманны. Можно ведь оставить возможность для рисования на виджете в любобй момент и было бы все проще дышать.
А что нарисовать-то надо? Я почти уверен, что есть способ лучше, чем тот, который ты хочешь.
Вобщем такое дело.
В одном из классов я считаю значения по хитрым формулам.
Там данные хранятся в массиве. Причем каждый элемент в массиве - это структура (например 3 координаты, если по быстрому), ну а индексы массива - это время. В итоге мне нужно нарисовать графики зависимости каждой переменной от времени.
Возможно для этого и есть какие-то специальные виджеты, но я в эту сторону не копал. Плюс каждая координата хранится не в отдельном массиве (уже так и будет, т.к. много кода уже написанно для этого определения), а как часть структуры.
В итоге я для каждой переменной переганяю ее значения за весь период в отдельный массив и потом скармливаю своему классу, который унаследован от QWidget. В нем все эти данные переносятся во внутренние структуры класса, ну а потом запускается repaint, ну а дальше в paintEvent я графики спокойненько отрисовываю.
Вобщем сложно как-то. И, лично на мой взгляд - через жоп^W неверные методы.
Если у кого-то есть мысли как зделать это лучше - с удовольствием выслушаю.
> Вобщем мое мнение о Qt резко упало на пару пунктов.
Добро пожаловать в реальную жизнь. Если ты хочешь реализовать виджет со своим поведением отличным от базовых виджетов - то тебе придется это делать. Просто разберешся с базовыми концепциями, почитаешь ис ходники нескольких виджетов - и не будешь парится. Если конечно тебе надо писать GUI и не хочешь быдлокодить всю жизнь.
И не стоит боятся писать свои классы - это обычное дело, если посмотришь в примеры - или иначе стоит всерьез посмотреть на GTK или другие языки которые не C++ - там-то уж точно никакое наследование тебе не грозит ;)
Не нужно велосипедить рисование графиков прямо на виджете. Используйте QGraphicsScene+QGraphicsView.
Кроме того не разумно хранить данные в одних массивах, перегонять их в другие и затем только рисовать. Если данных много, а графики динамические, рискуете погореть на нехватке памяти и тормозах при ее вытягивании из сусек.
Проблем то со своими виджетами, унаследованными от QWidget, не возникает. Просто на это приходится тратить хоть и не так много, но времени.
Когда проводил рефакторинг кода, решил в старом все же разбить один массив со структурами на несколько массивов. Так что теперь от перегонки туда-сюда удалось избавится.
За ссылки на библиотеки - спасибо. Если будет время - обязательно гляну. Просто завтра все это уже нужно будет на конференции демнострировать, а я решил новых фишек понавешивать.
у тебя данные обновляются в бэкграунде?
1) да: повесить таймер на update никак?
2) нет: тебе, кроме paintEvent ничего не нужно! он вызывается, когда окно действительно необходимо перерисовать (разворачивание, выход на первый план). если же само окно поверх остальных - paintEvent не будет вызываться, что и правильно! нефиг проц лишними задачами грузить.