crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

3 страниц V   1 2 3 >  
Ответить в данную темуНачать новую тему
> Создание своего виджета, Освнованого на QWT
rcdimon
  опции профиля:
сообщение 1.11.2009, 16:29
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 69
Регистрация: 27.10.2009
Пользователь №: 1183

Спасибо сказали: 1 раз(а)




Репутация:   0  


Всем привет. Хочу создать свой виджет, который бы рисовал графики и имел набор удобных методов для решения моих задач. К сожалению не удается сделать это самостоятельно, похэтому вынужден просить помощи.

Называл виджет MyGraph

MyGraph.h
#ifndef MyGraph_H
#define MyGraph_H

#include <QtGui/QWidget>
#include <QPainter>
#include <qwt_plot_canvas.h>
#include <qwt_painter.h>
#include <qpainter.h>
#include <qwt_plot.h>
#include <qwt_plot_curve.h>

class MyGraph : public QWidget
{
    Q_OBJECT

public:
    MyGraph(QWidget *parent = 0, Qt::WFlags flags = 0);
    ~MyGraph();

    void Redraw(void);

private:
    QwtPlot *Plot;
    QwtPlotCurve *Curve;
    
};

#endif // MyGraph_H



MyGraph.cpp
#include "MyGraph.h"

MyGraph::MyGraph(QWidget *parent, Qt::WFlags flags)
    : QWidget(parent, flags)
{
    Plot = new QwtPlot(parent);

    // Disable polygon clipping
    QwtPainter::setDeviceClipping(false);

    // We don't need the cache here
    Plot->canvas()->setPaintAttribute(QwtPlotCanvas::PaintCached, false);

    // add curves
    Curve = new QwtPlotCurve("Curve 1");

    Curve->setPen(QPen(Qt::red));
    Curve->setStyle(QwtPlotCurve::Lines);
    
    // copy the data into the curves
    //Curve->setData(X1,Y1,Size);

    Curve->attach(Plot);

    // Axis
    Plot->setAxisTitle(QwtPlot::xBottom, "Time/seconds");
    Plot->setAxisScale(QwtPlot::xBottom, 50, 1024);
    Plot->setAxisTitle(QwtPlot::yLeft, "Values");
    Plot->setAxisScale(QwtPlot::yLeft, 50, 1024);

    Plot->replot();
}

MyGraph::~MyGraph()
{
    
}


void MyGraph::Redraw(void)
{
    Plot->replot();
}



Теперь пытаюсь его использовать.
MyGraph Graph1 = new MyGraph(ui.centralWidget);

И все нормально, появляется график. Правда непонятных размеров и не понятно пока как менять эти размеры. Но это пока не столь важно.

Я хочу разместить на форме несколько графиков. Для этого я создаю QBoxLayout

            MyGraph Graph1 = new MyGraph();
    QPushButton *B1 = new QPushButton("A");

    MainLayout = new QBoxLayout(QBoxLayout::LeftToRight);
    MainLayout->addWidget(&Graph1, 1);
    MainLayout->addWidget(B1, 2);
    ui.centralWidget->setLayout(MainLayout);


Кнопка появляется, а мой виджет нет. Почему? Может подскажите как сделать или хотя бы где почитать про создание своих виджетов. Заранее спасибо.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
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

QSize MyGraph::sizeHint(){
     return QSize(300,300);
}


Но ничего не изменилось. Может дело не в размере виджета, а в том, что родителя он найти не может? При создании MyGraph конструктор принимает родителя, которого передает в конструктов QwtPlot, в качестве его родителя. Если вызывать конструктор MyGraph без родителя, то и QwtPlot родителя иметь не будет.

Написано, что QBoxLayout сам назначает виджетам, вложенным в них родилетя. Но вопрос как. Наверное для этого у виджета должен быть какой-то метод, а у моего MyGraph видимо этого метода нет. В результате QwtPlot не получает родителя и поэтомй не рисуется. Вот.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 1.11.2009, 17:32
Сообщение #4


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(rcdimon @ 1.11.2009, 20:20) *
Наверное для этого у виджета должен быть какой-то метод,
с помощью QWidget::setParent(), т.е. у базового класса он есть.

Как ты используешь свой виджет, приведи код?

И ещё, почему ты наследуешся от QWidget, если хочешь получит виджет на основе QWt?
Примеры Qwt используют наследование от QwtPlot
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
rcdimon
  опции профиля:
сообщение 1.11.2009, 17:36
Сообщение #5


Студент
*

Группа: Участник
Сообщений: 69
Регистрация: 27.10.2009
Пользователь №: 1183

Спасибо сказали: 1 раз(а)




Репутация:   0  


Так вот же, так и использую. Хочу заставить его оборажаться в лаяуте

MyGraph Graph1 = new MyGraph();
    QPushButton *B1 = new QPushButton("A");

    MainLayout = new QBoxLayout(QBoxLayout::LeftToRight);
    MainLayout->addWidget(&Graph1, 1);
    MainLayout->addWidget(B1, 2);
    ui.centralWidget->setLayout(MainLayout);


Кнопка появляется, а мой виджет нет. Код виджета MyGraph также приведен в первом посте

с помощью QWidget::setParent(), т.е. у базового класса он есть.

Так у базового класса он есть. То есть мой MyGraph получает-таки родителя. Но вот QwtPlot, который в нем находится его не получает, я так думаю.

И ещё, почему ты наследуешся от QWidget, если хочешь получит виджет на основе QWt?
Примеры Qwt используют наследование от QwtPlot


А вот это судя по всему хорошая мысль...

Хотя не, я же не QwtPlot хочу получить. Я хочу получить такой виджет, в котором был бы QwtPlot и QwtPlotCurve. Чтобы у него были такие методы как, например, AddItem- дорисовывал бы в конец графика еще одну точку. Импорт и экспорт данных. А все рисование лежало бы на нем.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 1.11.2009, 17:37
Сообщение #6


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(rcdimon @ 1.11.2009, 19:29) *
MyGraph Graph1 = new MyGraph();
QPushButton *B1 = new QPushButton("A");

MainLayout = new QBoxLayout(QBoxLayout::LeftToRight);
MainLayout->addWidget(&Graph1, 1);
MainLayout->addWidget(B1, 2);
ui.centralWidget->setLayout(MainLayout);
я думаю этот код не должен компилироватся. Ты создаёшь объект и присваеваешь ему казатель на объект, который возвращается оператором new - компиллер должен ругатся.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
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, 20:36) *
Хотя не, я же не QwtPlot хочу получить. Я хочу получить такой виджет, в котором был бы QwtPlot и QwtPlotCurve.
посмотри пример cpuplot в нутри него создаются объекты QwtPlotCurve и другие
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
rcdimon
  опции профиля:
сообщение 1.11.2009, 18:46
Сообщение #9


Студент
*

Группа: Участник
Сообщений: 69
Регистрация: 27.10.2009
Пользователь №: 1183

Спасибо сказали: 1 раз(а)




Репутация:   0  


Пытаюсь создать класс на основе QwtPlot

MyGraph.h
#ifndef MyGraph_H
#define MyGraph_H

#include <QtGui/QWidget>
#include <QPainter>
#include <qwt_plot_canvas.h>
#include <qwt_painter.h>
#include <qpainter.h>
#include <qwt_plot.h>
#include <qwt_plot_curve.h>

class MyGraph : public QwtPlot
{
    Q_OBJECT

public:
    MyGraph(QWidget *parent = 0);
    ~MyGraph();
    
private:
    
    
};

#endif // MyGraph_H


MyGraph.cpp
#include "MyGraph.h"

MyGraph::MyGraph(QWidget *parent)
    : QwtPlot(parent)
{
    
}

MyGraph::~MyGraph()
{
    
}


Использование
MyGraph Graph1 = new MyGraph(ui.centralWidget);


вылезает ошибка
Цитата
Компоновка...
moc_MyGraph.obj : error LNK2001: неразрешенный внешний символ ""public: static struct QMetaObject const QwtPlot::staticMetaObject" (?staticMetaObject@QwtPlot@@2UQMetaObject@@B)"
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  


Цитата(rcdimon @ 1.11.2009, 21:46) *
MyGraph Graph1 = new MyGraph(ui.centralWidget);
где ты это пишешь, в функции main?

Цитата(rcdimon @ 1.11.2009, 21:46) *
#include <QtGui/QWidget>
#include <QPainter>
#include <qwt_plot_canvas.h>
#include <qwt_painter.h>
#include <qpainter.h>
#include <qwt_plot.h>
#include <qwt_plot_curve.h>
двойное включение, вообще старайся в *.h файлах как можно меньше инклюдов использовать.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

3 страниц V   1 2 3 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 25.4.2024, 16:00