Создание своего виджета, Освнованого на QWT |
Здравствуйте, гость ( Вход | Регистрация )
Создание своего виджета, Освнованого на QWT |
rcdimon |
1.11.2009, 16:29
Сообщение
#1
|
Студент Группа: Участник Сообщений: 69 Регистрация: 27.10.2009 Пользователь №: 1183 Спасибо сказали: 1 раз(а) Репутация: 0 |
Всем привет. Хочу создать свой виджет, который бы рисовал графики и имел набор удобных методов для решения моих задач. К сожалению не удается сделать это самостоятельно, похэтому вынужден просить помощи.
Называл виджет MyGraph MyGraph.h
MyGraph.cpp
Теперь пытаюсь его использовать. MyGraph Graph1 = new MyGraph(ui.centralWidget); И все нормально, появляется график. Правда непонятных размеров и не понятно пока как менять эти размеры. Но это пока не столь важно. Я хочу разместить на форме несколько графиков. Для этого я создаю QBoxLayout
Кнопка появляется, а мой виджет нет. Почему? Может подскажите как сделать или хотя бы где почитать про создание своих виджетов. Заранее спасибо. |
|
|
Litkevich Yuriy |
1.11.2009, 17:06
Сообщение
#2
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
почитай про создание собственных виджетов в документации Qt.
Когда наследуешся от QWidget, то ты должен создавать методы с помощью которых компоновщики будут узнавать желаемый размер виджета. См. sizeHint и т.п. В описании класса QWidget есть раздел Size Hints and Size Policies Вот ещё тема на форуме: Использование собственных виджетов. |
|
|
rcdimon |
1.11.2009, 17:20
Сообщение
#3
|
Студент Группа: Участник Сообщений: 69 Регистрация: 27.10.2009 Пользователь №: 1183 Спасибо сказали: 1 раз(а) Репутация: 0 |
Я добавил к своему MyGraph sizeHint
Но ничего не изменилось. Может дело не в размере виджета, а в том, что родителя он найти не может? При создании MyGraph конструктор принимает родителя, которого передает в конструктов QwtPlot, в качестве его родителя. Если вызывать конструктор MyGraph без родителя, то и QwtPlot родителя иметь не будет. Написано, что QBoxLayout сам назначает виджетам, вложенным в них родилетя. Но вопрос как. Наверное для этого у виджета должен быть какой-то метод, а у моего MyGraph видимо этого метода нет. В результате QwtPlot не получает родителя и поэтомй не рисуется. Вот. |
|
|
Litkevich Yuriy |
1.11.2009, 17:32
Сообщение
#4
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
Наверное для этого у виджета должен быть какой-то метод, с помощью QWidget::setParent(), т.е. у базового класса он есть.Как ты используешь свой виджет, приведи код? И ещё, почему ты наследуешся от QWidget, если хочешь получит виджет на основе QWt? Примеры Qwt используют наследование от QwtPlot |
|
|
rcdimon |
1.11.2009, 17:36
Сообщение
#5
|
Студент Группа: Участник Сообщений: 69 Регистрация: 27.10.2009 Пользователь №: 1183 Спасибо сказали: 1 раз(а) Репутация: 0 |
Так вот же, так и использую. Хочу заставить его оборажаться в лаяуте
Кнопка появляется, а мой виджет нет. Код виджета MyGraph также приведен в первом посте
Так у базового класса он есть. То есть мой MyGraph получает-таки родителя. Но вот QwtPlot, который в нем находится его не получает, я так думаю.
А вот это судя по всему хорошая мысль... Хотя не, я же не QwtPlot хочу получить. Я хочу получить такой виджет, в котором был бы QwtPlot и QwtPlotCurve. Чтобы у него были такие методы как, например, AddItem- дорисовывал бы в конец графика еще одну точку. Импорт и экспорт данных. А все рисование лежало бы на нем. |
|
|
Litkevich Yuriy |
1.11.2009, 17:37
Сообщение
#6
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
MyGraph Graph1 = new MyGraph(); я думаю этот код не должен компилироватся. Ты создаёшь объект и присваеваешь ему казатель на объект, который возвращается оператором new - компиллер должен ругатся.
QPushButton *B1 = new QPushButton("A"); MainLayout = new QBoxLayout(QBoxLayout::LeftToRight); MainLayout->addWidget(&Graph1, 1); MainLayout->addWidget(B1, 2); ui.centralWidget->setLayout(MainLayout); |
|
|
rcdimon |
1.11.2009, 17:39
Сообщение
#7
|
Студент Группа: Участник Сообщений: 69 Регистрация: 27.10.2009 Пользователь №: 1183 Спасибо сказали: 1 раз(а) Репутация: 0 |
Хм.. нет не ругается. Я создаю экземпляр класса MyGraph. Объект
|
|
|
Litkevich Yuriy |
1.11.2009, 17:40
Сообщение
#8
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
|
|
|
rcdimon |
1.11.2009, 18:46
Сообщение
#9
|
Студент Группа: Участник Сообщений: 69 Регистрация: 27.10.2009 Пользователь №: 1183 Спасибо сказали: 1 раз(а) Репутация: 0 |
Пытаюсь создать класс на основе QwtPlot
MyGraph.h
MyGraph.cpp
Использование
вылезает ошибка Цитата Компоновка... moc_MyGraph.obj : error LNK2001: неразрешенный внешний символ ""public: static struct QMetaObject const QwtPlot::staticMetaObject" (?staticMetaObject@QwtPlot@@2UQMetaObject@@" C:\Documents and Settings\rcdimon\Мои документы\Visual Studio 2008\Projects\A1392\Debug\A1392.exe : fatal error LNK1120: 1 неразрешенных внешних элементов Журнал построения был сохранен в "file://c:\Documents and Settings\rcdimon\Мои документы\Visual Studio 2008\Projects\A1392\A1392\Debug\BuildLog.htm" A1392 - ошибок 2, предупреждений 0 ========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ========== В чем проблема? Я честно говоря еще не слишком опытен в С++ ) |
|
|
Litkevich Yuriy |
1.11.2009, 19:21
Сообщение
#10
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
MyGraph Graph1 = new MyGraph(ui.centralWidget); где ты это пишешь, в функции main?#include <QtGui/QWidget> двойное включение, вообще старайся в *.h файлах как можно меньше инклюдов использовать.
#include <QPainter> #include <qwt_plot_canvas.h> #include <qwt_painter.h> #include <qpainter.h> #include <qwt_plot.h> #include <qwt_plot_curve.h> |
|
|
Текстовая версия | Сейчас: 27.12.2024, 23:35 |