| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > рисование в MainWindow, ООП, MVC, архитектура App |
| Автор: Aurus 20.6.2012, 06:11 | ||||||
| Запутался с классами, кого откуда наследовать. Задача: загрузка данных в модель->расчитывается график-> отображается график; если данные поменялись-> пересчитать график->перерисовать график. Есть несколько классов: MyModel:QAbstractTableModel (с данными) myWindow:QMainWindow (рисование, отображение) - рисование надо убрать. Predict (расчёты графика из данных) Plot (пересчёт координат) - рисование надо добавить. Сейчас имею примерно следующее:
Всё хорошо,но перерисовать график в случае изменения данных в модели не имею. Подумал рисовать в классе Plot на QLabel(из класса myWindow). Попробывал создать QLabel в mywindow.ui, рисовать на нём в классе Plot, выводить label вклассе myWindow
К сожалению, мое решение заканчивается: The program has unexpectedly finished. (предположительно ошибка в классе Plot в строчке label->setPixmap(*pm);) |
| Автор: math64 20.6.2012, 07:39 | ||||
| Посмотри itemviews/chart из примеров Qt, класс PieView - там по модели рисуется диагамма. Аналогично можно рисовать и график. Никакой Pixmap при изменении данных создавать не нужно - всё рисуется непосредственно в PieView::paintEvent(), в твоём случае
Добавлено через 12 минут и 49 секунд PS: в твоём коде главная ошибка - наследование Plot от Ui::myWindow - оно не даёт доступа к QLabel из mywindow.ui, а создаёт собственную неинициализированную QLabel. Ui::myWindow должен использоваться только в myWindow и лучше не наследовать myWindow от Ui::myWindow. а оставить Ui::myWindow* ui; как в настройках делается по умолчанию. При необходимости доступа к виджетам, созданным в дизайнере из других классов создаётся метод доступа:
|
| Автор: Aurus 21.6.2012, 08:01 | ||||
math64, спасибо за пример. Сижу теперь парюсь с QAbstractItemView, при наследовании надо переопределять 8 функций! сложно пока идёт с ними.
|
| Автор: math64 21.6.2012, 10:31 | ||
| visualRect() - оставить как PieView (вызывает itemRect() и учитывает полосы прокрутки) scrollTo(), moveCursor(), horizontalOffset(), verticalOffset(), isIndexHidden(), setSelection(), visualRegionForSelection() - также indexAt() - переписать самому. У меня для гистограммы:
|
| Автор: Aurus 21.6.2012, 12:21 | ||
даже hello не выводит, её кто-нибудь вызывает? или мне её надо вызывать в конструкторе самому когда надо? В документации написано, что функция indexAt(); возвращает индекс записи, расположенной в точке point, в модели. |
| Автор: math64 21.6.2012, 12:57 |
| indexAt() вызывается, например, из QAbstractItemView::mousePressedEvent() для определения куда пользоваетель нажал мышкой. Если тебе в Plot нужно только нарисовать график - можешь использовать свою реализацию, тогда нажатия мыши будут игнорироваться. |