Как изменить размер виджета дока, чтобы он соответствовал виджету qCustomPlot? - PullRequest
0 голосов
/ 19 июня 2019

qDockWidget, содержащий qCustomPlot, всегда начинается с нулевой высоты.Я могу перехватить событие изменения размера qDockWidget и изменить геометрию 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.Док с центральным виджетом и QDockWidget с qCustomPlot.Я использую скомпилированную версию DLL qCustomPlot

Изображение: док начинается с нулевой высоты:

enter image description here

Изначально док выглядит так,Сюжет скрыт, и док не претендует на высоту в другом пустом макете.

Изображение: док растянут, чтобы показать сюжет

enter image description here

График виден, когда пользователь растягивает док.

Я сильно подозреваю, что есть возможность для док-станции автоматически настроить высоту qCustomPlot.Я могу установить высоту дока из кода, но это похоже на взлом.

1 Ответ

0 голосов
/ 20 июня 2019

Наиболее прямым подходом к решению вашей проблемы может быть определение минимального размера для вашего виджета 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());
...