2013-04-16 3 views
0

У меня есть класс TimeGraph с qwtplot. Этот qwtplot отображается в QGraphicsView. qwtplot имеет метод изменения размера en resizeEvent, но я не понимаю, как их использовать.QwtPlot on QGraphicsView resize

TimeGraph::TimeGraph(QWidget* parent, int in_display_time, QwtText title) 
{ 
    display_time = in_display_time; 

    graph.setParent(parent); 
    graph.setFixedSize(parent->width() - 20, parent->height() - 20); 
    graph.move(QPoint(10, 10)); 

    grid.attach(&graph); 
    curve.attach(&graph); 
    curve.setPen(QPen(Qt::red, 2)); 
    curve.setRenderHint(QwtPlotItem::RenderAntialiased); 

    if (title.text() != NULL) 
     graph.setTitle(title); 

    graph.setAxisScaleDraw(QwtPlot::xBottom, new TimeScaleDraw(QDateTime(QDate(0, 0, 0), QTime(0, 0, 0, 0)))); 
    graph.setAxisScale(QwtPlot::xBottom, - display_time, 0); 
    graph.setAxisLabelRotation(QwtPlot::xBottom, -20.0); 
    graph.setAxisLabelAlignment(QwtPlot::xBottom, Qt::AlignLeft | Qt::AlignBottom); 

    graph.show(); 
} 

И заголовок

struct Data { QVector<double> x; QVector<double> y;}; 

class TimeGraph 
{ 
private : 
    QwtPlot graph; 
    QwtPlotCurve curve; 
    QwtPlotGrid grid; 
    Data data; 
    int display_time; 

public: 
    TimeGraph(QWidget* parent, int in_display_time, QwtText title = QwtText()); 
    void addPoint(QDateTime date, double y); 
    void resize(QRect zone); 
}; 

Я создаю мой график, как это:

graph_O2 = новый TimeGraph (ui-> graphicsView_graph_o2, 120);

Я бы изменил размер графика при изменении размера графика. Как я могу это сделать?

ответ

0

Действительно ли это должно быть положить qwt участок поверх qgraphicsview? Я не использовал Qwt какое-то время, но AFAIK все рисует, используя прямую краску в paintEvent. (это одна из причин, почему это так быстро). Самый правильный способ использования Qwt-элементов управления в QGraphicsView (до меня) заключается в добавлении элемента виджета с игнорированием флагов преобразования. И если вы измените размер, если вы поместите Qwt внутри обычного виджета, он будет обрабатывать все размеры самостоятельно. Если у вас есть сложная структура с пользовательским изменением размера, вы должны обрабатывать событие изменения размера в родительском виджете или через eventFilter, если родительский класс недоступен.

+0

Нет, график qwt действительно не должен быть на QGraphicsWiew. Но я не знаю, как это сделать. Мой qwt-график должен быть создан кодом, потому что plugin qwt для QtDesigner не работает с моей версией. Без QGraphicsView, как разместить мой участок в QGroupBox, где я хочу? – artoon

+0

Я сделал еще один ответ с образцом (см. Выше) – evilruff

+0

Хорошо, у меня есть мой TimeGraph в моем виджете. Теперь мой класс TimeGraph должен унаследовать QWidget? и переопределить paintEvent? – artoon

0

Лучший способ, который я бы порекомендовал, следующий - создать пользовательский интерфейс со всем, что вам нужно, кроме qwt control. Для управления qwt просто зарезервируйте пространство, используя Widget или Frame (по вашему вкусу). Вы можете установить все типы ограничений размера, которые вам нужны). Вы можете проверить это с помощью предварительного просмотра. Задайте имя виджета/фрейма тому, что вам нравится, скажем m_fmQwtPlotContainer. (что вы можете сделать в QtDesigner - objectName). то вы можете написать что-то вроде этого:

QWidget * pParent = findChild<QWidget*>("m_fmQwtPlotContainer"); 
QVBoxLayout * pLayout = new QVBoxLayout(pParent); 
pParent->setLayout(pLayout); 
..then your code using pParent as a parent for your widget.. 
TimeGraph * pGraph = new TimeGraph(pParent); 
pLayout->insertItem(pGraph);  

так что вы будете иметь свою форму с TimeGraph вставленного в понравившемся месте

+0

Хорошо, у меня есть мой TimeGraph в моем виджете. Теперь мой класс TimeGraph должен унаследовать QWidget? и переопределить paintEvent? – artoon

0

У меня есть тест два метода моего класса TimeGraph

класса TimeGraph : общественное QWidget {...}

и

TimeGraph :: TimeGraph (int in_display_time, QwtText title): QWidget() { display_time = in_display_time;

graph.setParent(this); 
//graph.setMaximumSize(parent->width() - 20, parent->height() - 20); 
graph.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); 

... }

с:

ui-> widget_graph_O2 = новый TimeGraph (120);

График не отображается, так как он не имеет размера.

И если я тестирую второй метод

класса TimeGraph {...}

и

TimeGraph :: TimeGraph (QWidget * родителю, внутр in_display_time, QwtText название) { display_time = in_display_time;

graph.setParent(parent); 
//graph.setMaximumSize(parent->width() - 20, parent->height() - 20); 
graph.setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); ... } 

с

graph_O2 = новый TimeGraph (ui-> widget_graph_four, 120);

График не изменяется с рамой.

Что я забыл?

+0

использовать метод 2) сменить graph.setParent (parent) -> graph.setParent (this) и добавить QWidget (parent) после конструктора. – evilruff

+0

Но мне нужно установить размер и policySize на моем TimeGraph и на мой виджет ui ? Потому что, когда я использую второй метод с вашими изменениями, ничего не отображается. Однако, если я не изменяю graph.setParent (parent), мой график отображается – artoon

+0

, но как вы добавляете свой виджет в форму? – evilruff