QT Невозможно добавить новый график (QCustomPlot) через контекстное меню

Я пытаюсь использовать контекстное меню, чтобы добавить новый график sub-axes к существующему виджету qcustomplot. Если я вызову свою функцию _addGraph в конструкторе класса, она будет работать, как и ожидалось. Но если я использую его как slot, график не добавляется к графику.

В отладке я вижу, что функция вызывается, и она работает как положено, но новый график не добавляется.

#pragma once
#include <QWidget>
#include <QVBoxLayout>
#include "qcustomplot.h"
#include "menu_NewGraph.h"

class w_SignalTab : public QWidget
{
  Q_OBJECT

private:
  struct t_Plot
  {
    QCPLayoutGrid* p_layout;
    QCPAxisRect *p_axisrect;
  };

public:
  w_SignalTab(unsigned int msg, unsigned int dev, QString name)
  {
    setLayout(&_wl);
    _cplot.plotLayout()->clear();
    _cplot.setContextMenuPolicy(Qt::CustomContextMenu);
    connect(&_cplot, SIGNAL(customContextMenuRequested(QPoint)), 
            this, SLOT(_contextMenuRequest(QPoint)));
    _wl.addWidget(&_cplot);

    setContextMenuPolicy(Qt::CustomContextMenu);
    connect(this, SIGNAL(customContextMenuRequested(QPoint)), 
            this, SLOT(_contextMenuRequest(QPoint)));

    //!!! this slot is not work
    connect(&_menuNewGraph, SIGNAL(addGraph(QString, int, int)), 
            this, SLOT(_addGraph(QString, int, int)));

    _addGraph(" ", 0, 0);   // this works fine
};

~w_SignalTab(){};

private slots:
  void _contextMenuRequest(QPoint pos)
  {
    QWidget* obj_sender = qobject_cast<QWidget*>(sender());
    QMenu menu;
    menu.addAction("Add Plot", this, SLOT(_addGraphMenu()));
    menu.exec(obj_sender->mapToGlobal(pos));
  };

  void _addGraphMenu() 
  { 
    _menuNewGraph.show(); 
  }

  // this work only in constructor
  void _addGraph(QString name, int bits_from, int bits_to)
  {
    t_Plot pl;
    pl.p_layout = new QCPLayoutGrid;
    pl.p_axisrect = new QCPAxisRect(&_cplot/*, false*/);
    pl.p_layout->addElement(0, 0, pl.p_axisrect);
    _cplot.plotLayout()->addElement(_plots.count(), 0, pl.p_layout);
    _plots.append(pl);
  }

private:
  QVBoxLayout _wl;
  QCustomPlot _cplot;
  menu_NewGraph _menuNewGraph;
  QList < t_Plot > _plots;
};

Что происходит не так?


person Andrey Lifar    schedule 29.06.2018    source источник
comment
что такое _menuNewGraph?   -  person eyllanesc    schedule 29.06.2018
comment
Это класс QDialog, имеет сигнал addGraph (имя QString, int bits_from, int bits_to)   -  person Andrey Lifar    schedule 29.06.2018
comment
Очевидно, неправильно работает сигнал, а не слот. _menuNewGraph не было присвоено значение из этого кода. Думаю, именно поэтому его СИГНАЛ не работал. И, может быть, было бы полезно предоставить некоторую трассировку стека.   -  person Shihe Zhang    schedule 29.06.2018
comment
Как я пишу в вопросе, сигнал работал. Я ставлю точку останова, и программа останавливается на ней.   -  person Andrey Lifar    schedule 29.06.2018


Ответы (1)


Графики есть, вы можете проверить, изменив размер виджета, чтобы они были видны без необходимости, поэтому вы должны вызвать replot().

void _addGraph(const QString & name, int bits_from, int bits_to)
{
    t_Plot pl;
    pl.p_layout = new QCPLayoutGrid;
    pl.p_axisrect = new QCPAxisRect(&_cplot/*, false*/);
    pl.p_layout->addElement(0, 0, pl.p_axisrect);
    _cplot.plotLayout()->addElement(_plots.count(), 0, pl.p_layout);
    _plots.append(pl);
    _cplot.replot(); // <---
}
person eyllanesc    schedule 29.06.2018