如何调整Qt Dock小部件的大小以适合qCustomPlot小部件?

时间:2019-06-19 12:18:09

标签: qt qcustomplot

包含qCustomPlot的qDockWidget始终以零高度开始。我能够捕获qDockWidget调整大小事件并使用these answers更改qCustomPlot几何形状,但是qCustomPlot始终是隐藏的,直到手动拉伸它为止。这应该自动发生吗,还是我需要在启动时计算并设置底座高度?

此示例代码创建一个新的qCustomPlot小部件,将其放置在布局中,将该布局放置在另一个小部件中,并将其设置到停靠区。我还尝试过将qCustomPlot小部件直接放入扩展坞中。 qCustomPlot setGeometry,setMinimumSize和setSizePolicy似乎对扩展坞高度没有影响。

#include <QMainWindow>
#include "qcustomplot.h"


class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(){
        QCustomPlot *m_customPlot;
        QDockWidget *dock;

        resize(1200, 600);

        //create the plot
        QWidget *plot_frame_temp= new QWidget();
        plot_frame_temp->setSizePolicy(QSizePolicy::MinimumExpanding,QSizePolicy::MinimumExpanding);
        m_customPlot = new QCustomPlot(plot_frame_temp);
        m_customPlot->axisRect()->setupFullAxesBox(true);
        m_customPlot->setBackground(Qt::black);
        //size and margin settings
        m_customPlot->setGeometry(QRect(0, 0, 500, 400));
        m_customPlot->axisRect()->setMinimumSize(500,400);
        m_customPlot->axisRect()->setAutoMargins(QCP::msLeft|QCP::msBottom|QCP::msRight|QCP::msTop);
        // zoom and drag only on horrizontal axis
        m_customPlot->axisRect()->setRangeZoomAxes(m_customPlot->xAxis,nullptr);
        m_customPlot->axisRect()->setRangeDragAxes(m_customPlot->xAxis,nullptr);
        //setup the top axis and labels
        m_customPlot->xAxis->setVisible(false);
        m_customPlot->xAxis2->setVisible(true);
        m_customPlot->xAxis2->setTicks(true);
        m_customPlot->xAxis2->setTickLabels(true);
        m_customPlot->xAxis2->setTickPen(QColor(136, 136, 136));
        m_customPlot->xAxis2->setTickLength(0,10);
        m_customPlot->xAxis2->setTickLabelColor(QColor(136, 136, 136));
        m_customPlot->xAxis2->setSubTickPen(Qt::NoPen);
        m_customPlot->xAxis2->setBasePen(Qt::NoPen);
        QFont font;
        font.setStyleStrategy(QFont::PreferOutline);
        m_customPlot->xAxis2->setTickLabelFont(font);
        //setup the left axis and hide
        m_customPlot->yAxis->setVisible(false);
        m_customPlot->yAxis->setRangeReversed(true);
        m_customPlot->yAxis2->setVisible(false);
        //first graph
        m_customPlot->addGraph();
        m_customPlot->graph()->setPen(QPen(QColor(165, 165, 165)));
        m_customPlot->graph()->setLineStyle((QCPGraph::lsStepLeft));
        //second graph
        m_customPlot->addGraph();
        m_customPlot->graph()->setPen(QPen(QColor(165, 165, 165)));
        m_customPlot->graph()->setLineStyle((QCPGraph::lsStepLeft));
        // make some data
        QVector<double> x(500), y0(500), y1(500);
        for (int i=0; i<500; ++i)
        {
        x[i] = i;
        y0[i] = (rand() % 2 + 0.2)/2;
        y1[i] = (rand() % 2 + 1.4)/2;
        }
        //add data to graph
        m_customPlot->graph(0)->setData(x, y0);
        m_customPlot->graph(1)->setData(x, y1);
        // set some options
        m_customPlot->setNotAntialiasedElements(QCP::aeAll);
        m_customPlot->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom);

        //add plot widget to layout
        QHBoxLayout *laLayout = new  QHBoxLayout();
        laLayout->addWidget(plot_frame_temp);

        //add layout to another widget
        QWidget *laWidget=new QWidget();
        laWidget->setLayout(laLayout);

        //add second widget to dock
        dock = new QDockWidget(tr("qcustomplot"), this);
        dock->setAllowedAreas(Qt::TopDockWidgetArea | Qt::BottomDockWidgetArea);
        dock->setWidget(laWidget);

        addDockWidget(Qt::BottomDockWidgetArea, dock);

        QWidget *centralWidget=new QWidget();
        setCentralWidget(centralWidget);
    }

};

这是直接在mainwindow.h中完成的最小示例。带有中央小部件的底座和带有qCustomPlot的QDockWidget。我正在使用qCustomPlot的编译DLL版本

图片:基座从零高度开始:

enter image description here

最初,基座看起来像这样。该地块是隐藏的,而码头在其他空白布局中都没有占据任何高度。

图片:基座被拉伸以显示情节

enter image description here

当用户拉伸基座时,该图可见。

我强烈怀疑扩展坞有一种方法可以自动调整到qCustomPlot的高度。我可以通过代码设置停靠高度,但这似乎是一个hack。

1 个答案:

答案 0 :(得分:0)

解决问题的最直接方法可能是为QCustomPlot小部件定义最小大小。通过以下简化示例可以轻松实现。实际上,这些问题与QCustomPlot完全无关。可能是任何一种最小尺寸(0,0)的小部件。

#include <QMainWindow>
#include "qcustomplot.h"

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(){
        auto m_customPlot = new QCustomPlot();
        m_customPlot->axisRect()->setupFullAxesBox(true);

        auto dock = new QDockWidget(tr("qcustomplot"), this);
        dock->setAllowedAreas(Qt::TopDockWidgetArea | Qt::BottomDockWidgetArea);
        dock->setWidget(m_customPlot);
        m_customPlot->setMinimumSize(QSize(500,500));
        dock->setMinimumSize(m_customPlot->minimumSize());
        addDockWidget(Qt::DockWidgetArea::BottomDockWidgetArea, dock);

        setCentralWidget(new QWidget);
    }

};

一个更好的解决方案可能是保存并恢复注册表中的坞站窗口小部件配置的几何。这使用户仅拥有他认为理想的扩展窗口小部件配置。

void MainWindow::closeEvent(QCloseEvent *event)
{
    QSettings settings("MyCompany", "MyApp");
    settings.setValue("geometry", saveGeometry());
    QMainWindow::closeEvent(event);
}

QSettings settings("MyCompany", "MyApp");
dock->restoreGeometry(settings.value("myWidget/geometry").toByteArray());
相关问题