Можно ли использовать QCustomPlot в модульном тестировании?
Мне нужно создать семейство графиков во время тестирования моей программы. Я хочу использовать QCustomPlot
для таких целей, но у меня есть проблема. Для создания и сохранения моего графика в файле, я должен создать QApplication
после того, как мне нужно переопределить мой класс от QMainWindow
и после этого я могу использовать свой QCustomPlot
в функции, которая создает все необходимые графики и сохраняет их в файл. Можно ли избежать создания QApplication
экземпляр или QMainWindow
экземпляр или их обоих?
Смотрите код моей функции ниже:
void MainWindow::print_image(std::vector<double> az, std::vector<double> el, std::vector<double> za, char *image_path){
QVector<double> azFunct;// =// QVector<double>::fromStdVector(az);
QVector<double> elFunct;// =// QVector<double>::fromStdVector(el);
QVector<double> zFunct = QVector<double>::fromStdVector(za);
QVector<double> xAxisValue(az.size());
//Filling axes of x with values
std::iota(xAxisValue.begin(),xAxisValue.end(),0);
QCustomPlot customPlot;
customPlot.setLocale(QLocale(QLocale::English, QLocale::UnitedKingdom)); // period as decimal separator and comma as thousand separator
customPlot.legend->setVisible(true);
QFont legendFont = font(); // start out with MainWindow's font..
legendFont.setPointSize(9); // and make a bit smaller for legend
customPlot.legend->setFont(legendFont);
customPlot.legend->setBrush(QBrush(QColor(255,255,255,230)));
// by default, the legend is in the inset layout of the main axis rect. So this is how we access it to change legend placement:
customPlot.axisRect()->insetLayout()->setInsetAlignment(0, Qt::AlignTop|Qt::AlignRight);
//Adding new graph for displaying, all on the same plot.
customPlot.addGraph(customPlot.yAxis, customPlot.xAxis);
customPlot.graph(0)->setPen(QPen(QColor(255, 100, 0)));
customPlot.graph(0)->setName("Azimuth function");
//Adding new graph for displaying, all on the same plot.
customPlot.addGraph();
customPlot.graph(1)->setPen(QPen(Qt::red));
customPlot.graph(1)->setName("Elevation function");
//Adding new graph for displaying, all on the same plot.
customPlot.addGraph();
customPlot.graph(2)->setPen(QPen(Qt::green));
customPlot.graph(2)->setName("Z-axis function");
for(int i = 0; i < az.size(); ++i){
azFunct[i] = sin(az[i]*M_PI/180);
elFunct[i] = cos(el[i]*M_PI/180);
}
double minZ = *std::min_element(zFunct.constBegin(), zFunct.constEnd());
double maxZ = *std::max_element(zFunct.constBegin(), zFunct.constEnd());
// pass data points to graphs:
customPlot.graph(0)->setData(xAxisValue, azFunct);
customPlot.graph(1)->setData(xAxisValue, elFunct);
customPlot.graph(2)->setData(xAxisValue,zFunct);
customPlot.xAxis->setVisible(true);
customPlot.xAxis->setTickLabels(false);
customPlot.xAxis2->setVisible(true);
customPlot.xAxis2->setTickLabels(false);
customPlot.yAxis2->setVisible(true);
// set ranges appropriate to show data:
customPlot.yAxis->setRange(-1, 1);
customPlot.yAxis2->setRange(minZ, maxZ);
customPlot.plotLayout()->insertRow(0);
//customPlot.plotLayout()->addElement(0, 0, new QCPTextElement(customPlot, "Z axis", QFont("sans", 12, QFont::Bold)));
// set labels:
customPlot.yAxis->setLabel("sin/cos value");
customPlot.yAxis2->setLabel("Z - axis");
//Under big question have to be tested!
customPlot.replot();
customPlot.savePng(QString(image_path),1500,500,1);}
1 ответ
Конечно, вам не нужно QMainWindow
Вы можете создать экземпляр QCustomPlot
экземпляр сам по себе, а не как подвиджет чего-либо еще. Кроме того, вам не нужно показывать этот виджет, чтобы иметь его сюжет. Таким образом, тесты могут быть неинтерактивными, даже если они создаются QApplication
,
Конечно, дизайн QCustomPlot
сломано; нет необходимости быть QWidget
, Только определенный вид графика должен быть виджетом. Но это другая история.