QGraphicsView上的QwtPlot调整大小

时间:2013-04-16 08:33:16

标签: qt qwt

我有一个带有qwtplot的TimeGraph类。 此qwtplot显示在QGraphicsView上。 qwtplot有方法resize en resizeEvent,但我不明白如何使用它们。

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);

当调整graphicsView的大小时,我的图形会自行调整大小。 我该怎么做?

3 个答案:

答案 0 :(得分:0)

是否真的必须将qwt图放在qgraphicsview之上?我没有使用Qwt一段时间,但是AFAIK所有它都是在paintEvent中使用直接涂料完成的。 (这是为什么它如此之快的原因之一)。在QGraphicsView上使用Qwt控件的最恰当方式(由我决定)是添加具有忽略转换标志的小部件项。 关于调整大小,如果你将Qwt放在通常的小部件中,它将自己正确地处理所有调整大小..如果你有一些复杂的结构与自定义大小调整你应该处理父小部件上的调整大小事件或通过eventFilter如果父类不可用。

答案 1 :(得分:0)

我建议遵循的最佳方式 - 使用除qwt控制之外的所有内容创建UI。对于qwt控件,只需使用Widget或Frame(根据您的口味)预留空间。您可以设置所需的所有类型的大小限制)。您可以从预览中进行检查。将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一起插入你喜欢的地方

答案 2 :(得分:0)

我测试了我的类TimeGraph的两种方法

  

class TimeGraph:public QWidget {...}

  

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

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

...   }

with:

  

ui-&gt; widget_graph_O2 = new TimeGraph(120);

图表未显示,因为它没有大小。

如果我测试第二种方法

  

类TimeGraph {...}

  

TimeGraph :: TimeGraph(QWidget * parent,int 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);

图表未使用框架调整大小。

我忘了什么?