![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
rcdimon |
![]()
Сообщение
#1
|
Студент ![]() Группа: Участник Сообщений: 69 Регистрация: 27.10.2009 Пользователь №: 1183 Спасибо сказали: 1 раз(а) Репутация: ![]() ![]() ![]() |
Всем привет. Хочу создать свой виджет, который бы рисовал графики и имел набор удобных методов для решения моих задач. К сожалению не удается сделать это самостоятельно, похэтому вынужден просить помощи.
Называл виджет MyGraph MyGraph.h
MyGraph.cpp
Теперь пытаюсь его использовать. MyGraph Graph1 = new MyGraph(ui.centralWidget); И все нормально, появляется график. Правда непонятных размеров и не понятно пока как менять эти размеры. Но это пока не столь важно. Я хочу разместить на форме несколько графиков. Для этого я создаю QBoxLayout
Кнопка появляется, а мой виджет нет. Почему? Может подскажите как сделать или хотя бы где почитать про создание своих виджетов. Заранее спасибо. |
|
|
![]() |
Litkevich Yuriy |
![]()
Сообщение
#2
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
почитай про создание собственных виджетов в документации Qt.
Когда наследуешся от QWidget, то ты должен создавать методы с помощью которых компоновщики будут узнавать желаемый размер виджета. См. sizeHint и т.п. В описании класса QWidget есть раздел Size Hints and Size Policies Вот ещё тема на форуме: Использование собственных виджетов. |
|
|
rcdimon |
![]()
Сообщение
#3
|
Студент ![]() Группа: Участник Сообщений: 69 Регистрация: 27.10.2009 Пользователь №: 1183 Спасибо сказали: 1 раз(а) Репутация: ![]() ![]() ![]() |
Я добавил к своему MyGraph sizeHint
Но ничего не изменилось. Может дело не в размере виджета, а в том, что родителя он найти не может? При создании MyGraph конструктор принимает родителя, которого передает в конструктов QwtPlot, в качестве его родителя. Если вызывать конструктор MyGraph без родителя, то и QwtPlot родителя иметь не будет. Написано, что QBoxLayout сам назначает виджетам, вложенным в них родилетя. Но вопрос как. Наверное для этого у виджета должен быть какой-то метод, а у моего MyGraph видимо этого метода нет. В результате QwtPlot не получает родителя и поэтомй не рисуется. Вот. |
|
|
Litkevich Yuriy |
![]()
Сообщение
#4
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
Наверное для этого у виджета должен быть какой-то метод, с помощью QWidget::setParent(), т.е. у базового класса он есть.Как ты используешь свой виджет, приведи код? И ещё, почему ты наследуешся от QWidget, если хочешь получит виджет на основе QWt? Примеры Qwt используют наследование от QwtPlot |
|
|
rcdimon |
![]()
Сообщение
#5
|
Студент ![]() Группа: Участник Сообщений: 69 Регистрация: 27.10.2009 Пользователь №: 1183 Спасибо сказали: 1 раз(а) Репутация: ![]() ![]() ![]() |
Так вот же, так и использую. Хочу заставить его оборажаться в лаяуте
Кнопка появляется, а мой виджет нет. Код виджета MyGraph также приведен в первом посте
Так у базового класса он есть. То есть мой MyGraph получает-таки родителя. Но вот QwtPlot, который в нем находится его не получает, я так думаю.
А вот это судя по всему хорошая мысль... Хотя не, я же не QwtPlot хочу получить. Я хочу получить такой виджет, в котором был бы QwtPlot и QwtPlotCurve. Чтобы у него были такие методы как, например, AddItem- дорисовывал бы в конец графика еще одну точку. Импорт и экспорт данных. А все рисование лежало бы на нем. |
|
|
Litkevich Yuriy |
![]()
Сообщение
#6
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
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 |
![]()
Сообщение
#7
|
Студент ![]() Группа: Участник Сообщений: 69 Регистрация: 27.10.2009 Пользователь №: 1183 Спасибо сказали: 1 раз(а) Репутация: ![]() ![]() ![]() |
Хм.. нет не ругается. Я создаю экземпляр класса MyGraph. Объект
|
|
|
Litkevich Yuriy |
![]()
Сообщение
#8
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
rcdimon |
![]()
Сообщение
#9
|
Студент ![]() Группа: Участник Сообщений: 69 Регистрация: 27.10.2009 Пользователь №: 1183 Спасибо сказали: 1 раз(а) Репутация: ![]() ![]() ![]() |
Пытаюсь создать класс на основе 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 |
![]()
Сообщение
#10
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
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> |
|
|
BRE |
![]()
Сообщение
#11
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: ![]() ![]() ![]() |
MyGraph * Graph1 = new MyGraph(ui.centralWidget);
|
|
|
rcdimon |
![]()
Сообщение
#12
|
Студент ![]() Группа: Участник Сообщений: 69 Регистрация: 27.10.2009 Пользователь №: 1183 Спасибо сказали: 1 раз(а) Репутация: ![]() ![]() ![]() |
Нет Это не в main. Я создал в Visual Studio новый проект с QT. Там уже был код и на его базе. Лучше не делать? Вот что получилось вообще вцелом
main.cpp
a1392.h
a1392.cpp
MyGraph.cpp
MyGraph.h
Исправил #include <QPainter> Исправил MyGraph * Graph1 = new MyGraph(ui.centralWidget); Ничего не изменилось ( |
|
|
BRE |
![]()
Сообщение
#13
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: ![]() ![]() ![]() |
Проект не линкуется?
Похоже moc не подхватил один из файлов. Сделай еще раз для проекта: qmake |
|
|
rcdimon |
![]()
Сообщение
#14
|
Студент ![]() Группа: Участник Сообщений: 69 Регистрация: 27.10.2009 Пользователь №: 1183 Спасибо сказали: 1 раз(а) Репутация: ![]() ![]() ![]() |
Цитата Проект не линкуется? Похоже moc не подхватил один из файлов. Сделай еще раз для проекта: qmake Извиняюсь за глупый вопрос... Но как это сделать в Visual Studio? Нажимал очистить решение, перестроить решение, но результата не принесло. |
|
|
Litkevich Yuriy |
![]()
Сообщение
#15
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
rcdimon |
![]()
Сообщение
#16
|
Студент ![]() Группа: Участник Сообщений: 69 Регистрация: 27.10.2009 Пользователь №: 1183 Спасибо сказали: 1 раз(а) Репутация: ![]() ![]() ![]() |
Цитата тут вообще надобы так сделать: Я хочу на форме разместить 5 таких виджетов друг под другом. У моего устройства 5 датчиков и мне надо видеть данные с них одновременно и синхронизированно. Цитата а пёс его знает. Ну попробую сейчас создать новый проект. Добавлю в него тот же код, проверим. |
|
|
Litkevich Yuriy |
![]()
Сообщение
#17
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
Я хочу на форме разместить 5 таких виджетов друг под другом. создай виджет, создай 5 графиков (MyGraph), создай компоновщик, помести в компоновщик графики. Установи виджету компоновщик, установи виджет в качестве центрального (setCentralWidget) никаких родителей руками не нужно указыватьНу попробую сейчас создать новый проект. см. аргументы командной строки qmake, там можно создавать из pro-файла файл проекта для студии.
|
|
|
rcdimon |
![]()
Сообщение
#18
|
Студент ![]() Группа: Участник Сообщений: 69 Регистрация: 27.10.2009 Пользователь №: 1183 Спасибо сказали: 1 раз(а) Репутация: ![]() ![]() ![]() |
Цитата Ну попробую сейчас создать новый проект. Добавлю в него тот же код, проверим. Ничего не изменилось. Может что-то не так настроено, собрано, подключено? |
|
|
Litkevich Yuriy |
![]()
Сообщение
#19
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
rcdimon, у тебя примеры Qwt компилируются и работают?
|
|
|
rcdimon |
![]()
Сообщение
#20
|
Студент ![]() Группа: Участник Сообщений: 69 Регистрация: 27.10.2009 Пользователь №: 1183 Спасибо сказали: 1 раз(а) Репутация: ![]() ![]() ![]() |
Цитата rcdimon, у тебя примеры Qwt компилируются и работают? Да. И другая своя программа с использованием QWT тоже работает. Заметил, что если убрать Q_OBJECT и сделать так
То приложение запускается и на форме появляется график QWT. Но ведь Q_OBJECT не будут работать слоты и сигналы... Какой-то конфликт кароче у них |
|
|
Limney |
![]()
Сообщение
#21
|
Новичок Группа: Новичок Сообщений: 1 Регистрация: 7.12.2009 Пользователь №: 1286 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Надо добавить в файл проекта:
И будет всем счастье) |
|
|
azure |
![]()
Сообщение
#22
|
Студент ![]() Группа: Участник Сообщений: 60 Регистрация: 24.12.2009 Пользователь №: 1332 Спасибо сказали: 5 раз(а) Репутация: ![]() ![]() ![]() |
mainwindow.cpp
mainwindow.h
plot.с
plot.h
|
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 10.7.2025, 20:09 |