0

我有一个带 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 = new TimeGraph(ui->graphicsView_graph_o2, 120);

当 graphicsView 被调整大小时,我会调整自己的图形大小。我该怎么办?

4

3 回答 3

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 的表单插入您喜欢的位置

于 2013-04-16T10:03:03.557 回答
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 = new TimeGraph(120);

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

如果我测试第二种方法

类时间图 {...}

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

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

graph_O2 = new TimeGraph(ui->widget_graph_four, 120);

图表不随框架调整大小。

我忘记了什么?

于 2013-04-16T11:58:03.300 回答
0

真的必须将 qwt plot 放在 qgraphicsview 之上吗?我有一段时间没有使用 Qwt,但是 AFAIK 所有的绘制都是在paintEvent 中使用直接绘制完成的。(这是它如此之快的原因之一)。在 QGraphicsView 上使用 Qwt 控件的最正确方法(由我决定)是添加带有忽略转换标志的小部件项。关于调整大小,如果您将 Qwt 放在常用小部件中,它将自行处理所有调整大小。如果您有一些具有自定义调整大小的复杂结构,您应该在父小部件上处理调整大小事件,如果父类不可用,则通过 eventFilter 处理。

于 2013-04-16T09:19:29.867 回答