新增qcustomplot示例
|
@ -148,7 +148,12 @@
|
|||
![avatar](https://gitee.com/feiyangqingyun/QWidgetDemo/raw/master/third/0snap/shortcut.jpg)
|
||||
![avatar](https://gitee.com/feiyangqingyun/QWidgetDemo/raw/master/third/0snap/miniblink.jpg)
|
||||
![avatar](https://gitee.com/feiyangqingyun/QWidgetDemo/raw/master/third/0snap/qwtdemo.jpg)
|
||||
![avatar](https://gitee.com/feiyangqingyun/QWidgetDemo/raw/master/third/0snap/qcustomplotdemo.jpg)
|
||||
![avatar](https://gitee.com/feiyangqingyun/QWidgetDemo/raw/master/third/0snap/qcustomplotdemo1.jpg)
|
||||
![avatar](https://gitee.com/feiyangqingyun/QWidgetDemo/raw/master/third/0snap/qcustomplotdemo2.jpg)
|
||||
![avatar](https://gitee.com/feiyangqingyun/QWidgetDemo/raw/master/third/0snap/qcustomplotdemo3.jpg)
|
||||
![avatar](https://gitee.com/feiyangqingyun/QWidgetDemo/raw/master/third/0snap/qcustomplotdemo4.jpg)
|
||||
![avatar](https://gitee.com/feiyangqingyun/QWidgetDemo/raw/master/third/0snap/qcustomplotdemo5.jpg)
|
||||
![avatar](https://gitee.com/feiyangqingyun/QWidgetDemo/raw/master/third/0snap/qcustomplotdemo6.jpg)
|
||||
|
||||
##### 4.8、网友提供
|
||||
![avatar](https://gitee.com/feiyangqingyun/QWidgetDemo/raw/master/netfriend/0snap/astackwidget.jpg)
|
||||
|
|
After Width: | Height: | Size: 91 KiB |
After Width: | Height: | Size: 63 KiB |
After Width: | Height: | Size: 66 KiB |
After Width: | Height: | Size: 68 KiB |
After Width: | Height: | Size: 73 KiB |
|
@ -0,0 +1,7 @@
|
|||
greaterThan(QT_MAJOR_VERSION, 4): QT += printsupport
|
||||
|
||||
HEADERS += \
|
||||
$$PWD/qcustomplot.h
|
||||
|
||||
SOURCES += \
|
||||
$$PWD/qcustomplot.cpp
|
|
@ -0,0 +1,74 @@
|
|||
FORMS += \
|
||||
$$PWD/frmadvancedaxes.ui \
|
||||
$$PWD/frmbarchart.ui \
|
||||
$$PWD/frmcolormap.ui \
|
||||
$$PWD/frmdate.ui \
|
||||
$$PWD/frmfinancial.ui \
|
||||
$$PWD/frmitem.ui \
|
||||
$$PWD/frmlinestyle.ui \
|
||||
$$PWD/frmlogarithmic.ui \
|
||||
$$PWD/frmmain.ui \
|
||||
$$PWD/frmmultiaxis.ui \
|
||||
$$PWD/frmparametriccurve.ui \
|
||||
$$PWD/frmpolarplot.ui \
|
||||
$$PWD/frmquadratic.ui \
|
||||
$$PWD/frmrealtimedata.ui \
|
||||
$$PWD/frmscatterpixmap.ui \
|
||||
$$PWD/frmscatterstyle.ui \
|
||||
$$PWD/frmsimple.ui \
|
||||
$$PWD/frmsimpleitem.ui \
|
||||
$$PWD/frmsincscatter.ui \
|
||||
$$PWD/frmstatistical.ui \
|
||||
$$PWD/frmstyled.ui \
|
||||
$$PWD/frmtest.ui \
|
||||
$$PWD/frmtexturebrush.ui
|
||||
|
||||
HEADERS += \
|
||||
$$PWD/frmadvancedaxes.h \
|
||||
$$PWD/frmbarchart.h \
|
||||
$$PWD/frmcolormap.h \
|
||||
$$PWD/frmdate.h \
|
||||
$$PWD/frmfinancial.h \
|
||||
$$PWD/frmitem.h \
|
||||
$$PWD/frmlinestyle.h \
|
||||
$$PWD/frmlogarithmic.h \
|
||||
$$PWD/frmmain.h \
|
||||
$$PWD/frmmultiaxis.h \
|
||||
$$PWD/frmparametriccurve.h \
|
||||
$$PWD/frmpolarplot.h \
|
||||
$$PWD/frmquadratic.h \
|
||||
$$PWD/frmrealtimedata.h \
|
||||
$$PWD/frmscatterpixmap.h \
|
||||
$$PWD/frmscatterstyle.h \
|
||||
$$PWD/frmsimple.h \
|
||||
$$PWD/frmsimpleitem.h \
|
||||
$$PWD/frmsincscatter.h \
|
||||
$$PWD/frmstatistical.h \
|
||||
$$PWD/frmstyled.h \
|
||||
$$PWD/frmtest.h \
|
||||
$$PWD/frmtexturebrush.h
|
||||
|
||||
SOURCES += \
|
||||
$$PWD/frmadvancedaxes.cpp \
|
||||
$$PWD/frmbarchart.cpp \
|
||||
$$PWD/frmcolormap.cpp \
|
||||
$$PWD/frmdate.cpp \
|
||||
$$PWD/frmfinancial.cpp \
|
||||
$$PWD/frmitem.cpp \
|
||||
$$PWD/frmlinestyle.cpp \
|
||||
$$PWD/frmlogarithmic.cpp \
|
||||
$$PWD/frmmain.cpp \
|
||||
$$PWD/frmmultiaxis.cpp \
|
||||
$$PWD/frmparametriccurve.cpp \
|
||||
$$PWD/frmpolarplot.cpp \
|
||||
$$PWD/frmquadratic.cpp \
|
||||
$$PWD/frmrealtimedata.cpp \
|
||||
$$PWD/frmscatterpixmap.cpp \
|
||||
$$PWD/frmscatterstyle.cpp \
|
||||
$$PWD/frmsimple.cpp \
|
||||
$$PWD/frmsimpleitem.cpp \
|
||||
$$PWD/frmsincscatter.cpp \
|
||||
$$PWD/frmstatistical.cpp \
|
||||
$$PWD/frmstyled.cpp \
|
||||
$$PWD/frmtest.cpp \
|
||||
$$PWD/frmtexturebrush.cpp
|
|
@ -0,0 +1,112 @@
|
|||
#include "frmadvancedaxes.h"
|
||||
#include "ui_frmadvancedaxes.h"
|
||||
#include "qdebug.h"
|
||||
|
||||
frmAdvancedAxes::frmAdvancedAxes(QWidget *parent) : QWidget(parent), ui(new Ui::frmAdvancedAxes)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
this->initForm();
|
||||
}
|
||||
|
||||
frmAdvancedAxes::~frmAdvancedAxes()
|
||||
{
|
||||
delete ui;
|
||||
}
|
||||
|
||||
void frmAdvancedAxes::initForm()
|
||||
{
|
||||
// configure axis rect:
|
||||
ui->customPlot->plotLayout()->clear(); // clear default axis rect so we can start from scratch
|
||||
QCPAxisRect *wideAxisRect = new QCPAxisRect(ui->customPlot);
|
||||
wideAxisRect->setupFullAxesBox(true);
|
||||
wideAxisRect->axis(QCPAxis::atRight, 0)->setTickLabels(true);
|
||||
wideAxisRect->addAxis(QCPAxis::atLeft)->setTickLabelColor(QColor("#6050F8")); // add an extra axis on the left and color its numbers
|
||||
QCPLayoutGrid *subLayout = new QCPLayoutGrid;
|
||||
ui->customPlot->plotLayout()->addElement(0, 0, wideAxisRect); // insert axis rect in first row
|
||||
ui->customPlot->plotLayout()->addElement(1, 0, subLayout); // sub layout in second row (grid layout will grow accordingly)
|
||||
//ui->customPlot->plotLayout()->setRowStretchFactor(1, 2);
|
||||
// prepare axis rects that will be placed in the sublayout:
|
||||
QCPAxisRect *subRectLeft = new QCPAxisRect(ui->customPlot, false); // false means to not setup default axes
|
||||
QCPAxisRect *subRectRight = new QCPAxisRect(ui->customPlot, false);
|
||||
subLayout->addElement(0, 0, subRectLeft);
|
||||
subLayout->addElement(0, 1, subRectRight);
|
||||
subRectRight->setMaximumSize(100, 100); // make bottom right axis rect size fixed 100x100
|
||||
subRectRight->setMinimumSize(100, 100); // make bottom right axis rect size fixed 100x100
|
||||
// setup axes in sub layout axis rects:
|
||||
subRectLeft->addAxes(QCPAxis::atBottom | QCPAxis::atLeft);
|
||||
subRectRight->addAxes(QCPAxis::atBottom | QCPAxis::atRight);
|
||||
subRectLeft->axis(QCPAxis::atLeft)->ticker()->setTickCount(2);
|
||||
subRectRight->axis(QCPAxis::atRight)->ticker()->setTickCount(2);
|
||||
subRectRight->axis(QCPAxis::atBottom)->ticker()->setTickCount(2);
|
||||
subRectLeft->axis(QCPAxis::atBottom)->grid()->setVisible(true);
|
||||
// synchronize the left and right margins of the top and bottom axis rects:
|
||||
QCPMarginGroup *marginGroup = new QCPMarginGroup(ui->customPlot);
|
||||
subRectLeft->setMarginGroup(QCP::msLeft, marginGroup);
|
||||
subRectRight->setMarginGroup(QCP::msRight, marginGroup);
|
||||
wideAxisRect->setMarginGroup(QCP::msLeft | QCP::msRight, marginGroup);
|
||||
// move newly created axes on "axes" layer and grids on "grid" layer:
|
||||
foreach (QCPAxisRect *rect, ui->customPlot->axisRects()) {
|
||||
foreach (QCPAxis *axis, rect->axes()) {
|
||||
axis->setLayer("axes");
|
||||
axis->grid()->setLayer("grid");
|
||||
}
|
||||
}
|
||||
|
||||
// prepare data:
|
||||
QVector<QCPGraphData> dataCos(21), dataGauss(50), dataRandom(100);
|
||||
QVector<double> x3, y3;
|
||||
std::srand(3);
|
||||
for (int i = 0; i < dataCos.size(); ++i) {
|
||||
dataCos[i].key = i / (double)(dataCos.size() - 1) * 10 - 5.0;
|
||||
dataCos[i].value = qCos(dataCos[i].key);
|
||||
}
|
||||
for (int i = 0; i < dataGauss.size(); ++i) {
|
||||
dataGauss[i].key = i / (double)dataGauss.size() * 10 - 5.0;
|
||||
dataGauss[i].value = qExp(-dataGauss[i].key * dataGauss[i].key * 0.2) * 1000;
|
||||
}
|
||||
for (int i = 0; i < dataRandom.size(); ++i) {
|
||||
dataRandom[i].key = i / (double)dataRandom.size() * 10;
|
||||
dataRandom[i].value = std::rand() / (double)RAND_MAX - 0.5 + dataRandom[qMax(0, i - 1)].value;
|
||||
}
|
||||
x3 << 1 << 2 << 3 << 4;
|
||||
y3 << 2 << 2.5 << 4 << 1.5;
|
||||
|
||||
// create and configure plottables:
|
||||
QCPGraph *mainGraphCos = ui->customPlot->addGraph(wideAxisRect->axis(QCPAxis::atBottom), wideAxisRect->axis(QCPAxis::atLeft));
|
||||
mainGraphCos->data()->set(dataCos);
|
||||
mainGraphCos->valueAxis()->setRange(-1, 1);
|
||||
mainGraphCos->rescaleKeyAxis();
|
||||
mainGraphCos->setScatterStyle(QCPScatterStyle(QCPScatterStyle::ssCircle, QPen(Qt::black), QBrush(Qt::white), 6));
|
||||
mainGraphCos->setPen(QPen(QColor(120, 120, 120), 2));
|
||||
QCPGraph *mainGraphGauss = ui->customPlot->addGraph(wideAxisRect->axis(QCPAxis::atBottom), wideAxisRect->axis(QCPAxis::atLeft, 1));
|
||||
mainGraphGauss->data()->set(dataGauss);
|
||||
mainGraphGauss->setPen(QPen(QColor("#8070B8"), 2));
|
||||
mainGraphGauss->setBrush(QColor(110, 170, 110, 30));
|
||||
mainGraphCos->setChannelFillGraph(mainGraphGauss);
|
||||
mainGraphCos->setBrush(QColor(255, 161, 0, 50));
|
||||
mainGraphGauss->valueAxis()->setRange(0, 1000);
|
||||
mainGraphGauss->rescaleKeyAxis();
|
||||
|
||||
QCPGraph *subGraphRandom = ui->customPlot->addGraph(subRectLeft->axis(QCPAxis::atBottom), subRectLeft->axis(QCPAxis::atLeft));
|
||||
subGraphRandom->data()->set(dataRandom);
|
||||
subGraphRandom->setLineStyle(QCPGraph::lsImpulse);
|
||||
subGraphRandom->setPen(QPen(QColor("#FFA100"), 1.5));
|
||||
subGraphRandom->rescaleAxes();
|
||||
|
||||
QCPBars *subBars = new QCPBars(subRectRight->axis(QCPAxis::atBottom), subRectRight->axis(QCPAxis::atRight));
|
||||
subBars->setWidth(3 / (double)x3.size());
|
||||
subBars->setData(x3, y3);
|
||||
subBars->setPen(QPen(Qt::black));
|
||||
subBars->setAntialiased(false);
|
||||
subBars->setAntialiasedFill(false);
|
||||
subBars->setBrush(QColor("#705BE8"));
|
||||
subBars->keyAxis()->setSubTicks(false);
|
||||
subBars->rescaleAxes();
|
||||
// setup a ticker for subBars key axis that only gives integer ticks:
|
||||
QSharedPointer<QCPAxisTickerFixed> intTicker(new QCPAxisTickerFixed);
|
||||
intTicker->setTickStep(1.0);
|
||||
intTicker->setScaleStrategy(QCPAxisTickerFixed::ssMultiples);
|
||||
subBars->keyAxis()->setTicker(intTicker);
|
||||
|
||||
ui->customPlot->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom);
|
||||
}
|
|
@ -0,0 +1,25 @@
|
|||
#ifndef FRMADVANCEDAXES_H
|
||||
#define FRMADVANCEDAXES_H
|
||||
|
||||
#include <QWidget>
|
||||
|
||||
namespace Ui {
|
||||
class frmAdvancedAxes;
|
||||
}
|
||||
|
||||
class frmAdvancedAxes : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit frmAdvancedAxes(QWidget *parent = 0);
|
||||
~frmAdvancedAxes();
|
||||
|
||||
private:
|
||||
Ui::frmAdvancedAxes *ui;
|
||||
|
||||
private slots:
|
||||
void initForm();
|
||||
};
|
||||
|
||||
#endif // FRMADVANCEDAXES_H
|
|
@ -0,0 +1,44 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>frmAdvancedAxes</class>
|
||||
<widget class="QWidget" name="frmAdvancedAxes">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>400</width>
|
||||
<height>300</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Form</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QCustomPlot" name="customPlot" native="true"/>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
<class>QCustomPlot</class>
|
||||
<extends>QWidget</extends>
|
||||
<header location="global">qcustomplot.h</header>
|
||||
<container>1</container>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
|
@ -0,0 +1,99 @@
|
|||
#include "frmbarchart.h"
|
||||
#include "ui_frmbarchart.h"
|
||||
#include "qdebug.h"
|
||||
|
||||
frmBarChart::frmBarChart(QWidget *parent) : QWidget(parent), ui(new Ui::frmBarChart)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
this->initForm();
|
||||
}
|
||||
|
||||
frmBarChart::~frmBarChart()
|
||||
{
|
||||
delete ui;
|
||||
}
|
||||
|
||||
void frmBarChart::initForm()
|
||||
{
|
||||
// set dark background gradient:
|
||||
QLinearGradient gradient(0, 0, 0, 400);
|
||||
gradient.setColorAt(0, QColor(90, 90, 90));
|
||||
gradient.setColorAt(0.38, QColor(105, 105, 105));
|
||||
gradient.setColorAt(1, QColor(70, 70, 70));
|
||||
ui->customPlot->setBackground(QBrush(gradient));
|
||||
|
||||
// create empty bar chart objects:
|
||||
QCPBars *regen = new QCPBars(ui->customPlot->xAxis, ui->customPlot->yAxis);
|
||||
QCPBars *nuclear = new QCPBars(ui->customPlot->xAxis, ui->customPlot->yAxis);
|
||||
QCPBars *fossil = new QCPBars(ui->customPlot->xAxis, ui->customPlot->yAxis);
|
||||
regen->setAntialiased(false); // gives more crisp, pixel aligned bar borders
|
||||
nuclear->setAntialiased(false);
|
||||
fossil->setAntialiased(false);
|
||||
regen->setStackingGap(1);
|
||||
nuclear->setStackingGap(1);
|
||||
fossil->setStackingGap(1);
|
||||
// set names and colors:
|
||||
fossil->setName("Fossil fuels");
|
||||
fossil->setPen(QPen(QColor(111, 9, 176).lighter(170)));
|
||||
fossil->setBrush(QColor(111, 9, 176));
|
||||
nuclear->setName("Nuclear");
|
||||
nuclear->setPen(QPen(QColor(250, 170, 20).lighter(150)));
|
||||
nuclear->setBrush(QColor(250, 170, 20));
|
||||
regen->setName("Regenerative");
|
||||
regen->setPen(QPen(QColor(0, 168, 140).lighter(130)));
|
||||
regen->setBrush(QColor(0, 168, 140));
|
||||
// stack bars on top of each other:
|
||||
nuclear->moveAbove(fossil);
|
||||
regen->moveAbove(nuclear);
|
||||
|
||||
// prepare x axis with country labels:
|
||||
QVector<double> ticks;
|
||||
QVector<QString> labels;
|
||||
ticks << 1 << 2 << 3 << 4 << 5 << 6 << 7;
|
||||
labels << "USA" << "Japan" << "Germany" << "France" << "UK" << "Italy" << "Canada";
|
||||
QSharedPointer<QCPAxisTickerText> textTicker(new QCPAxisTickerText);
|
||||
textTicker->addTicks(ticks, labels);
|
||||
ui->customPlot->xAxis->setTicker(textTicker);
|
||||
ui->customPlot->xAxis->setTickLabelRotation(60);
|
||||
ui->customPlot->xAxis->setSubTicks(false);
|
||||
ui->customPlot->xAxis->setTickLength(0, 4);
|
||||
ui->customPlot->xAxis->setRange(0, 8);
|
||||
ui->customPlot->xAxis->setBasePen(QPen(Qt::white));
|
||||
ui->customPlot->xAxis->setTickPen(QPen(Qt::white));
|
||||
ui->customPlot->xAxis->grid()->setVisible(true);
|
||||
ui->customPlot->xAxis->grid()->setPen(QPen(QColor(130, 130, 130), 0, Qt::DotLine));
|
||||
ui->customPlot->xAxis->setTickLabelColor(Qt::white);
|
||||
ui->customPlot->xAxis->setLabelColor(Qt::white);
|
||||
|
||||
// prepare y axis:
|
||||
ui->customPlot->yAxis->setRange(0, 12.1);
|
||||
ui->customPlot->yAxis->setPadding(5); // a bit more space to the left border
|
||||
ui->customPlot->yAxis->setLabel("Power Consumption in\nKilowatts per Capita (2007)");
|
||||
ui->customPlot->yAxis->setBasePen(QPen(Qt::white));
|
||||
ui->customPlot->yAxis->setTickPen(QPen(Qt::white));
|
||||
ui->customPlot->yAxis->setSubTickPen(QPen(Qt::white));
|
||||
ui->customPlot->yAxis->grid()->setSubGridVisible(true);
|
||||
ui->customPlot->yAxis->setTickLabelColor(Qt::white);
|
||||
ui->customPlot->yAxis->setLabelColor(Qt::white);
|
||||
ui->customPlot->yAxis->grid()->setPen(QPen(QColor(130, 130, 130), 0, Qt::SolidLine));
|
||||
ui->customPlot->yAxis->grid()->setSubGridPen(QPen(QColor(130, 130, 130), 0, Qt::DotLine));
|
||||
|
||||
// Add data:
|
||||
QVector<double> fossilData, nuclearData, regenData;
|
||||
fossilData << 0.86 * 10.5 << 0.83 * 5.5 << 0.84 * 5.5 << 0.52 * 5.8 << 0.89 * 5.2 << 0.90 * 4.2 << 0.67 * 11.2;
|
||||
nuclearData << 0.08 * 10.5 << 0.12 * 5.5 << 0.12 * 5.5 << 0.40 * 5.8 << 0.09 * 5.2 << 0.00 * 4.2 << 0.07 * 11.2;
|
||||
regenData << 0.06 * 10.5 << 0.05 * 5.5 << 0.04 * 5.5 << 0.06 * 5.8 << 0.02 * 5.2 << 0.07 * 4.2 << 0.25 * 11.2;
|
||||
fossil->setData(ticks, fossilData);
|
||||
nuclear->setData(ticks, nuclearData);
|
||||
regen->setData(ticks, regenData);
|
||||
|
||||
// setup legend:
|
||||
ui->customPlot->legend->setVisible(true);
|
||||
ui->customPlot->axisRect()->insetLayout()->setInsetAlignment(0, Qt::AlignTop | Qt::AlignHCenter);
|
||||
ui->customPlot->legend->setBrush(QColor(255, 255, 255, 100));
|
||||
ui->customPlot->legend->setBorderPen(Qt::NoPen);
|
||||
QFont legendFont = font();
|
||||
legendFont.setPointSize(10);
|
||||
ui->customPlot->legend->setFont(legendFont);
|
||||
ui->customPlot->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom);
|
||||
}
|
|
@ -0,0 +1,25 @@
|
|||
#ifndef FRMBARCHART_H
|
||||
#define FRMBARCHART_H
|
||||
|
||||
#include <QWidget>
|
||||
|
||||
namespace Ui {
|
||||
class frmBarChart;
|
||||
}
|
||||
|
||||
class frmBarChart : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit frmBarChart(QWidget *parent = 0);
|
||||
~frmBarChart();
|
||||
|
||||
private:
|
||||
Ui::frmBarChart *ui;
|
||||
|
||||
private slots:
|
||||
void initForm();
|
||||
};
|
||||
|
||||
#endif // FRMBARCHART_H
|
|
@ -0,0 +1,44 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>frmBarChart</class>
|
||||
<widget class="QWidget" name="frmBarChart">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>400</width>
|
||||
<height>300</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Form</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QCustomPlot" name="customPlot" native="true"/>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
<class>QCustomPlot</class>
|
||||
<extends>QWidget</extends>
|
||||
<header location="global">qcustomplot.h</header>
|
||||
<container>1</container>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
|
@ -0,0 +1,63 @@
|
|||
#include "frmcolormap.h"
|
||||
#include "ui_frmcolormap.h"
|
||||
#include "qdebug.h"
|
||||
|
||||
frmColorMap::frmColorMap(QWidget *parent) : QWidget(parent), ui(new Ui::frmColorMap)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
this->initForm();
|
||||
}
|
||||
|
||||
frmColorMap::~frmColorMap()
|
||||
{
|
||||
delete ui;
|
||||
}
|
||||
|
||||
void frmColorMap::initForm()
|
||||
{
|
||||
// configure axis rect:
|
||||
ui->customPlot->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom); // this will also allow rescaling the color scale by dragging/zooming
|
||||
ui->customPlot->axisRect()->setupFullAxesBox(true);
|
||||
ui->customPlot->xAxis->setLabel("x");
|
||||
ui->customPlot->yAxis->setLabel("y");
|
||||
|
||||
// set up the QCPColorMap:
|
||||
QCPColorMap *colorMap = new QCPColorMap(ui->customPlot->xAxis, ui->customPlot->yAxis);
|
||||
int nx = 200;
|
||||
int ny = 200;
|
||||
colorMap->data()->setSize(nx, ny); // we want the color map to have nx * ny data points
|
||||
colorMap->data()->setRange(QCPRange(-4, 4), QCPRange(-4, 4)); // and span the coordinate range -4..4 in both key (x) and value (y) dimensions
|
||||
// now we assign some data, by accessing the QCPColorMapData instance of the color map:
|
||||
double x, y, z;
|
||||
for (int xIndex = 0; xIndex < nx; ++xIndex) {
|
||||
for (int yIndex = 0; yIndex < ny; ++yIndex) {
|
||||
colorMap->data()->cellToCoord(xIndex, yIndex, &x, &y);
|
||||
double r = 3 * qSqrt(x * x + y * y) + 1e-2;
|
||||
z = 2 * x * (qCos(r + 2) / r - qSin(r + 2) / r); // the B field strength of dipole radiation (modulo physical constants)
|
||||
colorMap->data()->setCell(xIndex, yIndex, z);
|
||||
}
|
||||
}
|
||||
|
||||
// add a color scale:
|
||||
QCPColorScale *colorScale = new QCPColorScale(ui->customPlot);
|
||||
ui->customPlot->plotLayout()->addElement(0, 1, colorScale); // add it to the right of the main axis rect
|
||||
colorScale->setType(QCPAxis::atRight); // scale shall be vertical bar with tick/axis labels right (actually atRight is already the default)
|
||||
colorMap->setColorScale(colorScale); // associate the color map with the color scale
|
||||
colorScale->axis()->setLabel("Magnetic Field Strength");
|
||||
|
||||
// set the color gradient of the color map to one of the presets:
|
||||
colorMap->setGradient(QCPColorGradient::gpPolar);
|
||||
// we could have also created a QCPColorGradient instance and added own colors to
|
||||
// the gradient, see the documentation of QCPColorGradient for what's possible.
|
||||
|
||||
// rescale the data dimension (color) such that all data points lie in the span visualized by the color gradient:
|
||||
colorMap->rescaleDataRange();
|
||||
|
||||
// make sure the axis rect and color scale synchronize their bottom and top margins (so they line up):
|
||||
QCPMarginGroup *marginGroup = new QCPMarginGroup(ui->customPlot);
|
||||
ui->customPlot->axisRect()->setMarginGroup(QCP::msBottom | QCP::msTop, marginGroup);
|
||||
colorScale->setMarginGroup(QCP::msBottom | QCP::msTop, marginGroup);
|
||||
|
||||
// rescale the key (x) and value (y) axes so the whole color map is visible:
|
||||
ui->customPlot->rescaleAxes();
|
||||
}
|
|
@ -0,0 +1,25 @@
|
|||
#ifndef FRMCOLORMAP_H
|
||||
#define FRMCOLORMAP_H
|
||||
|
||||
#include <QWidget>
|
||||
|
||||
namespace Ui {
|
||||
class frmColorMap;
|
||||
}
|
||||
|
||||
class frmColorMap : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit frmColorMap(QWidget *parent = 0);
|
||||
~frmColorMap();
|
||||
|
||||
private:
|
||||
Ui::frmColorMap *ui;
|
||||
|
||||
private slots:
|
||||
void initForm();
|
||||
};
|
||||
|
||||
#endif // FRMCOLORMAP_H
|
|
@ -0,0 +1,44 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>frmColorMap</class>
|
||||
<widget class="QWidget" name="frmColorMap">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>400</width>
|
||||
<height>300</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Form</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QCustomPlot" name="customPlot" native="true"/>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
<class>QCustomPlot</class>
|
||||
<extends>QWidget</extends>
|
||||
<header location="global">qcustomplot.h</header>
|
||||
<container>1</container>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
|
@ -0,0 +1,71 @@
|
|||
#include "frmdate.h"
|
||||
#include "ui_frmdate.h"
|
||||
#include "qdebug.h"
|
||||
|
||||
frmDate::frmDate(QWidget *parent) : QWidget(parent), ui(new Ui::frmDate)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
this->initForm();
|
||||
}
|
||||
|
||||
frmDate::~frmDate()
|
||||
{
|
||||
delete ui;
|
||||
}
|
||||
|
||||
void frmDate::initForm()
|
||||
{
|
||||
// set locale to english, so we get english month names:
|
||||
ui->customPlot->setLocale(QLocale(QLocale::English, QLocale::UnitedKingdom));
|
||||
// seconds of current time, we'll use it as starting point in time for data:
|
||||
double now = QDateTime::currentDateTime().toMSecsSinceEpoch() / 1000.0;
|
||||
srand(8); // set the random seed, so we always get the same random data
|
||||
// create multiple graphs:
|
||||
for (int gi = 0; gi < 5; ++gi) {
|
||||
ui->customPlot->addGraph();
|
||||
QColor color(20 + 200 / 4.0 * gi, 70 * (1.6 - gi / 4.0), 150, 150);
|
||||
ui->customPlot->graph()->setLineStyle(QCPGraph::lsLine);
|
||||
ui->customPlot->graph()->setPen(QPen(color.lighter(200)));
|
||||
ui->customPlot->graph()->setBrush(QBrush(color));
|
||||
// generate random walk data:
|
||||
QVector<QCPGraphData> timeData(250);
|
||||
for (int i = 0; i < 250; ++i) {
|
||||
timeData[i].key = now + 24 * 3600 * i;
|
||||
if (i == 0) {
|
||||
timeData[i].value = (i / 50.0 + 1) * (rand() / (double)RAND_MAX - 0.5);
|
||||
} else {
|
||||
timeData[i].value = qFabs(timeData[i - 1].value) * (1 + 0.02 / 4.0 * (4 - gi)) + (i / 50.0 + 1) * (rand() / (double)RAND_MAX - 0.5);
|
||||
}
|
||||
}
|
||||
ui->customPlot->graph()->data()->set(timeData);
|
||||
}
|
||||
// configure bottom axis to show date instead of number:
|
||||
QSharedPointer<QCPAxisTickerDateTime> dateTicker(new QCPAxisTickerDateTime);
|
||||
dateTicker->setDateTimeFormat("d. MMMM\nyyyy");
|
||||
ui->customPlot->xAxis->setTicker(dateTicker);
|
||||
// configure left axis text labels:
|
||||
QSharedPointer<QCPAxisTickerText> textTicker(new QCPAxisTickerText);
|
||||
textTicker->addTick(10, "a bit\nlow");
|
||||
textTicker->addTick(50, "quite\nhigh");
|
||||
ui->customPlot->yAxis->setTicker(textTicker);
|
||||
// set a more compact font size for bottom and left axis tick labels:
|
||||
ui->customPlot->xAxis->setTickLabelFont(QFont(QFont().family(), 8));
|
||||
ui->customPlot->yAxis->setTickLabelFont(QFont(QFont().family(), 8));
|
||||
// set axis labels:
|
||||
ui->customPlot->xAxis->setLabel("Date");
|
||||
ui->customPlot->yAxis->setLabel("Random wobbly lines value");
|
||||
// make top and right axes visible but without ticks and labels:
|
||||
ui->customPlot->xAxis2->setVisible(true);
|
||||
ui->customPlot->yAxis2->setVisible(true);
|
||||
ui->customPlot->xAxis2->setTicks(false);
|
||||
ui->customPlot->yAxis2->setTicks(false);
|
||||
ui->customPlot->xAxis2->setTickLabels(false);
|
||||
ui->customPlot->yAxis2->setTickLabels(false);
|
||||
// set axis ranges to show all data:
|
||||
ui->customPlot->xAxis->setRange(now, now + 24 * 3600 * 249);
|
||||
ui->customPlot->yAxis->setRange(0, 60);
|
||||
// show legend with slightly transparent background brush:
|
||||
ui->customPlot->legend->setVisible(true);
|
||||
ui->customPlot->legend->setBrush(QColor(255, 255, 255, 150));
|
||||
ui->customPlot->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom);
|
||||
}
|
|
@ -0,0 +1,25 @@
|
|||
#ifndef FRMDATE_H
|
||||
#define FRMDATE_H
|
||||
|
||||
#include <QWidget>
|
||||
|
||||
namespace Ui {
|
||||
class frmDate;
|
||||
}
|
||||
|
||||
class frmDate : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit frmDate(QWidget *parent = 0);
|
||||
~frmDate();
|
||||
|
||||
private:
|
||||
Ui::frmDate *ui;
|
||||
|
||||
private slots:
|
||||
void initForm();
|
||||
};
|
||||
|
||||
#endif // FRMDATE_H
|
|
@ -0,0 +1,44 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>frmDate</class>
|
||||
<widget class="QWidget" name="frmDate">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>400</width>
|
||||
<height>300</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Form</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QCustomPlot" name="customPlot" native="true"/>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
<class>QCustomPlot</class>
|
||||
<extends>QWidget</extends>
|
||||
<header location="global">qcustomplot.h</header>
|
||||
<container>1</container>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
|
@ -0,0 +1,105 @@
|
|||
#include "frmfinancial.h"
|
||||
#include "ui_frmfinancial.h"
|
||||
#include "qdebug.h"
|
||||
|
||||
frmFinancial::frmFinancial(QWidget *parent) : QWidget(parent), ui(new Ui::frmFinancial)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
this->initForm();
|
||||
}
|
||||
|
||||
frmFinancial::~frmFinancial()
|
||||
{
|
||||
delete ui;
|
||||
}
|
||||
|
||||
void frmFinancial::initForm()
|
||||
{
|
||||
ui->customPlot->legend->setVisible(true);
|
||||
|
||||
// generate two sets of random walk data (one for candlestick and one for ohlc chart):
|
||||
int n = 500;
|
||||
QVector<double> time(n), value1(n), value2(n);
|
||||
QDateTime start(QDate(2014, 6, 11), QTime(0, 0));
|
||||
start.setTimeSpec(Qt::UTC);
|
||||
double startTime = start.toMSecsSinceEpoch() / 1000.0;
|
||||
double binSize = 3600 * 24; // bin data in 1 day intervals
|
||||
time[0] = startTime;
|
||||
value1[0] = 60;
|
||||
value2[0] = 20;
|
||||
std::srand(9);
|
||||
for (int i = 1; i < n; ++i) {
|
||||
time[i] = startTime + 3600 * i;
|
||||
value1[i] = value1[i - 1] + (std::rand() / (double)RAND_MAX - 0.5) * 10;
|
||||
value2[i] = value2[i - 1] + (std::rand() / (double)RAND_MAX - 0.5) * 3;
|
||||
}
|
||||
|
||||
// create candlestick chart:
|
||||
QCPFinancial *candlesticks = new QCPFinancial(ui->customPlot->xAxis, ui->customPlot->yAxis);
|
||||
candlesticks->setName("Candlestick");
|
||||
candlesticks->setChartStyle(QCPFinancial::csCandlestick);
|
||||
candlesticks->data()->set(QCPFinancial::timeSeriesToOhlc(time, value1, binSize, startTime));
|
||||
candlesticks->setWidth(binSize * 0.9);
|
||||
candlesticks->setTwoColored(true);
|
||||
candlesticks->setBrushPositive(QColor(245, 245, 245));
|
||||
candlesticks->setBrushNegative(QColor(40, 40, 40));
|
||||
candlesticks->setPenPositive(QPen(QColor(0, 0, 0)));
|
||||
candlesticks->setPenNegative(QPen(QColor(0, 0, 0)));
|
||||
|
||||
// create ohlc chart:
|
||||
QCPFinancial *ohlc = new QCPFinancial(ui->customPlot->xAxis, ui->customPlot->yAxis);
|
||||
ohlc->setName("OHLC");
|
||||
ohlc->setChartStyle(QCPFinancial::csOhlc);
|
||||
ohlc->data()->set(QCPFinancial::timeSeriesToOhlc(time, value2, binSize / 3.0, startTime)); // divide binSize by 3 just to make the ohlc bars a bit denser
|
||||
ohlc->setWidth(binSize * 0.2);
|
||||
ohlc->setTwoColored(true);
|
||||
|
||||
// create bottom axis rect for volume bar chart:
|
||||
QCPAxisRect *volumeAxisRect = new QCPAxisRect(ui->customPlot);
|
||||
ui->customPlot->plotLayout()->addElement(1, 0, volumeAxisRect);
|
||||
volumeAxisRect->setMaximumSize(QSize(QWIDGETSIZE_MAX, 100));
|
||||
volumeAxisRect->axis(QCPAxis::atBottom)->setLayer("axes");
|
||||
volumeAxisRect->axis(QCPAxis::atBottom)->grid()->setLayer("grid");
|
||||
// bring bottom and main axis rect closer together:
|
||||
ui->customPlot->plotLayout()->setRowSpacing(0);
|
||||
volumeAxisRect->setAutoMargins(QCP::msLeft | QCP::msRight | QCP::msBottom);
|
||||
volumeAxisRect->setMargins(QMargins(0, 0, 0, 0));
|
||||
// create two bar plottables, for positive (green) and negative (red) volume bars:
|
||||
ui->customPlot->setAutoAddPlottableToLegend(false);
|
||||
QCPBars *volumePos = new QCPBars(volumeAxisRect->axis(QCPAxis::atBottom), volumeAxisRect->axis(QCPAxis::atLeft));
|
||||
QCPBars *volumeNeg = new QCPBars(volumeAxisRect->axis(QCPAxis::atBottom), volumeAxisRect->axis(QCPAxis::atLeft));
|
||||
for (int i = 0; i < n / 5; ++i) {
|
||||
int v = std::rand() % 20000 + std::rand() % 20000 + std::rand() % 20000 - 10000 * 3;
|
||||
(v < 0 ? volumeNeg : volumePos)->addData(startTime + 3600 * 5.0 * i, qAbs(v)); // add data to either volumeNeg or volumePos, depending on sign of v
|
||||
}
|
||||
volumePos->setWidth(3600 * 4);
|
||||
volumePos->setPen(Qt::NoPen);
|
||||
volumePos->setBrush(QColor(100, 180, 110));
|
||||
volumeNeg->setWidth(3600 * 4);
|
||||
volumeNeg->setPen(Qt::NoPen);
|
||||
volumeNeg->setBrush(QColor(180, 90, 90));
|
||||
|
||||
// interconnect x axis ranges of main and bottom axis rects:
|
||||
connect(ui->customPlot->xAxis, SIGNAL(rangeChanged(QCPRange)), volumeAxisRect->axis(QCPAxis::atBottom), SLOT(setRange(QCPRange)));
|
||||
connect(volumeAxisRect->axis(QCPAxis::atBottom), SIGNAL(rangeChanged(QCPRange)), ui->customPlot->xAxis, SLOT(setRange(QCPRange)));
|
||||
// configure axes of both main and bottom axis rect:
|
||||
QSharedPointer<QCPAxisTickerDateTime> dateTimeTicker(new QCPAxisTickerDateTime);
|
||||
dateTimeTicker->setDateTimeSpec(Qt::UTC);
|
||||
dateTimeTicker->setDateTimeFormat("dd. MMMM");
|
||||
volumeAxisRect->axis(QCPAxis::atBottom)->setTicker(dateTimeTicker);
|
||||
volumeAxisRect->axis(QCPAxis::atBottom)->setTickLabelRotation(15);
|
||||
ui->customPlot->xAxis->setBasePen(Qt::NoPen);
|
||||
ui->customPlot->xAxis->setTickLabels(false);
|
||||
ui->customPlot->xAxis->setTicks(false); // only want vertical grid in main axis rect, so hide xAxis backbone, ticks, and labels
|
||||
ui->customPlot->xAxis->setTicker(dateTimeTicker);
|
||||
ui->customPlot->rescaleAxes();
|
||||
ui->customPlot->xAxis->scaleRange(1.025, ui->customPlot->xAxis->range().center());
|
||||
ui->customPlot->yAxis->scaleRange(1.1, ui->customPlot->yAxis->range().center());
|
||||
|
||||
// make axis rects' left side line up:
|
||||
QCPMarginGroup *group = new QCPMarginGroup(ui->customPlot);
|
||||
ui->customPlot->axisRect()->setMarginGroup(QCP::msLeft | QCP::msRight, group);
|
||||
volumeAxisRect->setMarginGroup(QCP::msLeft | QCP::msRight, group);
|
||||
|
||||
ui->customPlot->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom);
|
||||
}
|
|
@ -0,0 +1,25 @@
|
|||
#ifndef FRMFINANCIAL_H
|
||||
#define FRMFINANCIAL_H
|
||||
|
||||
#include <QWidget>
|
||||
|
||||
namespace Ui {
|
||||
class frmFinancial;
|
||||
}
|
||||
|
||||
class frmFinancial : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit frmFinancial(QWidget *parent = 0);
|
||||
~frmFinancial();
|
||||
|
||||
private:
|
||||
Ui::frmFinancial *ui;
|
||||
|
||||
private slots:
|
||||
void initForm();
|
||||
};
|
||||
|
||||
#endif // FRMFINANCIAL_H
|
|
@ -0,0 +1,44 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>frmFinancial</class>
|
||||
<widget class="QWidget" name="frmFinancial">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>400</width>
|
||||
<height>300</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Form</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QCustomPlot" name="customPlot" native="true"/>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
<class>QCustomPlot</class>
|
||||
<extends>QWidget</extends>
|
||||
<header location="global">qcustomplot.h</header>
|
||||
<container>1</container>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
|
@ -0,0 +1,173 @@
|
|||
#include "frmitem.h"
|
||||
#include "ui_frmitem.h"
|
||||
#include "qdebug.h"
|
||||
|
||||
frmItem::frmItem(QWidget *parent) : QWidget(parent), ui(new Ui::frmItem)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
this->initForm();
|
||||
}
|
||||
|
||||
frmItem::~frmItem()
|
||||
{
|
||||
delete ui;
|
||||
}
|
||||
|
||||
void frmItem::showEvent(QShowEvent *)
|
||||
{
|
||||
dataTimer.start(0); // Interval 0 means to refresh as fast as possible
|
||||
}
|
||||
|
||||
void frmItem::hideEvent(QHideEvent *)
|
||||
{
|
||||
dataTimer.stop();
|
||||
}
|
||||
|
||||
void frmItem::initForm()
|
||||
{
|
||||
ui->customPlot->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom);
|
||||
QCPGraph *graph = ui->customPlot->addGraph();
|
||||
int n = 500;
|
||||
double phase = 0;
|
||||
double k = 3;
|
||||
QVector<double> x(n), y(n);
|
||||
for (int i = 0; i < n; ++i) {
|
||||
x[i] = i / (double)(n - 1) * 34 - 17;
|
||||
y[i] = qExp(-x[i] * x[i] / 20.0) * qSin(k * x[i] + phase);
|
||||
}
|
||||
graph->setData(x, y);
|
||||
graph->setPen(QPen(Qt::blue));
|
||||
graph->rescaleKeyAxis();
|
||||
ui->customPlot->yAxis->setRange(-1.45, 1.65);
|
||||
ui->customPlot->xAxis->grid()->setZeroLinePen(Qt::NoPen);
|
||||
|
||||
// add the bracket at the top:
|
||||
QCPItemBracket *bracket = new QCPItemBracket(ui->customPlot);
|
||||
bracket->left->setCoords(-8, 1.1);
|
||||
bracket->right->setCoords(8, 1.1);
|
||||
bracket->setLength(13);
|
||||
|
||||
// add the text label at the top:
|
||||
QCPItemText *wavePacketText = new QCPItemText(ui->customPlot);
|
||||
wavePacketText->position->setParentAnchor(bracket->center);
|
||||
wavePacketText->position->setCoords(0, -10); // move 10 pixels to the top from bracket center anchor
|
||||
wavePacketText->setPositionAlignment(Qt::AlignBottom | Qt::AlignHCenter);
|
||||
wavePacketText->setText("Wavepacket");
|
||||
wavePacketText->setFont(QFont(font().family(), 10));
|
||||
|
||||
// add the phase tracer (red circle) which sticks to the graph data (and gets updated in bracketDataSlot by timer event):
|
||||
phaseTracer = new QCPItemTracer(ui->customPlot);
|
||||
phaseTracer->setGraph(graph);
|
||||
phaseTracer->setGraphKey((M_PI * 1.5 - phase) / k);
|
||||
phaseTracer->setInterpolating(true);
|
||||
phaseTracer->setStyle(QCPItemTracer::tsCircle);
|
||||
phaseTracer->setPen(QPen(Qt::red));
|
||||
phaseTracer->setBrush(Qt::red);
|
||||
phaseTracer->setSize(7);
|
||||
|
||||
// add label for phase tracer:
|
||||
QCPItemText *phaseTracerText = new QCPItemText(ui->customPlot);
|
||||
phaseTracerText->position->setType(QCPItemPosition::ptAxisRectRatio);
|
||||
phaseTracerText->setPositionAlignment(Qt::AlignRight | Qt::AlignBottom);
|
||||
phaseTracerText->position->setCoords(1.0, 0.95); // lower right corner of axis rect
|
||||
phaseTracerText->setText("Points of fixed\nphase define\nphase velocity vp");
|
||||
phaseTracerText->setTextAlignment(Qt::AlignLeft);
|
||||
phaseTracerText->setFont(QFont(font().family(), 9));
|
||||
phaseTracerText->setPadding(QMargins(8, 0, 0, 0));
|
||||
|
||||
// add arrow pointing at phase tracer, coming from label:
|
||||
QCPItemCurve *phaseTracerArrow = new QCPItemCurve(ui->customPlot);
|
||||
phaseTracerArrow->start->setParentAnchor(phaseTracerText->left);
|
||||
phaseTracerArrow->startDir->setParentAnchor(phaseTracerArrow->start);
|
||||
phaseTracerArrow->startDir->setCoords(-40, 0); // direction 30 pixels to the left of parent anchor (tracerArrow->start)
|
||||
phaseTracerArrow->end->setParentAnchor(phaseTracer->position);
|
||||
phaseTracerArrow->end->setCoords(10, 10);
|
||||
phaseTracerArrow->endDir->setParentAnchor(phaseTracerArrow->end);
|
||||
phaseTracerArrow->endDir->setCoords(30, 30);
|
||||
phaseTracerArrow->setHead(QCPLineEnding::esSpikeArrow);
|
||||
phaseTracerArrow->setTail(QCPLineEnding(QCPLineEnding::esBar, (phaseTracerText->bottom->pixelPosition().y() - phaseTracerText->top->pixelPosition().y()) * 0.85));
|
||||
|
||||
// add the group velocity tracer (green circle):
|
||||
QCPItemTracer *groupTracer = new QCPItemTracer(ui->customPlot);
|
||||
groupTracer->setGraph(graph);
|
||||
groupTracer->setGraphKey(5.5);
|
||||
groupTracer->setInterpolating(true);
|
||||
groupTracer->setStyle(QCPItemTracer::tsCircle);
|
||||
groupTracer->setPen(QPen(Qt::green));
|
||||
groupTracer->setBrush(Qt::green);
|
||||
groupTracer->setSize(7);
|
||||
|
||||
// add label for group tracer:
|
||||
QCPItemText *groupTracerText = new QCPItemText(ui->customPlot);
|
||||
groupTracerText->position->setType(QCPItemPosition::ptAxisRectRatio);
|
||||
groupTracerText->setPositionAlignment(Qt::AlignRight | Qt::AlignTop);
|
||||
groupTracerText->position->setCoords(1.0, 0.20); // lower right corner of axis rect
|
||||
groupTracerText->setText("Fixed positions in\nwave packet define\ngroup velocity vg");
|
||||
groupTracerText->setTextAlignment(Qt::AlignLeft);
|
||||
groupTracerText->setFont(QFont(font().family(), 9));
|
||||
groupTracerText->setPadding(QMargins(8, 0, 0, 0));
|
||||
|
||||
// add arrow pointing at group tracer, coming from label:
|
||||
QCPItemCurve *groupTracerArrow = new QCPItemCurve(ui->customPlot);
|
||||
groupTracerArrow->start->setParentAnchor(groupTracerText->left);
|
||||
groupTracerArrow->startDir->setParentAnchor(groupTracerArrow->start);
|
||||
groupTracerArrow->startDir->setCoords(-40, 0); // direction 30 pixels to the left of parent anchor (tracerArrow->start)
|
||||
groupTracerArrow->end->setCoords(5.5, 0.4);
|
||||
groupTracerArrow->endDir->setParentAnchor(groupTracerArrow->end);
|
||||
groupTracerArrow->endDir->setCoords(0, -40);
|
||||
groupTracerArrow->setHead(QCPLineEnding::esSpikeArrow);
|
||||
groupTracerArrow->setTail(QCPLineEnding(QCPLineEnding::esBar, (groupTracerText->bottom->pixelPosition().y() - groupTracerText->top->pixelPosition().y()) * 0.85));
|
||||
|
||||
// add dispersion arrow:
|
||||
QCPItemCurve *arrow = new QCPItemCurve(ui->customPlot);
|
||||
arrow->start->setCoords(1, -1.1);
|
||||
arrow->startDir->setCoords(-1, -1.3);
|
||||
arrow->endDir->setCoords(-5, -0.3);
|
||||
arrow->end->setCoords(-10, -0.2);
|
||||
arrow->setHead(QCPLineEnding::esSpikeArrow);
|
||||
|
||||
// add the dispersion arrow label:
|
||||
QCPItemText *dispersionText = new QCPItemText(ui->customPlot);
|
||||
dispersionText->position->setCoords(-6, -0.9);
|
||||
dispersionText->setRotation(40);
|
||||
dispersionText->setText("Dispersion with\nvp < vg");
|
||||
dispersionText->setFont(QFont(font().family(), 10));
|
||||
|
||||
// setup a timer that repeatedly calls MainWindow::bracketDataSlot:
|
||||
connect(&dataTimer, SIGNAL(timeout()), this, SLOT(bracketDataSlot()));
|
||||
}
|
||||
|
||||
void frmItem::bracketDataSlot()
|
||||
{
|
||||
double secs = QCPAxisTickerDateTime::dateTimeToKey(QDateTime::currentDateTime());
|
||||
|
||||
// update data to make phase move:
|
||||
int n = 500;
|
||||
double phase = secs * 5;
|
||||
double k = 3;
|
||||
QVector<double> x(n), y(n);
|
||||
for (int i = 0; i < n; ++i) {
|
||||
x[i] = i / (double)(n - 1) * 34 - 17;
|
||||
y[i] = qExp(-x[i] * x[i] / 20.0) * qSin(k * x[i] + phase);
|
||||
}
|
||||
ui->customPlot->graph()->setData(x, y);
|
||||
|
||||
phaseTracer->setGraphKey((8 * M_PI + fmod(M_PI * 1.5 - phase, 6 * M_PI)) / k);
|
||||
|
||||
ui->customPlot->replot();
|
||||
|
||||
// calculate frames per second:
|
||||
double key = secs;
|
||||
static double lastFpsKey;
|
||||
static int frameCount;
|
||||
++frameCount;
|
||||
if (key - lastFpsKey > 2) { // average fps over 2 seconds
|
||||
// ui->statusBar->showMessage(
|
||||
// QString("%1 FPS, Total Data points: %2")
|
||||
// .arg(frameCount / (key - lastFpsKey), 0, 'f', 0)
|
||||
// .arg(ui->customPlot->graph(0)->data()->size())
|
||||
// , 0);
|
||||
lastFpsKey = key;
|
||||
frameCount = 0;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,34 @@
|
|||
#ifndef FRMITEM_H
|
||||
#define FRMITEM_H
|
||||
|
||||
#include <QWidget>
|
||||
#include <QTimer>
|
||||
class QCPItemTracer;
|
||||
|
||||
namespace Ui {
|
||||
class frmItem;
|
||||
}
|
||||
|
||||
class frmItem : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit frmItem(QWidget *parent = 0);
|
||||
~frmItem();
|
||||
|
||||
protected:
|
||||
void showEvent(QShowEvent *);
|
||||
void hideEvent(QHideEvent *);
|
||||
|
||||
private:
|
||||
Ui::frmItem *ui;
|
||||
QTimer dataTimer;
|
||||
QCPItemTracer *phaseTracer;
|
||||
|
||||
private slots:
|
||||
void initForm();
|
||||
void bracketDataSlot();
|
||||
};
|
||||
|
||||
#endif // FRMITEM_H
|
|
@ -0,0 +1,44 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>frmItem</class>
|
||||
<widget class="QWidget" name="frmItem">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>400</width>
|
||||
<height>300</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Form</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QCustomPlot" name="customPlot" native="true"/>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
<class>QCustomPlot</class>
|
||||
<extends>QWidget</extends>
|
||||
<header location="global">qcustomplot.h</header>
|
||||
<container>1</container>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
|
@ -0,0 +1,51 @@
|
|||
#include "frmlinestyle.h"
|
||||
#include "ui_frmlinestyle.h"
|
||||
#include "qdebug.h"
|
||||
|
||||
frmLineStyle::frmLineStyle(QWidget *parent) : QWidget(parent), ui(new Ui::frmLineStyle)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
this->initForm();
|
||||
}
|
||||
|
||||
frmLineStyle::~frmLineStyle()
|
||||
{
|
||||
delete ui;
|
||||
}
|
||||
|
||||
void frmLineStyle::initForm()
|
||||
{
|
||||
ui->customPlot->legend->setVisible(true);
|
||||
ui->customPlot->legend->setFont(QFont("Helvetica", 9));
|
||||
QPen pen;
|
||||
QStringList lineNames;
|
||||
lineNames << "lsNone" << "lsLine" << "lsStepLeft" << "lsStepRight" << "lsStepCenter" << "lsImpulse";
|
||||
// add graphs with different line styles:
|
||||
for (int i = QCPGraph::lsNone; i <= QCPGraph::lsImpulse; ++i) {
|
||||
ui->customPlot->addGraph();
|
||||
pen.setColor(QColor(qSin(i * 1 + 1.2) * 80 + 80, qSin(i * 0.3 + 0) * 80 + 80, qSin(i * 0.3 + 1.5) * 80 + 80));
|
||||
ui->customPlot->graph()->setPen(pen);
|
||||
ui->customPlot->graph()->setName(lineNames.at(i - QCPGraph::lsNone));
|
||||
ui->customPlot->graph()->setLineStyle((QCPGraph::LineStyle)i);
|
||||
ui->customPlot->graph()->setScatterStyle(QCPScatterStyle(QCPScatterStyle::ssCircle, 5));
|
||||
// generate data:
|
||||
QVector<double> x(15), y(15);
|
||||
for (int j = 0; j < 15; ++j) {
|
||||
x[j] = j / 15.0 * 5 * 3.14 + 0.01;
|
||||
y[j] = 7 * qSin(x[j]) / x[j] - (i - QCPGraph::lsNone) * 5 + (QCPGraph::lsImpulse) * 5 + 2;
|
||||
}
|
||||
ui->customPlot->graph()->setData(x, y);
|
||||
ui->customPlot->graph()->rescaleAxes(true);
|
||||
}
|
||||
// zoom out a bit:
|
||||
ui->customPlot->yAxis->scaleRange(1.1, ui->customPlot->yAxis->range().center());
|
||||
ui->customPlot->xAxis->scaleRange(1.1, ui->customPlot->xAxis->range().center());
|
||||
// set blank axis lines:
|
||||
ui->customPlot->xAxis->setTicks(false);
|
||||
ui->customPlot->yAxis->setTicks(true);
|
||||
ui->customPlot->xAxis->setTickLabels(false);
|
||||
ui->customPlot->yAxis->setTickLabels(true);
|
||||
// make top right axes clones of bottom left axes:
|
||||
ui->customPlot->axisRect()->setupFullAxesBox();
|
||||
ui->customPlot->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom);
|
||||
}
|
|
@ -0,0 +1,25 @@
|
|||
#ifndef FRMLINESTYLE_H
|
||||
#define FRMLINESTYLE_H
|
||||
|
||||
#include <QWidget>
|
||||
|
||||
namespace Ui {
|
||||
class frmLineStyle;
|
||||
}
|
||||
|
||||
class frmLineStyle : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit frmLineStyle(QWidget *parent = 0);
|
||||
~frmLineStyle();
|
||||
|
||||
private:
|
||||
Ui::frmLineStyle *ui;
|
||||
|
||||
private slots:
|
||||
void initForm();
|
||||
};
|
||||
|
||||
#endif // FRMLINESTYLE_H
|
|
@ -0,0 +1,44 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>frmLineStyle</class>
|
||||
<widget class="QWidget" name="frmLineStyle">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>400</width>
|
||||
<height>300</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Form</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QCustomPlot" name="customPlot" native="true"/>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
<class>QCustomPlot</class>
|
||||
<extends>QWidget</extends>
|
||||
<header location="global">qcustomplot.h</header>
|
||||
<container>1</container>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
|
@ -0,0 +1,93 @@
|
|||
#include "frmlogarithmic.h"
|
||||
#include "ui_frmlogarithmic.h"
|
||||
#include "qdebug.h"
|
||||
|
||||
frmLogarithmic::frmLogarithmic(QWidget *parent) : QWidget(parent), ui(new Ui::frmLogarithmic)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
this->initForm();
|
||||
}
|
||||
|
||||
frmLogarithmic::~frmLogarithmic()
|
||||
{
|
||||
delete ui;
|
||||
}
|
||||
|
||||
void frmLogarithmic::initForm()
|
||||
{
|
||||
ui->customPlot->setNoAntialiasingOnDrag(true); // more performance/responsiveness during dragging
|
||||
ui->customPlot->addGraph();
|
||||
QPen pen;
|
||||
pen.setColor(QColor(255, 170, 100));
|
||||
pen.setWidth(2);
|
||||
pen.setStyle(Qt::DotLine);
|
||||
ui->customPlot->graph(0)->setPen(pen);
|
||||
ui->customPlot->graph(0)->setName("x");
|
||||
|
||||
ui->customPlot->addGraph();
|
||||
ui->customPlot->graph(1)->setPen(QPen(Qt::red));
|
||||
ui->customPlot->graph(1)->setBrush(QBrush(QColor(255, 0, 0, 20)));
|
||||
ui->customPlot->graph(1)->setName("-sin(x)exp(x)");
|
||||
|
||||
ui->customPlot->addGraph();
|
||||
ui->customPlot->graph(2)->setPen(QPen(Qt::blue));
|
||||
ui->customPlot->graph(2)->setBrush(QBrush(QColor(0, 0, 255, 20)));
|
||||
ui->customPlot->graph(2)->setName(" sin(x)exp(x)");
|
||||
|
||||
ui->customPlot->addGraph();
|
||||
pen.setColor(QColor(0, 0, 0));
|
||||
pen.setWidth(1);
|
||||
pen.setStyle(Qt::DashLine);
|
||||
ui->customPlot->graph(3)->setPen(pen);
|
||||
ui->customPlot->graph(3)->setBrush(QBrush(QColor(0, 0, 0, 15)));
|
||||
ui->customPlot->graph(3)->setLineStyle(QCPGraph::lsStepCenter);
|
||||
ui->customPlot->graph(3)->setName("x!");
|
||||
|
||||
const int dataCount = 200;
|
||||
const int dataFactorialCount = 21;
|
||||
QVector<QCPGraphData> dataLinear(dataCount), dataMinusSinExp(dataCount), dataPlusSinExp(dataCount), dataFactorial(dataFactorialCount);
|
||||
for (int i = 0; i < dataCount; ++i) {
|
||||
dataLinear[i].key = i / 10.0;
|
||||
dataLinear[i].value = dataLinear[i].key;
|
||||
dataMinusSinExp[i].key = i / 10.0;
|
||||
dataMinusSinExp[i].value = -qSin(dataMinusSinExp[i].key) * qExp(dataMinusSinExp[i].key);
|
||||
dataPlusSinExp[i].key = i / 10.0;
|
||||
dataPlusSinExp[i].value = qSin(dataPlusSinExp[i].key) * qExp(dataPlusSinExp[i].key);
|
||||
}
|
||||
for (int i = 0; i < dataFactorialCount; ++i) {
|
||||
dataFactorial[i].key = i;
|
||||
dataFactorial[i].value = 1.0;
|
||||
for (int k = 1; k <= i; ++k) {
|
||||
dataFactorial[i].value *= k; // factorial
|
||||
}
|
||||
}
|
||||
ui->customPlot->graph(0)->data()->set(dataLinear);
|
||||
ui->customPlot->graph(1)->data()->set(dataMinusSinExp);
|
||||
ui->customPlot->graph(2)->data()->set(dataPlusSinExp);
|
||||
ui->customPlot->graph(3)->data()->set(dataFactorial);
|
||||
|
||||
ui->customPlot->yAxis->grid()->setSubGridVisible(true);
|
||||
ui->customPlot->xAxis->grid()->setSubGridVisible(true);
|
||||
ui->customPlot->yAxis->setScaleType(QCPAxis::stLogarithmic);
|
||||
ui->customPlot->yAxis2->setScaleType(QCPAxis::stLogarithmic);
|
||||
QSharedPointer<QCPAxisTickerLog> logTicker(new QCPAxisTickerLog);
|
||||
ui->customPlot->yAxis->setTicker(logTicker);
|
||||
ui->customPlot->yAxis2->setTicker(logTicker);
|
||||
ui->customPlot->yAxis->setNumberFormat("eb"); // e = exponential, b = beautiful decimal powers
|
||||
ui->customPlot->yAxis->setNumberPrecision(0); // makes sure "1*10^4" is displayed only as "10^4"
|
||||
ui->customPlot->xAxis->setRange(0, 19.9);
|
||||
ui->customPlot->yAxis->setRange(1e-2, 1e10);
|
||||
|
||||
// make top right axes clones of bottom left axes:
|
||||
ui->customPlot->axisRect()->setupFullAxesBox();
|
||||
// connect signals so top and right axes move in sync with bottom and left axes:
|
||||
connect(ui->customPlot->xAxis, SIGNAL(rangeChanged(QCPRange)), ui->customPlot->xAxis2, SLOT(setRange(QCPRange)));
|
||||
connect(ui->customPlot->yAxis, SIGNAL(rangeChanged(QCPRange)), ui->customPlot->yAxis2, SLOT(setRange(QCPRange)));
|
||||
|
||||
ui->customPlot->legend->setVisible(true);
|
||||
ui->customPlot->legend->setBrush(QBrush(QColor(255, 255, 255, 150)));
|
||||
ui->customPlot->axisRect()->insetLayout()->setInsetAlignment(0, Qt::AlignLeft | Qt::AlignTop); // make legend align in top left corner or axis rect
|
||||
|
||||
// make range draggable and zoomable:
|
||||
ui->customPlot->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom);
|
||||
}
|
|
@ -0,0 +1,25 @@
|
|||
#ifndef FRMLOGARITHMIC_H
|
||||
#define FRMLOGARITHMIC_H
|
||||
|
||||
#include <QWidget>
|
||||
|
||||
namespace Ui {
|
||||
class frmLogarithmic;
|
||||
}
|
||||
|
||||
class frmLogarithmic : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit frmLogarithmic(QWidget *parent = 0);
|
||||
~frmLogarithmic();
|
||||
|
||||
private:
|
||||
Ui::frmLogarithmic *ui;
|
||||
|
||||
private slots:
|
||||
void initForm();
|
||||
};
|
||||
|
||||
#endif // FRMLOGARITHMIC_H
|
|
@ -0,0 +1,44 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>frmLogarithmic</class>
|
||||
<widget class="QWidget" name="frmLogarithmic">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>400</width>
|
||||
<height>300</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Form</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QCustomPlot" name="customPlot" native="true"/>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
<class>QCustomPlot</class>
|
||||
<extends>QWidget</extends>
|
||||
<header location="global">qcustomplot.h</header>
|
||||
<container>1</container>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
|
@ -0,0 +1,135 @@
|
|||
#pragma execution_character_set("utf-8")
|
||||
|
||||
#include "frmmain.h"
|
||||
#include "ui_frmmain.h"
|
||||
#include "iconhelper.h"
|
||||
#include "qdebug.h"
|
||||
|
||||
#include "frmquadratic.h"
|
||||
#include "frmsimple.h"
|
||||
#include "frmsincscatter.h"
|
||||
#include "frmscatterstyle.h"
|
||||
#include "frmscatterpixmap.h"
|
||||
#include "frmlinestyle.h"
|
||||
#include "frmdate.h"
|
||||
#include "frmtexturebrush.h"
|
||||
#include "frmmultiaxis.h"
|
||||
#include "frmlogarithmic.h"
|
||||
#include "frmrealtimedata.h"
|
||||
#include "frmparametriccurve.h"
|
||||
#include "frmbarchart.h"
|
||||
#include "frmstatistical.h"
|
||||
#include "frmsimpleitem.h"
|
||||
#include "frmitem.h"
|
||||
#include "frmstyled.h"
|
||||
#include "frmadvancedaxes.h"
|
||||
#include "frmcolormap.h"
|
||||
#include "frmfinancial.h"
|
||||
#include "frmpolarplot.h"
|
||||
#include "frmtest.h"
|
||||
|
||||
frmMain::frmMain(QWidget *parent) : QWidget(parent), ui(new Ui::frmMain)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
this->initForm();
|
||||
this->initWidget();
|
||||
this->initNav();
|
||||
this->initIcon();
|
||||
}
|
||||
|
||||
frmMain::~frmMain()
|
||||
{
|
||||
delete ui;
|
||||
}
|
||||
|
||||
void frmMain::initForm()
|
||||
{
|
||||
ui->scrollArea->setFixedWidth(170);
|
||||
ui->widgetLeft->setProperty("flag", "left");
|
||||
}
|
||||
|
||||
void frmMain::initWidget()
|
||||
{
|
||||
//ui->customPlot->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom);
|
||||
ui->stackedWidget->addWidget(new frmQuadratic);
|
||||
ui->stackedWidget->addWidget(new frmSimple);
|
||||
ui->stackedWidget->addWidget(new frmSincScatter);
|
||||
ui->stackedWidget->addWidget(new frmScatterStyle);
|
||||
ui->stackedWidget->addWidget(new frmScatterPixmap);
|
||||
ui->stackedWidget->addWidget(new frmLineStyle);
|
||||
ui->stackedWidget->addWidget(new frmDate);
|
||||
ui->stackedWidget->addWidget(new frmTextureBrush);
|
||||
ui->stackedWidget->addWidget(new frmMultiAxis);
|
||||
ui->stackedWidget->addWidget(new frmLogarithmic);
|
||||
ui->stackedWidget->addWidget(new frmRealtimeData);
|
||||
ui->stackedWidget->addWidget(new frmParametricCurve);
|
||||
ui->stackedWidget->addWidget(new frmBarChart);
|
||||
ui->stackedWidget->addWidget(new frmStatistical);
|
||||
ui->stackedWidget->addWidget(new frmSimpleItem);
|
||||
ui->stackedWidget->addWidget(new frmItem);
|
||||
ui->stackedWidget->addWidget(new frmStyled);
|
||||
ui->stackedWidget->addWidget(new frmAdvancedAxes);
|
||||
ui->stackedWidget->addWidget(new frmColorMap);
|
||||
ui->stackedWidget->addWidget(new frmFinancial);
|
||||
ui->stackedWidget->addWidget(new frmPolarPlot);
|
||||
ui->stackedWidget->addWidget(new frmTest);
|
||||
}
|
||||
|
||||
void frmMain::initNav()
|
||||
{
|
||||
//按钮文字集合
|
||||
QStringList names;
|
||||
names << "平方二次元" << "简单曲线图" << "正弦散点图" << "数据点样式" << "数据点图片"
|
||||
<< "曲线条样式" << "日期数据图" << "纹理画刷图" << "双坐标曲线" << "对数曲线图"
|
||||
<< "动态正弦图" << "环形曲线图" << "垂直柱状图" << "箱形盒须图" << "静态指示线"
|
||||
<< "动态指示线" << "曲线样式图" << "高级坐标轴" << "颜色热力图" << "金融曲线图"
|
||||
<< "南丁格尔图" << "测试曲线图";
|
||||
|
||||
//自动生成按钮
|
||||
for (int i = 0; i < names.count(); i++) {
|
||||
QToolButton *btn = new QToolButton;
|
||||
//设置按钮固定高度
|
||||
btn->setFixedHeight(35);
|
||||
//设置按钮的文字
|
||||
btn->setText(QString("%1. %2").arg(i + 1, 2, 10, QChar('0')).arg(names.at(i)));
|
||||
//设置按钮可选中按下类似复选框的功能
|
||||
btn->setCheckable(true);
|
||||
//设置按钮图标在左侧文字在右侧
|
||||
btn->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
|
||||
//设置按钮拉伸策略为横向填充
|
||||
btn->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
|
||||
//关联按钮单击事件
|
||||
connect(btn, SIGNAL(clicked(bool)), this, SLOT(buttonClicked()));
|
||||
//将按钮加入到布局
|
||||
ui->widgetLeft->layout()->addWidget(btn);
|
||||
//可以指定不同的图标
|
||||
icons << 0xf061;
|
||||
btns << btn;
|
||||
}
|
||||
|
||||
//底部加个弹簧
|
||||
QSpacerItem *verticalSpacer = new QSpacerItem(20, 40, QSizePolicy::Minimum, QSizePolicy::Expanding);
|
||||
ui->widgetLeft->layout()->addItem(verticalSpacer);
|
||||
btns.at(names.count() - 1)->click();
|
||||
}
|
||||
|
||||
void frmMain::initIcon()
|
||||
{
|
||||
//左侧导航样式,可以设置各种牛逼的参数,超级棒
|
||||
IconHelper::StyleColor styleColor;
|
||||
styleColor.defaultBorder = true;
|
||||
IconHelper::setStyle(ui->widgetLeft, btns, icons, styleColor);
|
||||
}
|
||||
|
||||
void frmMain::buttonClicked()
|
||||
{
|
||||
QAbstractButton *b = (QAbstractButton *)sender();
|
||||
int count = btns.count();
|
||||
int index = btns.indexOf(b);
|
||||
ui->stackedWidget->setCurrentIndex(index);
|
||||
|
||||
for (int i = 0; i < count; i++) {
|
||||
QAbstractButton *btn = btns.at(i);
|
||||
btn->setChecked(btn == b);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,34 @@
|
|||
#ifndef FRMMAIN_H
|
||||
#define FRMMAIN_H
|
||||
|
||||
#include <QWidget>
|
||||
class QAbstractButton;
|
||||
|
||||
namespace Ui {
|
||||
class frmMain;
|
||||
}
|
||||
|
||||
class frmMain : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit frmMain(QWidget *parent = 0);
|
||||
~frmMain();
|
||||
|
||||
private:
|
||||
Ui::frmMain *ui;
|
||||
|
||||
//左侧导航栏图标+按钮集合
|
||||
QList<int> icons;
|
||||
QList<QAbstractButton *> btns;
|
||||
|
||||
private slots:
|
||||
void initForm(); //初始化界面数据
|
||||
void initWidget(); //初始化子窗体
|
||||
void initNav(); //初始化导航按钮
|
||||
void initIcon(); //初始化导航按钮图标
|
||||
void buttonClicked(); //导航按钮单击事件
|
||||
};
|
||||
|
||||
#endif // FRMMAIN_H
|
|
@ -0,0 +1,85 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>frmMain</class>
|
||||
<widget class="QWidget" name="frmMain">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>635</width>
|
||||
<height>429</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Form</string>
|
||||
</property>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||
<property name="spacing">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QScrollArea" name="scrollArea">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>180</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>180</width>
|
||||
<height>16777215</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="widgetResizable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<widget class="QWidget" name="widgetLeft">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>178</width>
|
||||
<height>427</height>
|
||||
</rect>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<property name="spacing">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
</layout>
|
||||
</widget>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QStackedWidget" name="stackedWidget"/>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
|
@ -0,0 +1,128 @@
|
|||
#include "frmmultiaxis.h"
|
||||
#include "ui_frmmultiaxis.h"
|
||||
#include "qdebug.h"
|
||||
|
||||
frmMultiAxis::frmMultiAxis(QWidget *parent) : QWidget(parent), ui(new Ui::frmMultiAxis)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
this->initForm();
|
||||
}
|
||||
|
||||
frmMultiAxis::~frmMultiAxis()
|
||||
{
|
||||
delete ui;
|
||||
}
|
||||
|
||||
void frmMultiAxis::initForm()
|
||||
{
|
||||
ui->customPlot->setLocale(QLocale(QLocale::English, QLocale::UnitedKingdom)); // period as decimal separator and comma as thousand separator
|
||||
ui->customPlot->legend->setVisible(true);
|
||||
QFont legendFont = font(); // start out with MainWindow's font..
|
||||
legendFont.setPointSize(9); // and make a bit smaller for legend
|
||||
ui->customPlot->legend->setFont(legendFont);
|
||||
ui->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:
|
||||
ui->customPlot->axisRect()->insetLayout()->setInsetAlignment(0, Qt::AlignBottom | Qt::AlignRight);
|
||||
|
||||
// setup for graph 0: key axis left, value axis bottom
|
||||
// will contain left maxwell-like function
|
||||
ui->customPlot->addGraph(ui->customPlot->yAxis, ui->customPlot->xAxis);
|
||||
ui->customPlot->graph(0)->setPen(QPen(QColor(255, 100, 0)));
|
||||
ui->customPlot->graph(0)->setBrush(QBrush(QPixmap("./balboa.jpg"))); // fill with texture of specified image
|
||||
ui->customPlot->graph(0)->setLineStyle(QCPGraph::lsLine);
|
||||
ui->customPlot->graph(0)->setScatterStyle(QCPScatterStyle(QCPScatterStyle::ssDisc, 5));
|
||||
ui->customPlot->graph(0)->setName("Left maxwell function");
|
||||
|
||||
// setup for graph 1: key axis bottom, value axis left (those are the default axes)
|
||||
// will contain bottom maxwell-like function with error bars
|
||||
ui->customPlot->addGraph();
|
||||
ui->customPlot->graph(1)->setPen(QPen(Qt::red));
|
||||
ui->customPlot->graph(1)->setBrush(QBrush(QPixmap("./balboa.jpg"))); // same fill as we used for graph 0
|
||||
ui->customPlot->graph(1)->setLineStyle(QCPGraph::lsStepCenter);
|
||||
ui->customPlot->graph(1)->setScatterStyle(QCPScatterStyle(QCPScatterStyle::ssCircle, Qt::red, Qt::white, 7));
|
||||
ui->customPlot->graph(1)->setName("Bottom maxwell function");
|
||||
QCPErrorBars *errorBars = new QCPErrorBars(ui->customPlot->xAxis, ui->customPlot->yAxis);
|
||||
errorBars->removeFromLegend();
|
||||
errorBars->setDataPlottable(ui->customPlot->graph(1));
|
||||
|
||||
// setup for graph 2: key axis top, value axis right
|
||||
// will contain high frequency sine with low frequency beating:
|
||||
ui->customPlot->addGraph(ui->customPlot->xAxis2, ui->customPlot->yAxis2);
|
||||
ui->customPlot->graph(2)->setPen(QPen(Qt::blue));
|
||||
ui->customPlot->graph(2)->setName("High frequency sine");
|
||||
|
||||
// setup for graph 3: same axes as graph 2
|
||||
// will contain low frequency beating envelope of graph 2
|
||||
ui->customPlot->addGraph(ui->customPlot->xAxis2, ui->customPlot->yAxis2);
|
||||
QPen blueDotPen;
|
||||
blueDotPen.setColor(QColor(30, 40, 255, 150));
|
||||
blueDotPen.setStyle(Qt::DotLine);
|
||||
blueDotPen.setWidthF(4);
|
||||
ui->customPlot->graph(3)->setPen(blueDotPen);
|
||||
ui->customPlot->graph(3)->setName("Sine envelope");
|
||||
|
||||
// setup for graph 4: key axis right, value axis top
|
||||
// will contain parabolically distributed data points with some random perturbance
|
||||
ui->customPlot->addGraph(ui->customPlot->yAxis2, ui->customPlot->xAxis2);
|
||||
ui->customPlot->graph(4)->setPen(QColor(50, 50, 50, 255));
|
||||
ui->customPlot->graph(4)->setLineStyle(QCPGraph::lsNone);
|
||||
ui->customPlot->graph(4)->setScatterStyle(QCPScatterStyle(QCPScatterStyle::ssCircle, 4));
|
||||
ui->customPlot->graph(4)->setName("Some random data around\na quadratic function");
|
||||
|
||||
// generate data, just playing with numbers, not much to learn here:
|
||||
QVector<double> x0(25), y0(25);
|
||||
QVector<double> x1(15), y1(15), y1err(15);
|
||||
QVector<double> x2(250), y2(250);
|
||||
QVector<double> x3(250), y3(250);
|
||||
QVector<double> x4(250), y4(250);
|
||||
for (int i = 0; i < 25; ++i) { // data for graph 0
|
||||
x0[i] = 3 * i / 25.0;
|
||||
y0[i] = qExp(-x0[i] * x0[i] * 0.8) * (x0[i] * x0[i] + x0[i]);
|
||||
}
|
||||
for (int i = 0; i < 15; ++i) { // data for graph 1
|
||||
x1[i] = 3 * i / 15.0;;
|
||||
y1[i] = qExp(-x1[i] * x1[i]) * (x1[i] * x1[i]) * 2.6;
|
||||
y1err[i] = y1[i] * 0.25;
|
||||
}
|
||||
for (int i = 0; i < 250; ++i) { // data for graphs 2, 3 and 4
|
||||
x2[i] = i / 250.0 * 3 * M_PI;
|
||||
x3[i] = x2[i];
|
||||
x4[i] = i / 250.0 * 100 - 50;
|
||||
y2[i] = qSin(x2[i] * 12) * qCos(x2[i]) * 10;
|
||||
y3[i] = qCos(x3[i]) * 10;
|
||||
y4[i] = 0.01 * x4[i] * x4[i] + 1.5 * (rand() / (double)RAND_MAX - 0.5) + 1.5 * M_PI;
|
||||
}
|
||||
|
||||
// pass data points to graphs:
|
||||
ui->customPlot->graph(0)->setData(x0, y0);
|
||||
ui->customPlot->graph(1)->setData(x1, y1);
|
||||
errorBars->setData(y1err);
|
||||
ui->customPlot->graph(2)->setData(x2, y2);
|
||||
ui->customPlot->graph(3)->setData(x3, y3);
|
||||
ui->customPlot->graph(4)->setData(x4, y4);
|
||||
// activate top and right axes, which are invisible by default:
|
||||
ui->customPlot->xAxis2->setVisible(true);
|
||||
ui->customPlot->yAxis2->setVisible(true);
|
||||
// set ranges appropriate to show data:
|
||||
ui->customPlot->xAxis->setRange(0, 2.7);
|
||||
ui->customPlot->yAxis->setRange(0, 2.6);
|
||||
ui->customPlot->xAxis2->setRange(0, 3.0 * M_PI);
|
||||
ui->customPlot->yAxis2->setRange(-70, 35);
|
||||
// set pi ticks on top axis:
|
||||
ui->customPlot->xAxis2->setTicker(QSharedPointer<QCPAxisTickerPi>(new QCPAxisTickerPi));
|
||||
// add title layout element:
|
||||
ui->customPlot->plotLayout()->insertRow(0);
|
||||
ui->customPlot->plotLayout()->addElement(0, 0, new QCPTextElement(ui->customPlot, "Way too many graphs in one plot", QFont("sans", 12, QFont::Bold)));
|
||||
// set labels:
|
||||
ui->customPlot->xAxis->setLabel("Bottom axis with outward ticks");
|
||||
ui->customPlot->yAxis->setLabel("Left axis label");
|
||||
ui->customPlot->xAxis2->setLabel("Top axis label");
|
||||
ui->customPlot->yAxis2->setLabel("Right axis label");
|
||||
// make ticks on bottom axis go outward:
|
||||
ui->customPlot->xAxis->setTickLength(0, 5);
|
||||
ui->customPlot->xAxis->setSubTickLength(0, 3);
|
||||
// make ticks on right axis go inward and outward:
|
||||
ui->customPlot->yAxis2->setTickLength(3, 3);
|
||||
ui->customPlot->yAxis2->setSubTickLength(1, 1);
|
||||
ui->customPlot->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom);
|
||||
}
|
|
@ -0,0 +1,25 @@
|
|||
#ifndef FRMMULTIAXIS_H
|
||||
#define FRMMULTIAXIS_H
|
||||
|
||||
#include <QWidget>
|
||||
|
||||
namespace Ui {
|
||||
class frmMultiAxis;
|
||||
}
|
||||
|
||||
class frmMultiAxis : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit frmMultiAxis(QWidget *parent = 0);
|
||||
~frmMultiAxis();
|
||||
|
||||
private:
|
||||
Ui::frmMultiAxis *ui;
|
||||
|
||||
private slots:
|
||||
void initForm();
|
||||
};
|
||||
|
||||
#endif // FRMMULTIAXIS_H
|
|
@ -0,0 +1,44 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>frmMultiAxis</class>
|
||||
<widget class="QWidget" name="frmMultiAxis">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>400</width>
|
||||
<height>300</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Form</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QCustomPlot" name="customPlot" native="true"/>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
<class>QCustomPlot</class>
|
||||
<extends>QWidget</extends>
|
||||
<header location="global">qcustomplot.h</header>
|
||||
<container>1</container>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
|
@ -0,0 +1,51 @@
|
|||
#include "frmparametriccurve.h"
|
||||
#include "ui_frmparametriccurve.h"
|
||||
#include "qdebug.h"
|
||||
|
||||
frmParametricCurve::frmParametricCurve(QWidget *parent) : QWidget(parent), ui(new Ui::frmParametricCurve)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
this->initForm();
|
||||
}
|
||||
|
||||
frmParametricCurve::~frmParametricCurve()
|
||||
{
|
||||
delete ui;
|
||||
}
|
||||
|
||||
void frmParametricCurve::initForm()
|
||||
{
|
||||
// create empty curve objects:
|
||||
QCPCurve *fermatSpiral1 = new QCPCurve(ui->customPlot->xAxis, ui->customPlot->yAxis);
|
||||
QCPCurve *fermatSpiral2 = new QCPCurve(ui->customPlot->xAxis, ui->customPlot->yAxis);
|
||||
QCPCurve *deltoidRadial = new QCPCurve(ui->customPlot->xAxis, ui->customPlot->yAxis);
|
||||
// generate the curve data points:
|
||||
const int pointCount = 500;
|
||||
QVector<QCPCurveData> dataSpiral1(pointCount), dataSpiral2(pointCount), dataDeltoid(pointCount);
|
||||
for (int i = 0; i < pointCount; ++i) {
|
||||
double phi = i / (double)(pointCount - 1) * 8 * M_PI;
|
||||
double theta = i / (double)(pointCount - 1) * 2 * M_PI;
|
||||
dataSpiral1[i] = QCPCurveData(i, qSqrt(phi) * qCos(phi), qSqrt(phi) * qSin(phi));
|
||||
dataSpiral2[i] = QCPCurveData(i, -dataSpiral1[i].key, -dataSpiral1[i].value);
|
||||
dataDeltoid[i] = QCPCurveData(i, 2 * qCos(2 * theta) + qCos(1 * theta) + 2 * qSin(theta), 2 * qSin(2 * theta) - qSin(1 * theta));
|
||||
}
|
||||
// pass the data to the curves; we know t (i in loop above) is ascending, so set alreadySorted=true (saves an extra internal sort):
|
||||
fermatSpiral1->data()->set(dataSpiral1, true);
|
||||
fermatSpiral2->data()->set(dataSpiral2, true);
|
||||
deltoidRadial->data()->set(dataDeltoid, true);
|
||||
// color the curves:
|
||||
fermatSpiral1->setPen(QPen(Qt::blue));
|
||||
fermatSpiral1->setBrush(QBrush(QColor(0, 0, 255, 20)));
|
||||
fermatSpiral2->setPen(QPen(QColor(255, 120, 0)));
|
||||
fermatSpiral2->setBrush(QBrush(QColor(255, 120, 0, 30)));
|
||||
QRadialGradient radialGrad(QPointF(310, 180), 200);
|
||||
radialGrad.setColorAt(0, QColor(170, 20, 240, 100));
|
||||
radialGrad.setColorAt(0.5, QColor(20, 10, 255, 40));
|
||||
radialGrad.setColorAt(1, QColor(120, 20, 240, 10));
|
||||
deltoidRadial->setPen(QPen(QColor(170, 20, 240)));
|
||||
deltoidRadial->setBrush(QBrush(radialGrad));
|
||||
// set some basic ui->customPlot config:
|
||||
ui->customPlot->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom | QCP::iSelectPlottables);
|
||||
ui->customPlot->axisRect()->setupFullAxesBox();
|
||||
ui->customPlot->rescaleAxes();
|
||||
}
|
|
@ -0,0 +1,25 @@
|
|||
#ifndef FRMPARAMETRICCURVE_H
|
||||
#define FRMPARAMETRICCURVE_H
|
||||
|
||||
#include <QWidget>
|
||||
|
||||
namespace Ui {
|
||||
class frmParametricCurve;
|
||||
}
|
||||
|
||||
class frmParametricCurve : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit frmParametricCurve(QWidget *parent = 0);
|
||||
~frmParametricCurve();
|
||||
|
||||
private:
|
||||
Ui::frmParametricCurve *ui;
|
||||
|
||||
private slots:
|
||||
void initForm();
|
||||
};
|
||||
|
||||
#endif // FRMPARAMETRICCURVE_H
|
|
@ -0,0 +1,44 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>frmParametricCurve</class>
|
||||
<widget class="QWidget" name="frmParametricCurve">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>400</width>
|
||||
<height>300</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Form</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QCustomPlot" name="customPlot" native="true"/>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
<class>QCustomPlot</class>
|
||||
<extends>QWidget</extends>
|
||||
<header location="global">qcustomplot.h</header>
|
||||
<container>1</container>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
|
@ -0,0 +1,53 @@
|
|||
#include "frmpolarplot.h"
|
||||
#include "ui_frmpolarplot.h"
|
||||
#include "qdebug.h"
|
||||
|
||||
frmPolarPlot::frmPolarPlot(QWidget *parent) : QWidget(parent), ui(new Ui::frmPolarPlot)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
this->initForm();
|
||||
}
|
||||
|
||||
frmPolarPlot::~frmPolarPlot()
|
||||
{
|
||||
delete ui;
|
||||
}
|
||||
|
||||
void frmPolarPlot::initForm()
|
||||
{
|
||||
// Warning: Polar plots are a still a tech preview
|
||||
|
||||
ui->customPlot->plotLayout()->clear();
|
||||
QCPPolarAxisAngular *angularAxis = new QCPPolarAxisAngular(ui->customPlot);
|
||||
ui->customPlot->plotLayout()->addElement(0, 0, angularAxis);
|
||||
/* This is how we could set the angular axis to show pi symbols instead of degree numbers:
|
||||
QSharedPointer<QCPAxisTickerPi> ticker(new QCPAxisTickerPi);
|
||||
ticker->setPiValue(180);
|
||||
ticker->setTickCount(8);
|
||||
polarAxis->setTicker(ticker);
|
||||
*/
|
||||
ui->customPlot->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom);
|
||||
angularAxis->setRangeDrag(false);
|
||||
angularAxis->setTickLabelMode(QCPPolarAxisAngular::lmUpright);
|
||||
|
||||
angularAxis->radialAxis()->setTickLabelMode(QCPPolarAxisRadial::lmUpright);
|
||||
angularAxis->radialAxis()->setTickLabelRotation(0);
|
||||
angularAxis->radialAxis()->setAngle(45);
|
||||
|
||||
angularAxis->grid()->setAngularPen(QPen(QColor(200, 200, 200), 0, Qt::SolidLine));
|
||||
angularAxis->grid()->setSubGridType(QCPPolarGrid::gtAll);
|
||||
|
||||
QCPPolarGraph *g1 = new QCPPolarGraph(angularAxis, angularAxis->radialAxis());
|
||||
QCPPolarGraph *g2 = new QCPPolarGraph(angularAxis, angularAxis->radialAxis());
|
||||
g2->setPen(QPen(QColor(255, 150, 20)));
|
||||
g2->setBrush(QColor(255, 150, 20, 50));
|
||||
g1->setScatterStyle(QCPScatterStyle::ssDisc);
|
||||
|
||||
for (int i = 0; i < 100; ++i) {
|
||||
g1->addData(i / 100.0 * 360.0, qSin(i / 100.0 * M_PI * 8) * 8 + 1);
|
||||
g2->addData(i / 100.0 * 360.0, qSin(i / 100.0 * M_PI * 6) * 2);
|
||||
}
|
||||
|
||||
angularAxis->setRange(0, 360);
|
||||
angularAxis->radialAxis()->setRange(-10, 10);
|
||||
}
|
|
@ -0,0 +1,25 @@
|
|||
#ifndef FRMPOLARPLOT_H
|
||||
#define FRMPOLARPLOT_H
|
||||
|
||||
#include <QWidget>
|
||||
|
||||
namespace Ui {
|
||||
class frmPolarPlot;
|
||||
}
|
||||
|
||||
class frmPolarPlot : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit frmPolarPlot(QWidget *parent = 0);
|
||||
~frmPolarPlot();
|
||||
|
||||
private:
|
||||
Ui::frmPolarPlot *ui;
|
||||
|
||||
private slots:
|
||||
void initForm();
|
||||
};
|
||||
|
||||
#endif // FRMPOLARPLOT_H
|
|
@ -0,0 +1,44 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>frmPolarPlot</class>
|
||||
<widget class="QWidget" name="frmPolarPlot">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>400</width>
|
||||
<height>300</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Form</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QCustomPlot" name="customPlot" native="true"/>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
<class>QCustomPlot</class>
|
||||
<extends>QWidget</extends>
|
||||
<header location="global">qcustomplot.h</header>
|
||||
<container>1</container>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
|
@ -0,0 +1,34 @@
|
|||
#include "frmquadratic.h"
|
||||
#include "ui_frmquadratic.h"
|
||||
#include "qdebug.h"
|
||||
|
||||
frmQuadratic::frmQuadratic(QWidget *parent) : QWidget(parent), ui(new Ui::frmQuadratic)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
this->initForm();
|
||||
}
|
||||
|
||||
frmQuadratic::~frmQuadratic()
|
||||
{
|
||||
delete ui;
|
||||
}
|
||||
|
||||
void frmQuadratic::initForm()
|
||||
{
|
||||
// generate some data:
|
||||
QVector<double> x(101), y(101); // initialize with entries 0..100
|
||||
for (int i = 0; i < 101; ++i) {
|
||||
x[i] = i / 50.0 - 1; // x goes from -1 to 1
|
||||
y[i] = x[i] * x[i]; // let's plot a quadratic function
|
||||
}
|
||||
// create graph and assign data to it:
|
||||
ui->customPlot->addGraph();
|
||||
ui->customPlot->graph(0)->setData(x, y);
|
||||
// give the axes some labels:
|
||||
ui->customPlot->xAxis->setLabel("x");
|
||||
ui->customPlot->yAxis->setLabel("y");
|
||||
// set axes ranges, so we see all data:
|
||||
ui->customPlot->xAxis->setRange(-1, 1);
|
||||
ui->customPlot->yAxis->setRange(0, 1);
|
||||
ui->customPlot->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom);
|
||||
}
|
|
@ -0,0 +1,25 @@
|
|||
#ifndef FRMQUADRATIC_H
|
||||
#define FRMQUADRATIC_H
|
||||
|
||||
#include <QWidget>
|
||||
|
||||
namespace Ui {
|
||||
class frmQuadratic;
|
||||
}
|
||||
|
||||
class frmQuadratic : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit frmQuadratic(QWidget *parent = 0);
|
||||
~frmQuadratic();
|
||||
|
||||
private:
|
||||
Ui::frmQuadratic *ui;
|
||||
|
||||
private slots:
|
||||
void initForm();
|
||||
};
|
||||
|
||||
#endif // FRMQUADRATIC_H
|
|
@ -0,0 +1,44 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>frmQuadratic</class>
|
||||
<widget class="QWidget" name="frmQuadratic">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>400</width>
|
||||
<height>300</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Form</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QCustomPlot" name="customPlot" native="true"/>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
<class>QCustomPlot</class>
|
||||
<extends>QWidget</extends>
|
||||
<header location="global">qcustomplot.h</header>
|
||||
<container>1</container>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
|
@ -0,0 +1,87 @@
|
|||
#include "frmrealtimedata.h"
|
||||
#include "ui_frmrealtimedata.h"
|
||||
#include "qdebug.h"
|
||||
|
||||
frmRealtimeData::frmRealtimeData(QWidget *parent) : QWidget(parent), ui(new Ui::frmRealtimeData)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
this->initForm();
|
||||
}
|
||||
|
||||
frmRealtimeData::~frmRealtimeData()
|
||||
{
|
||||
delete ui;
|
||||
}
|
||||
|
||||
void frmRealtimeData::showEvent(QShowEvent *)
|
||||
{
|
||||
timeStart = QTime::currentTime();
|
||||
dataTimer.start(0); // Interval 0 means to refresh as fast as possible
|
||||
}
|
||||
|
||||
void frmRealtimeData::hideEvent(QHideEvent *)
|
||||
{
|
||||
dataTimer.stop();
|
||||
}
|
||||
|
||||
void frmRealtimeData::initForm()
|
||||
{
|
||||
// include this section to fully disable antialiasing for higher performance:
|
||||
/*
|
||||
ui->customPlot->setNotAntialiasedElements(QCP::aeAll);
|
||||
QFont font;
|
||||
font.setStyleStrategy(QFont::NoAntialias);
|
||||
ui->customPlot->xAxis->setTickLabelFont(font);
|
||||
ui->customPlot->yAxis->setTickLabelFont(font);
|
||||
ui->customPlot->legend->setFont(font);
|
||||
*/
|
||||
ui->customPlot->addGraph(); // blue line
|
||||
ui->customPlot->graph(0)->setPen(QPen(QColor(40, 110, 255)));
|
||||
ui->customPlot->addGraph(); // red line
|
||||
ui->customPlot->graph(1)->setPen(QPen(QColor(255, 110, 40)));
|
||||
|
||||
QSharedPointer<QCPAxisTickerTime> timeTicker(new QCPAxisTickerTime);
|
||||
timeTicker->setTimeFormat("%h:%m:%s");
|
||||
ui->customPlot->xAxis->setTicker(timeTicker);
|
||||
ui->customPlot->axisRect()->setupFullAxesBox();
|
||||
ui->customPlot->yAxis->setRange(-1.2, 1.2);
|
||||
|
||||
// make left and bottom axes transfer their ranges to right and top axes:
|
||||
connect(ui->customPlot->xAxis, SIGNAL(rangeChanged(QCPRange)), ui->customPlot->xAxis2, SLOT(setRange(QCPRange)));
|
||||
connect(ui->customPlot->yAxis, SIGNAL(rangeChanged(QCPRange)), ui->customPlot->yAxis2, SLOT(setRange(QCPRange)));
|
||||
|
||||
// setup a timer that repeatedly calls MainWindow::realtimeDataSlot:
|
||||
connect(&dataTimer, SIGNAL(timeout()), this, SLOT(realtimeDataSlot()));
|
||||
}
|
||||
|
||||
void frmRealtimeData::realtimeDataSlot()
|
||||
{
|
||||
// calculate two new data points:
|
||||
double key = timeStart.msecsTo(QTime::currentTime()) / 1000.0; // time elapsed since start of demo, in seconds
|
||||
static double lastPointKey = 0;
|
||||
if (key - lastPointKey > 0.002) { // at most add point every 2 ms
|
||||
// add data to lines:
|
||||
ui->customPlot->graph(0)->addData(key, qSin(key) + std::rand() / (double)RAND_MAX * 1 * qSin(key / 0.3843));
|
||||
ui->customPlot->graph(1)->addData(key, qCos(key) + std::rand() / (double)RAND_MAX * 0.5 * qSin(key / 0.4364));
|
||||
// rescale value (vertical) axis to fit the current data:
|
||||
//ui->customPlot->graph(0)->rescaleValueAxis();
|
||||
//ui->customPlot->graph(1)->rescaleValueAxis(true);
|
||||
lastPointKey = key;
|
||||
}
|
||||
// make key axis range scroll with the data (at a constant range size of 8):
|
||||
ui->customPlot->xAxis->setRange(key, 8, Qt::AlignRight);
|
||||
ui->customPlot->replot();
|
||||
|
||||
// calculate frames per second:
|
||||
static double lastFpsKey;
|
||||
static int frameCount;
|
||||
++frameCount;
|
||||
if (key - lastFpsKey > 2) { // average fps over 2 seconds
|
||||
QString fps = QString("%1").arg(frameCount / (key - lastFpsKey), 0, 'f', 0);
|
||||
int count = ui->customPlot->graph(0)->data()->size() + ui->customPlot->graph(1)->data()->size();
|
||||
QString info = QString("%1 FPS, Total Data points: %2").arg(fps).arg(count);
|
||||
ui->label->setText(info);
|
||||
lastFpsKey = key;
|
||||
frameCount = 0;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,34 @@
|
|||
#ifndef FRMREALTIMEDATA_H
|
||||
#define FRMREALTIMEDATA_H
|
||||
|
||||
#include <QWidget>
|
||||
#include <QDateTime>
|
||||
#include <QTimer>
|
||||
|
||||
namespace Ui {
|
||||
class frmRealtimeData;
|
||||
}
|
||||
|
||||
class frmRealtimeData : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit frmRealtimeData(QWidget *parent = 0);
|
||||
~frmRealtimeData();
|
||||
|
||||
protected:
|
||||
void showEvent(QShowEvent *);
|
||||
void hideEvent(QHideEvent *);
|
||||
|
||||
private:
|
||||
Ui::frmRealtimeData *ui;
|
||||
QTimer dataTimer;
|
||||
QTime timeStart;
|
||||
|
||||
private slots:
|
||||
void initForm();
|
||||
void realtimeDataSlot();
|
||||
};
|
||||
|
||||
#endif // FRMREALTIMEDATA_H
|
|
@ -0,0 +1,51 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>frmRealtimeData</class>
|
||||
<widget class="QWidget" name="frmRealtimeData">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>400</width>
|
||||
<height>300</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Form</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<widget class="QCustomPlot" name="customPlot" native="true"/>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="frameShape">
|
||||
<enum>QFrame::Box</enum>
|
||||
</property>
|
||||
<property name="frameShadow">
|
||||
<enum>QFrame::Sunken</enum>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
<class>QCustomPlot</class>
|
||||
<extends>QWidget</extends>
|
||||
<header location="global">qcustomplot.h</header>
|
||||
<container>1</container>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
|
@ -0,0 +1,58 @@
|
|||
#include "frmscatterpixmap.h"
|
||||
#include "ui_frmscatterpixmap.h"
|
||||
#include "qdebug.h"
|
||||
|
||||
frmScatterPixmap::frmScatterPixmap(QWidget *parent) : QWidget(parent), ui(new Ui::frmScatterPixmap)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
this->initForm();
|
||||
}
|
||||
|
||||
frmScatterPixmap::~frmScatterPixmap()
|
||||
{
|
||||
delete ui;
|
||||
}
|
||||
|
||||
void frmScatterPixmap::initForm()
|
||||
{
|
||||
ui->customPlot->axisRect()->setBackground(QPixmap(":/image/bg1.jpg"));
|
||||
ui->customPlot->addGraph();
|
||||
ui->customPlot->graph()->setLineStyle(QCPGraph::lsLine);
|
||||
QPen pen;
|
||||
pen.setColor(QColor(255, 200, 20, 200));
|
||||
pen.setStyle(Qt::DashLine);
|
||||
pen.setWidthF(2.5);
|
||||
ui->customPlot->graph()->setPen(pen);
|
||||
ui->customPlot->graph()->setBrush(QBrush(QColor(255, 200, 20, 70)));
|
||||
ui->customPlot->graph()->setScatterStyle(QCPScatterStyle(QPixmap(":/image/data.png")));
|
||||
// set graph name, will show up in legend next to icon:
|
||||
ui->customPlot->graph()->setName("Data from Photovoltaic\nenergy barometer 2011");
|
||||
// set data:
|
||||
QVector<double> year, value;
|
||||
year << 2005 << 2006 << 2007 << 2008 << 2009 << 2010 << 2011;
|
||||
value << 2.17 << 3.42 << 4.94 << 10.38 << 15.86 << 29.33 << 52.1;
|
||||
ui->customPlot->graph()->setData(year, value);
|
||||
|
||||
// set title of plot:
|
||||
ui->customPlot->plotLayout()->insertRow(0);
|
||||
ui->customPlot->plotLayout()->addElement(0, 0, new QCPTextElement(ui->customPlot, "Regenerative Energies", QFont("sans", 12, QFont::Bold)));
|
||||
// axis configurations:
|
||||
ui->customPlot->xAxis->setLabel("Year");
|
||||
ui->customPlot->yAxis->setLabel("Installed Gigawatts of\nphotovoltaic in the European Union");
|
||||
ui->customPlot->xAxis2->setVisible(true);
|
||||
ui->customPlot->yAxis2->setVisible(true);
|
||||
ui->customPlot->xAxis2->setTickLabels(false);
|
||||
ui->customPlot->yAxis2->setTickLabels(false);
|
||||
ui->customPlot->xAxis2->setTicks(false);
|
||||
ui->customPlot->yAxis2->setTicks(false);
|
||||
ui->customPlot->xAxis2->setSubTicks(false);
|
||||
ui->customPlot->yAxis2->setSubTicks(false);
|
||||
ui->customPlot->xAxis->setRange(2004.5, 2011.5);
|
||||
ui->customPlot->yAxis->setRange(0, 52);
|
||||
// setup legend:
|
||||
ui->customPlot->legend->setFont(QFont(font().family(), 7));
|
||||
ui->customPlot->legend->setIconSize(50, 20);
|
||||
ui->customPlot->legend->setVisible(true);
|
||||
ui->customPlot->axisRect()->insetLayout()->setInsetAlignment(0, Qt::AlignLeft | Qt::AlignTop);
|
||||
ui->customPlot->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom);
|
||||
}
|
|
@ -0,0 +1,25 @@
|
|||
#ifndef FRMSCATTERPIXMAP_H
|
||||
#define FRMSCATTERPIXMAP_H
|
||||
|
||||
#include <QWidget>
|
||||
|
||||
namespace Ui {
|
||||
class frmScatterPixmap;
|
||||
}
|
||||
|
||||
class frmScatterPixmap : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit frmScatterPixmap(QWidget *parent = 0);
|
||||
~frmScatterPixmap();
|
||||
|
||||
private:
|
||||
Ui::frmScatterPixmap *ui;
|
||||
|
||||
private slots:
|
||||
void initForm();
|
||||
};
|
||||
|
||||
#endif // FRMSCATTERPIXMAP_H
|
|
@ -0,0 +1,44 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>frmScatterPixmap</class>
|
||||
<widget class="QWidget" name="frmScatterPixmap">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>400</width>
|
||||
<height>300</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Form</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QCustomPlot" name="customPlot" native="true"/>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
<class>QCustomPlot</class>
|
||||
<extends>QWidget</extends>
|
||||
<header location="global">qcustomplot.h</header>
|
||||
<container>1</container>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
|
@ -0,0 +1,74 @@
|
|||
#include "frmscatterstyle.h"
|
||||
#include "ui_frmscatterstyle.h"
|
||||
#include "qdebug.h"
|
||||
|
||||
frmScatterStyle::frmScatterStyle(QWidget *parent) : QWidget(parent), ui(new Ui::frmScatterStyle)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
this->initForm();
|
||||
}
|
||||
|
||||
frmScatterStyle::~frmScatterStyle()
|
||||
{
|
||||
delete ui;
|
||||
}
|
||||
|
||||
void frmScatterStyle::initForm()
|
||||
{
|
||||
ui->customPlot->legend->setVisible(true);
|
||||
ui->customPlot->legend->setFont(QFont("Helvetica", 9));
|
||||
ui->customPlot->legend->setRowSpacing(-3);
|
||||
QVector<QCPScatterStyle::ScatterShape> shapes;
|
||||
shapes << QCPScatterStyle::ssCross;
|
||||
shapes << QCPScatterStyle::ssPlus;
|
||||
shapes << QCPScatterStyle::ssCircle;
|
||||
shapes << QCPScatterStyle::ssDisc;
|
||||
shapes << QCPScatterStyle::ssSquare;
|
||||
shapes << QCPScatterStyle::ssDiamond;
|
||||
shapes << QCPScatterStyle::ssStar;
|
||||
shapes << QCPScatterStyle::ssTriangle;
|
||||
shapes << QCPScatterStyle::ssTriangleInverted;
|
||||
shapes << QCPScatterStyle::ssCrossSquare;
|
||||
shapes << QCPScatterStyle::ssPlusSquare;
|
||||
shapes << QCPScatterStyle::ssCrossCircle;
|
||||
shapes << QCPScatterStyle::ssPlusCircle;
|
||||
shapes << QCPScatterStyle::ssPeace;
|
||||
shapes << QCPScatterStyle::ssCustom;
|
||||
|
||||
QPen pen;
|
||||
// add graphs with different scatter styles:
|
||||
for (int i = 0; i < shapes.size(); ++i) {
|
||||
ui->customPlot->addGraph();
|
||||
pen.setColor(QColor(qSin(i * 0.3) * 100 + 100, qSin(i * 0.6 + 0.7) * 100 + 100, qSin(i * 0.4 + 0.6) * 100 + 100));
|
||||
// generate data:
|
||||
QVector<double> x(10), y(10);
|
||||
for (int k = 0; k < 10; ++k) {
|
||||
x[k] = k / 10.0 * 4 * 3.14 + 0.01;
|
||||
y[k] = 7 * qSin(x[k]) / x[k] + (shapes.size() - i) * 5;
|
||||
}
|
||||
ui->customPlot->graph()->setData(x, y);
|
||||
ui->customPlot->graph()->rescaleAxes(true);
|
||||
ui->customPlot->graph()->setPen(pen);
|
||||
ui->customPlot->graph()->setName(QCPScatterStyle::staticMetaObject.enumerator(QCPScatterStyle::staticMetaObject.indexOfEnumerator("ScatterShape")).valueToKey(shapes.at(i)));
|
||||
ui->customPlot->graph()->setLineStyle(QCPGraph::lsLine);
|
||||
// set scatter style:
|
||||
if (shapes.at(i) != QCPScatterStyle::ssCustom) {
|
||||
ui->customPlot->graph()->setScatterStyle(QCPScatterStyle(shapes.at(i), 10));
|
||||
} else {
|
||||
QPainterPath customScatterPath;
|
||||
for (int i = 0; i < 3; ++i) {
|
||||
customScatterPath.cubicTo(qCos(2 * M_PI * i / 3.0) * 9, qSin(2 * M_PI * i / 3.0) * 9, qCos(2 * M_PI * (i + 0.9) / 3.0) * 9, qSin(2 * M_PI * (i + 0.9) / 3.0) * 9, 0, 0);
|
||||
}
|
||||
ui->customPlot->graph()->setScatterStyle(QCPScatterStyle(customScatterPath, QPen(Qt::black, 0), QColor(40, 70, 255, 50), 10));
|
||||
}
|
||||
}
|
||||
// set blank axis lines:
|
||||
ui->customPlot->rescaleAxes();
|
||||
ui->customPlot->xAxis->setTicks(false);
|
||||
ui->customPlot->yAxis->setTicks(false);
|
||||
ui->customPlot->xAxis->setTickLabels(false);
|
||||
ui->customPlot->yAxis->setTickLabels(false);
|
||||
// make top right axes clones of bottom left axes:
|
||||
ui->customPlot->axisRect()->setupFullAxesBox();
|
||||
ui->customPlot->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom);
|
||||
}
|
|
@ -0,0 +1,25 @@
|
|||
#ifndef FRMSCATTERSTYLE_H
|
||||
#define FRMSCATTERSTYLE_H
|
||||
|
||||
#include <QWidget>
|
||||
|
||||
namespace Ui {
|
||||
class frmScatterStyle;
|
||||
}
|
||||
|
||||
class frmScatterStyle : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit frmScatterStyle(QWidget *parent = 0);
|
||||
~frmScatterStyle();
|
||||
|
||||
private:
|
||||
Ui::frmScatterStyle *ui;
|
||||
|
||||
private slots:
|
||||
void initForm();
|
||||
};
|
||||
|
||||
#endif // FRMSCATTERSTYLE_H
|
|
@ -0,0 +1,44 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>frmScatterStyle</class>
|
||||
<widget class="QWidget" name="frmScatterStyle">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>400</width>
|
||||
<height>300</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Form</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QCustomPlot" name="customPlot" native="true"/>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
<class>QCustomPlot</class>
|
||||
<extends>QWidget</extends>
|
||||
<header location="global">qcustomplot.h</header>
|
||||
<container>1</container>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
|
@ -0,0 +1,50 @@
|
|||
#include "frmsimple.h"
|
||||
#include "ui_frmsimple.h"
|
||||
#include "qdebug.h"
|
||||
|
||||
frmSimple::frmSimple(QWidget *parent) : QWidget(parent), ui(new Ui::frmSimple)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
this->initForm();
|
||||
}
|
||||
|
||||
frmSimple::~frmSimple()
|
||||
{
|
||||
delete ui;
|
||||
}
|
||||
|
||||
void frmSimple::initForm()
|
||||
{
|
||||
// add two new graphs and set their look:
|
||||
ui->customPlot->addGraph();
|
||||
ui->customPlot->graph(0)->setPen(QPen(Qt::blue)); // line color blue for first graph
|
||||
ui->customPlot->graph(0)->setBrush(QBrush(QColor(0, 0, 255, 20))); // first graph will be filled with translucent blue
|
||||
ui->customPlot->addGraph();
|
||||
ui->customPlot->graph(1)->setPen(QPen(Qt::red)); // line color red for second graph
|
||||
// generate some points of data (y0 for first, y1 for second graph):
|
||||
QVector<double> x(251), y0(251), y1(251);
|
||||
for (int i = 0; i < 251; ++i) {
|
||||
x[i] = i;
|
||||
y0[i] = qExp(-i / 150.0) * qCos(i / 10.0); // exponentially decaying cosine
|
||||
y1[i] = qExp(-i / 150.0); // exponential envelope
|
||||
}
|
||||
// configure right and top axis to show ticks but no labels:
|
||||
// (see QCPAxisRect::setupFullAxesBox for a quicker method to do this)
|
||||
ui->customPlot->xAxis2->setVisible(true);
|
||||
ui->customPlot->xAxis2->setTickLabels(false);
|
||||
ui->customPlot->yAxis2->setVisible(true);
|
||||
ui->customPlot->yAxis2->setTickLabels(false);
|
||||
// make left and bottom axes always transfer their ranges to right and top axes:
|
||||
connect(ui->customPlot->xAxis, SIGNAL(rangeChanged(QCPRange)), ui->customPlot->xAxis2, SLOT(setRange(QCPRange)));
|
||||
connect(ui->customPlot->yAxis, SIGNAL(rangeChanged(QCPRange)), ui->customPlot->yAxis2, SLOT(setRange(QCPRange)));
|
||||
// pass data points to graphs:
|
||||
ui->customPlot->graph(0)->setData(x, y0);
|
||||
ui->customPlot->graph(1)->setData(x, y1);
|
||||
// let the ranges scale themselves so graph 0 fits perfectly in the visible area:
|
||||
ui->customPlot->graph(0)->rescaleAxes();
|
||||
// same thing for graph 1, but only enlarge ranges (in case graph 1 is smaller than graph 0):
|
||||
ui->customPlot->graph(1)->rescaleAxes(true);
|
||||
// Note: we could have also just called customPlot->rescaleAxes(); instead
|
||||
// Allow user to drag axis ranges with mouse, zoom with mouse wheel and select graphs by clicking:
|
||||
ui->customPlot->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom | QCP::iSelectPlottables);
|
||||
}
|
|
@ -0,0 +1,25 @@
|
|||
#ifndef FRMSIMPLE_H
|
||||
#define FRMSIMPLE_H
|
||||
|
||||
#include <QWidget>
|
||||
|
||||
namespace Ui {
|
||||
class frmSimple;
|
||||
}
|
||||
|
||||
class frmSimple : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit frmSimple(QWidget *parent = 0);
|
||||
~frmSimple();
|
||||
|
||||
private:
|
||||
Ui::frmSimple *ui;
|
||||
|
||||
private slots:
|
||||
void initForm();
|
||||
};
|
||||
|
||||
#endif // FRMSIMPLE_H
|
|
@ -0,0 +1,44 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>frmSimple</class>
|
||||
<widget class="QWidget" name="frmSimple">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>400</width>
|
||||
<height>300</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Form</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QCustomPlot" name="customPlot" native="true"/>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
<class>QCustomPlot</class>
|
||||
<extends>QWidget</extends>
|
||||
<header location="global">qcustomplot.h</header>
|
||||
<container>1</container>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
|
@ -0,0 +1,34 @@
|
|||
#include "frmsimpleitem.h"
|
||||
#include "ui_frmsimpleitem.h"
|
||||
#include "qdebug.h"
|
||||
|
||||
frmSimpleItem::frmSimpleItem(QWidget *parent) : QWidget(parent), ui(new Ui::frmSimpleItem)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
this->initForm();
|
||||
}
|
||||
|
||||
frmSimpleItem::~frmSimpleItem()
|
||||
{
|
||||
delete ui;
|
||||
}
|
||||
|
||||
void frmSimpleItem::initForm()
|
||||
{
|
||||
ui->customPlot->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom);
|
||||
|
||||
// add the text label at the top:
|
||||
QCPItemText *textLabel = new QCPItemText(ui->customPlot);
|
||||
textLabel->setPositionAlignment(Qt::AlignTop|Qt::AlignHCenter);
|
||||
textLabel->position->setType(QCPItemPosition::ptAxisRectRatio);
|
||||
textLabel->position->setCoords(0.5, 0); // place position at center/top of axis rect
|
||||
textLabel->setText("Text Item Demo");
|
||||
textLabel->setFont(QFont(font().family(), 16)); // make font a bit larger
|
||||
textLabel->setPen(QPen(Qt::black)); // show black border around text
|
||||
|
||||
// add the arrow:
|
||||
QCPItemLine *arrow = new QCPItemLine(ui->customPlot);
|
||||
arrow->start->setParentAnchor(textLabel->bottom);
|
||||
arrow->end->setCoords(4, 1.6); // point to (4, 1.6) in x-y-plot coordinates
|
||||
arrow->setHead(QCPLineEnding::esSpikeArrow);
|
||||
}
|
|
@ -0,0 +1,25 @@
|
|||
#ifndef FRMSIMPLEITEM_H
|
||||
#define FRMSIMPLEITEM_H
|
||||
|
||||
#include <QWidget>
|
||||
|
||||
namespace Ui {
|
||||
class frmSimpleItem;
|
||||
}
|
||||
|
||||
class frmSimpleItem : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit frmSimpleItem(QWidget *parent = 0);
|
||||
~frmSimpleItem();
|
||||
|
||||
private:
|
||||
Ui::frmSimpleItem *ui;
|
||||
|
||||
private slots:
|
||||
void initForm();
|
||||
};
|
||||
|
||||
#endif // FRMSIMPLEITEM_H
|
|
@ -0,0 +1,44 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>frmSimpleItem</class>
|
||||
<widget class="QWidget" name="frmSimpleItem">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>400</width>
|
||||
<height>300</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Form</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QCustomPlot" name="customPlot" native="true"/>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
<class>QCustomPlot</class>
|
||||
<extends>QWidget</extends>
|
||||
<header location="global">qcustomplot.h</header>
|
||||
<container>1</container>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
|
@ -0,0 +1,94 @@
|
|||
#include "frmsincscatter.h"
|
||||
#include "ui_frmsincscatter.h"
|
||||
#include "qdebug.h"
|
||||
|
||||
frmSincScatter::frmSincScatter(QWidget *parent) : QWidget(parent), ui(new Ui::frmSincScatter)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
this->initForm();
|
||||
}
|
||||
|
||||
frmSincScatter::~frmSincScatter()
|
||||
{
|
||||
delete ui;
|
||||
}
|
||||
|
||||
void frmSincScatter::initForm()
|
||||
{
|
||||
ui->customPlot->legend->setVisible(true);
|
||||
ui->customPlot->legend->setFont(QFont("Helvetica", 9));
|
||||
// set locale to english, so we get english decimal separator:
|
||||
ui->customPlot->setLocale(QLocale(QLocale::English, QLocale::UnitedKingdom));
|
||||
// add confidence band graphs:
|
||||
ui->customPlot->addGraph();
|
||||
QPen pen;
|
||||
pen.setStyle(Qt::DotLine);
|
||||
pen.setWidth(1);
|
||||
pen.setColor(QColor(180, 180, 180));
|
||||
ui->customPlot->graph(0)->setName("Confidence Band 68%");
|
||||
ui->customPlot->graph(0)->setPen(pen);
|
||||
ui->customPlot->graph(0)->setBrush(QBrush(QColor(255, 50, 30, 20)));
|
||||
ui->customPlot->addGraph();
|
||||
ui->customPlot->legend->removeItem(ui->customPlot->legend->itemCount() - 1); // don't show two confidence band graphs in legend
|
||||
ui->customPlot->graph(1)->setPen(pen);
|
||||
ui->customPlot->graph(0)->setChannelFillGraph(ui->customPlot->graph(1));
|
||||
// add theory curve graph:
|
||||
ui->customPlot->addGraph();
|
||||
pen.setStyle(Qt::DashLine);
|
||||
pen.setWidth(2);
|
||||
pen.setColor(Qt::red);
|
||||
ui->customPlot->graph(2)->setPen(pen);
|
||||
ui->customPlot->graph(2)->setName("Theory Curve");
|
||||
// add data point graph:
|
||||
ui->customPlot->addGraph();
|
||||
ui->customPlot->graph(3)->setPen(QPen(Qt::blue));
|
||||
ui->customPlot->graph(3)->setName("Measurement");
|
||||
ui->customPlot->graph(3)->setLineStyle(QCPGraph::lsNone);
|
||||
ui->customPlot->graph(3)->setScatterStyle(QCPScatterStyle(QCPScatterStyle::ssCross, 4));
|
||||
// add error bars:
|
||||
QCPErrorBars *errorBars = new QCPErrorBars(ui->customPlot->xAxis, ui->customPlot->yAxis);
|
||||
errorBars->removeFromLegend();
|
||||
errorBars->setAntialiased(false);
|
||||
errorBars->setDataPlottable(ui->customPlot->graph(3));
|
||||
errorBars->setPen(QPen(QColor(180, 180, 180)));
|
||||
|
||||
// generate ideal sinc curve data and some randomly perturbed data for scatter plot:
|
||||
QVector<double> x0(250), y0(250);
|
||||
QVector<double> yConfUpper(250), yConfLower(250);
|
||||
for (int i = 0; i < 250; ++i) {
|
||||
x0[i] = (i / 249.0 - 0.5) * 30 + 0.01; // by adding a small offset we make sure not do divide by zero in next code line
|
||||
y0[i] = qSin(x0[i]) / x0[i]; // sinc function
|
||||
yConfUpper[i] = y0[i] + 0.15;
|
||||
yConfLower[i] = y0[i] - 0.15;
|
||||
x0[i] *= 1000;
|
||||
}
|
||||
QVector<double> x1(50), y1(50), y1err(50);
|
||||
for (int i = 0; i < 50; ++i) {
|
||||
// generate a gaussian distributed random number:
|
||||
double tmp1 = rand() / (double)RAND_MAX;
|
||||
double tmp2 = rand() / (double)RAND_MAX;
|
||||
double r = qSqrt(-2 * qLn(tmp1)) * qCos(2 * M_PI * tmp2); // box-muller transform for gaussian distribution
|
||||
// set y1 to value of y0 plus a random gaussian pertubation:
|
||||
x1[i] = (i / 50.0 - 0.5) * 30 + 0.25;
|
||||
y1[i] = qSin(x1[i]) / x1[i] + r * 0.15;
|
||||
x1[i] *= 1000;
|
||||
y1err[i] = 0.15;
|
||||
}
|
||||
// pass data to graphs and let Qui->customPlot determine the axes ranges so the whole thing is visible:
|
||||
ui->customPlot->graph(0)->setData(x0, yConfUpper);
|
||||
ui->customPlot->graph(1)->setData(x0, yConfLower);
|
||||
ui->customPlot->graph(2)->setData(x0, y0);
|
||||
ui->customPlot->graph(3)->setData(x1, y1);
|
||||
errorBars->setData(y1err);
|
||||
ui->customPlot->graph(2)->rescaleAxes();
|
||||
ui->customPlot->graph(3)->rescaleAxes(true);
|
||||
// setup look of bottom tick labels:
|
||||
ui->customPlot->xAxis->setTickLabelRotation(30);
|
||||
ui->customPlot->xAxis->ticker()->setTickCount(9);
|
||||
ui->customPlot->xAxis->setNumberFormat("ebc");
|
||||
ui->customPlot->xAxis->setNumberPrecision(1);
|
||||
ui->customPlot->xAxis->moveRange(-10);
|
||||
// make top right axes clones of bottom left axes. Looks prettier:
|
||||
ui->customPlot->axisRect()->setupFullAxesBox();
|
||||
ui->customPlot->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom);
|
||||
}
|
|
@ -0,0 +1,25 @@
|
|||
#ifndef FRMSINCSCATTER_H
|
||||
#define FRMSINCSCATTER_H
|
||||
|
||||
#include <QWidget>
|
||||
|
||||
namespace Ui {
|
||||
class frmSincScatter;
|
||||
}
|
||||
|
||||
class frmSincScatter : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit frmSincScatter(QWidget *parent = 0);
|
||||
~frmSincScatter();
|
||||
|
||||
private:
|
||||
Ui::frmSincScatter *ui;
|
||||
|
||||
private slots:
|
||||
void initForm();
|
||||
};
|
||||
|
||||
#endif // FRMSINCSCATTER_H
|
|
@ -0,0 +1,44 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>frmSincScatter</class>
|
||||
<widget class="QWidget" name="frmSincScatter">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>400</width>
|
||||
<height>300</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Form</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QCustomPlot" name="customPlot" native="true"/>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
<class>QCustomPlot</class>
|
||||
<extends>QWidget</extends>
|
||||
<header location="global">qcustomplot.h</header>
|
||||
<container>1</container>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
|
@ -0,0 +1,44 @@
|
|||
#include "frmstatistical.h"
|
||||
#include "ui_frmstatistical.h"
|
||||
#include "qdebug.h"
|
||||
|
||||
frmStatistical::frmStatistical(QWidget *parent) : QWidget(parent), ui(new Ui::frmStatistical)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
this->initForm();
|
||||
}
|
||||
|
||||
frmStatistical::~frmStatistical()
|
||||
{
|
||||
delete ui;
|
||||
}
|
||||
|
||||
void frmStatistical::initForm()
|
||||
{
|
||||
QCPStatisticalBox *statistical = new QCPStatisticalBox(ui->customPlot->xAxis, ui->customPlot->yAxis);
|
||||
QBrush boxBrush(QColor(60, 60, 255, 100));
|
||||
boxBrush.setStyle(Qt::Dense6Pattern); // make it look oldschool
|
||||
statistical->setBrush(boxBrush);
|
||||
|
||||
// specify data:
|
||||
statistical->addData(1, 1.1, 1.9, 2.25, 2.7, 4.2);
|
||||
statistical->addData(2, 0.8, 1.6, 2.2, 3.2, 4.9, QVector<double>() << 0.7 << 0.34 << 0.45 << 6.2 << 5.84); // provide some outliers as QVector
|
||||
statistical->addData(3, 0.2, 0.7, 1.1, 1.6, 2.9);
|
||||
|
||||
// prepare manual x axis labels:
|
||||
ui->customPlot->xAxis->setSubTicks(false);
|
||||
ui->customPlot->xAxis->setTickLength(0, 4);
|
||||
ui->customPlot->xAxis->setTickLabelRotation(20);
|
||||
QSharedPointer<QCPAxisTickerText> textTicker(new QCPAxisTickerText);
|
||||
textTicker->addTick(1, "Sample 1");
|
||||
textTicker->addTick(2, "Sample 2");
|
||||
textTicker->addTick(3, "Control Group");
|
||||
ui->customPlot->xAxis->setTicker(textTicker);
|
||||
|
||||
// prepare axes:
|
||||
ui->customPlot->yAxis->setLabel(QString::fromUtf8("O? Absorption [mg]"));
|
||||
ui->customPlot->rescaleAxes();
|
||||
ui->customPlot->xAxis->scaleRange(1.7, ui->customPlot->xAxis->range().center());
|
||||
ui->customPlot->yAxis->setRange(0, 7);
|
||||
ui->customPlot->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom);
|
||||
}
|
|
@ -0,0 +1,25 @@
|
|||
#ifndef FRMSTATISTICAL_H
|
||||
#define FRMSTATISTICAL_H
|
||||
|
||||
#include <QWidget>
|
||||
|
||||
namespace Ui {
|
||||
class frmStatistical;
|
||||
}
|
||||
|
||||
class frmStatistical : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit frmStatistical(QWidget *parent = 0);
|
||||
~frmStatistical();
|
||||
|
||||
private:
|
||||
Ui::frmStatistical *ui;
|
||||
|
||||
private slots:
|
||||
void initForm();
|
||||
};
|
||||
|
||||
#endif // FRMSTATISTICAL_H
|
|
@ -0,0 +1,44 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>frmStatistical</class>
|
||||
<widget class="QWidget" name="frmStatistical">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>400</width>
|
||||
<height>300</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Form</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QCustomPlot" name="customPlot" native="true"/>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
<class>QCustomPlot</class>
|
||||
<extends>QWidget</extends>
|
||||
<header location="global">qcustomplot.h</header>
|
||||
<container>1</container>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
|
@ -0,0 +1,111 @@
|
|||
#include "frmstyled.h"
|
||||
#include "ui_frmstyled.h"
|
||||
#include "qdebug.h"
|
||||
|
||||
frmStyled::frmStyled(QWidget *parent) : QWidget(parent), ui(new Ui::frmStyled)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
this->initForm();
|
||||
}
|
||||
|
||||
frmStyled::~frmStyled()
|
||||
{
|
||||
delete ui;
|
||||
}
|
||||
|
||||
void frmStyled::initForm()
|
||||
{
|
||||
// prepare data:
|
||||
QVector<double> x1(20), y1(20);
|
||||
QVector<double> x2(100), y2(100);
|
||||
QVector<double> x3(20), y3(20);
|
||||
QVector<double> x4(20), y4(20);
|
||||
for (int i = 0; i < x1.size(); ++i) {
|
||||
x1[i] = i / (double)(x1.size() - 1) * 10;
|
||||
y1[i] = qCos(x1[i] * 0.8 + qSin(x1[i] * 0.16 + 1.0)) * qSin(x1[i] * 0.54) + 1.4;
|
||||
}
|
||||
for (int i = 0; i < x2.size(); ++i) {
|
||||
x2[i] = i / (double)(x2.size() - 1) * 10;
|
||||
y2[i] = qCos(x2[i] * 0.85 + qSin(x2[i] * 0.165 + 1.1)) * qSin(x2[i] * 0.50) + 1.7;
|
||||
}
|
||||
for (int i = 0; i < x3.size(); ++i) {
|
||||
x3[i] = i / (double)(x3.size() - 1) * 10;
|
||||
y3[i] = 0.05 + 3 * (0.5 + qCos(x3[i] * x3[i] * 0.2 + 2) * 0.5) / (double)(x3[i] + 0.7) + std::rand() / (double)RAND_MAX * 0.01;
|
||||
}
|
||||
for (int i = 0; i < x4.size(); ++i) {
|
||||
x4[i] = x3[i];
|
||||
y4[i] = (0.5 - y3[i]) + ((x4[i] - 2) * (x4[i] - 2) * 0.02);
|
||||
}
|
||||
|
||||
// create and configure plottables:
|
||||
QCPGraph *graph1 = ui->customPlot->addGraph();
|
||||
graph1->setData(x1, y1);
|
||||
graph1->setScatterStyle(QCPScatterStyle(QCPScatterStyle::ssCircle, QPen(Qt::black, 1.5), QBrush(Qt::white), 9));
|
||||
graph1->setPen(QPen(QColor(120, 120, 120), 2));
|
||||
|
||||
QCPGraph *graph2 = ui->customPlot->addGraph();
|
||||
graph2->setData(x2, y2);
|
||||
graph2->setPen(Qt::NoPen);
|
||||
graph2->setBrush(QColor(200, 200, 200, 20));
|
||||
graph2->setChannelFillGraph(graph1);
|
||||
|
||||
QCPBars *bars1 = new QCPBars(ui->customPlot->xAxis, ui->customPlot->yAxis);
|
||||
bars1->setWidth(9 / (double)x3.size());
|
||||
bars1->setData(x3, y3);
|
||||
bars1->setPen(Qt::NoPen);
|
||||
bars1->setBrush(QColor(10, 140, 70, 160));
|
||||
|
||||
QCPBars *bars2 = new QCPBars(ui->customPlot->xAxis, ui->customPlot->yAxis);
|
||||
bars2->setWidth(9 / (double)x4.size());
|
||||
bars2->setData(x4, y4);
|
||||
bars2->setPen(Qt::NoPen);
|
||||
bars2->setBrush(QColor(10, 100, 50, 70));
|
||||
bars2->moveAbove(bars1);
|
||||
|
||||
// move bars above graphs and grid below bars:
|
||||
ui->customPlot->addLayer("abovemain", ui->customPlot->layer("main"), QCustomPlot::limAbove);
|
||||
ui->customPlot->addLayer("belowmain", ui->customPlot->layer("main"), QCustomPlot::limBelow);
|
||||
graph1->setLayer("abovemain");
|
||||
ui->customPlot->xAxis->grid()->setLayer("belowmain");
|
||||
ui->customPlot->yAxis->grid()->setLayer("belowmain");
|
||||
|
||||
// set some pens, brushes and backgrounds:
|
||||
ui->customPlot->xAxis->setBasePen(QPen(Qt::white, 1));
|
||||
ui->customPlot->yAxis->setBasePen(QPen(Qt::white, 1));
|
||||
ui->customPlot->xAxis->setTickPen(QPen(Qt::white, 1));
|
||||
ui->customPlot->yAxis->setTickPen(QPen(Qt::white, 1));
|
||||
ui->customPlot->xAxis->setSubTickPen(QPen(Qt::white, 1));
|
||||
ui->customPlot->yAxis->setSubTickPen(QPen(Qt::white, 1));
|
||||
ui->customPlot->xAxis->setTickLabelColor(Qt::white);
|
||||
ui->customPlot->yAxis->setTickLabelColor(Qt::white);
|
||||
|
||||
ui->customPlot->xAxis->grid()->setPen(QPen(QColor(140, 140, 140), 1, Qt::DotLine));
|
||||
ui->customPlot->yAxis->grid()->setPen(QPen(QColor(140, 140, 140), 1, Qt::DotLine));
|
||||
ui->customPlot->xAxis->grid()->setSubGridPen(QPen(QColor(80, 80, 80), 1, Qt::DotLine));
|
||||
ui->customPlot->yAxis->grid()->setSubGridPen(QPen(QColor(80, 80, 80), 1, Qt::DotLine));
|
||||
ui->customPlot->xAxis->grid()->setSubGridVisible(true);
|
||||
ui->customPlot->yAxis->grid()->setSubGridVisible(true);
|
||||
ui->customPlot->xAxis->grid()->setZeroLinePen(Qt::NoPen);
|
||||
ui->customPlot->yAxis->grid()->setZeroLinePen(Qt::NoPen);
|
||||
|
||||
ui->customPlot->xAxis->setUpperEnding(QCPLineEnding::esSpikeArrow);
|
||||
ui->customPlot->yAxis->setUpperEnding(QCPLineEnding::esSpikeArrow);
|
||||
|
||||
QLinearGradient plotGradient;
|
||||
plotGradient.setStart(0, 0);
|
||||
plotGradient.setFinalStop(0, 350);
|
||||
plotGradient.setColorAt(0, QColor(80, 80, 80));
|
||||
plotGradient.setColorAt(1, QColor(50, 50, 50));
|
||||
ui->customPlot->setBackground(plotGradient);
|
||||
|
||||
QLinearGradient axisRectGradient;
|
||||
axisRectGradient.setStart(0, 0);
|
||||
axisRectGradient.setFinalStop(0, 350);
|
||||
axisRectGradient.setColorAt(0, QColor(80, 80, 80));
|
||||
axisRectGradient.setColorAt(1, QColor(30, 30, 30));
|
||||
ui->customPlot->axisRect()->setBackground(axisRectGradient);
|
||||
|
||||
ui->customPlot->rescaleAxes();
|
||||
ui->customPlot->yAxis->setRange(0, 2);
|
||||
ui->customPlot->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom);
|
||||
}
|
|
@ -0,0 +1,25 @@
|
|||
#ifndef FRMSTYLED_H
|
||||
#define FRMSTYLED_H
|
||||
|
||||
#include <QWidget>
|
||||
|
||||
namespace Ui {
|
||||
class frmStyled;
|
||||
}
|
||||
|
||||
class frmStyled : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit frmStyled(QWidget *parent = 0);
|
||||
~frmStyled();
|
||||
|
||||
private:
|
||||
Ui::frmStyled *ui;
|
||||
|
||||
private slots:
|
||||
void initForm();
|
||||
};
|
||||
|
||||
#endif // FRMSTYLED_H
|
|
@ -0,0 +1,44 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>frmStyled</class>
|
||||
<widget class="QWidget" name="frmStyled">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>400</width>
|
||||
<height>300</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Form</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QCustomPlot" name="customPlot" native="true"/>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
<class>QCustomPlot</class>
|
||||
<extends>QWidget</extends>
|
||||
<header location="global">qcustomplot.h</header>
|
||||
<container>1</container>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
|
@ -0,0 +1,19 @@
|
|||
#include "frmtest.h"
|
||||
#include "ui_frmtest.h"
|
||||
#include "qdebug.h"
|
||||
|
||||
frmTest::frmTest(QWidget *parent) : QWidget(parent), ui(new Ui::frmTest)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
this->initForm();
|
||||
}
|
||||
|
||||
frmTest::~frmTest()
|
||||
{
|
||||
delete ui;
|
||||
}
|
||||
|
||||
void frmTest::initForm()
|
||||
{
|
||||
|
||||
}
|
|
@ -0,0 +1,25 @@
|
|||
#ifndef FRMTEST_H
|
||||
#define FRMTEST_H
|
||||
|
||||
#include <QWidget>
|
||||
|
||||
namespace Ui {
|
||||
class frmTest;
|
||||
}
|
||||
|
||||
class frmTest : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit frmTest(QWidget *parent = 0);
|
||||
~frmTest();
|
||||
|
||||
private:
|
||||
Ui::frmTest *ui;
|
||||
|
||||
private slots:
|
||||
void initForm();
|
||||
};
|
||||
|
||||
#endif // FRMTEST_H
|
|
@ -0,0 +1,44 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>frmTest</class>
|
||||
<widget class="QWidget" name="frmTest">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>400</width>
|
||||
<height>300</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Form</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QCustomPlot" name="customPlot" native="true"/>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
<class>QCustomPlot</class>
|
||||
<extends>QWidget</extends>
|
||||
<header location="global">qcustomplot.h</header>
|
||||
<container>1</container>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
|
@ -0,0 +1,58 @@
|
|||
#include "frmtexturebrush.h"
|
||||
#include "ui_frmtexturebrush.h"
|
||||
#include "qdebug.h"
|
||||
|
||||
frmTextureBrush::frmTextureBrush(QWidget *parent) : QWidget(parent), ui(new Ui::frmTextureBrush)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
this->initForm();
|
||||
}
|
||||
|
||||
frmTextureBrush::~frmTextureBrush()
|
||||
{
|
||||
delete ui;
|
||||
}
|
||||
|
||||
void frmTextureBrush::initForm()
|
||||
{
|
||||
// add two graphs with a textured fill:
|
||||
ui->customPlot->addGraph();
|
||||
QPen redDotPen;
|
||||
redDotPen.setStyle(Qt::DotLine);
|
||||
redDotPen.setColor(QColor(170, 100, 100, 180));
|
||||
redDotPen.setWidthF(2);
|
||||
ui->customPlot->graph(0)->setPen(redDotPen);
|
||||
ui->customPlot->graph(0)->setBrush(QBrush(QPixmap(":/image/bg2.jpg"))); // fill with texture of specified image
|
||||
|
||||
ui->customPlot->addGraph();
|
||||
ui->customPlot->graph(1)->setPen(QPen(Qt::red));
|
||||
|
||||
// activate channel fill for graph 0 towards graph 1:
|
||||
ui->customPlot->graph(0)->setChannelFillGraph(ui->customPlot->graph(1));
|
||||
|
||||
// generate data:
|
||||
QVector<double> x(250);
|
||||
QVector<double> y0(250), y1(250);
|
||||
for (int i = 0; i < 250; ++i) {
|
||||
// just playing with numbers, not much to learn here
|
||||
x[i] = 3 * i / 250.0;
|
||||
y0[i] = 1 + qExp(-x[i] * x[i] * 0.8) * (x[i] * x[i] + x[i]);
|
||||
y1[i] = 1 - qExp(-x[i] * x[i] * 0.4) * (x[i] * x[i]) * 0.1;
|
||||
}
|
||||
|
||||
// pass data points to graphs:
|
||||
ui->customPlot->graph(0)->setData(x, y0);
|
||||
ui->customPlot->graph(1)->setData(x, y1);
|
||||
// activate top and right axes, which are invisible by default:
|
||||
ui->customPlot->xAxis2->setVisible(true);
|
||||
ui->customPlot->yAxis2->setVisible(true);
|
||||
// make tick labels invisible on top and right axis:
|
||||
ui->customPlot->xAxis2->setTickLabels(false);
|
||||
ui->customPlot->yAxis2->setTickLabels(false);
|
||||
// set ranges:
|
||||
ui->customPlot->xAxis->setRange(0, 2.5);
|
||||
ui->customPlot->yAxis->setRange(0.9, 1.6);
|
||||
// assign top/right axes same properties as bottom/left:
|
||||
ui->customPlot->axisRect()->setupFullAxesBox();
|
||||
ui->customPlot->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom);
|
||||
}
|
|
@ -0,0 +1,25 @@
|
|||
#ifndef FRMTEXTUREBRUSH_H
|
||||
#define FRMTEXTUREBRUSH_H
|
||||
|
||||
#include <QWidget>
|
||||
|
||||
namespace Ui {
|
||||
class frmTextureBrush;
|
||||
}
|
||||
|
||||
class frmTextureBrush : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit frmTextureBrush(QWidget *parent = 0);
|
||||
~frmTextureBrush();
|
||||
|
||||
private:
|
||||
Ui::frmTextureBrush *ui;
|
||||
|
||||
private slots:
|
||||
void initForm();
|
||||
};
|
||||
|
||||
#endif // FRMTEXTUREBRUSH_H
|
|
@ -0,0 +1,44 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>frmTextureBrush</class>
|
||||
<widget class="QWidget" name="frmTextureBrush">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>400</width>
|
||||
<height>300</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Form</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QCustomPlot" name="customPlot" native="true"/>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
<class>QCustomPlot</class>
|
||||
<extends>QWidget</extends>
|
||||
<header location="global">qcustomplot.h</header>
|
||||
<container>1</container>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
|
@ -0,0 +1,359 @@
|
|||
#include "iconhelper.h"
|
||||
|
||||
IconHelper *IconHelper::iconFontAliBaBa = 0;
|
||||
IconHelper *IconHelper::iconFontAwesome = 0;
|
||||
IconHelper *IconHelper::iconFontWeather = 0;
|
||||
int IconHelper::iconFontIndex = -1;
|
||||
|
||||
void IconHelper::initFont()
|
||||
{
|
||||
static bool isInit = false;
|
||||
if (!isInit) {
|
||||
isInit = true;
|
||||
if (iconFontAliBaBa == 0) {
|
||||
iconFontAliBaBa = new IconHelper(":/font/iconfont.ttf", "iconfont");
|
||||
}
|
||||
if (iconFontAwesome == 0) {
|
||||
iconFontAwesome = new IconHelper(":/font/fontawesome-webfont.ttf", "FontAwesome");
|
||||
}
|
||||
if (iconFontWeather == 0) {
|
||||
iconFontWeather = new IconHelper(":/font/pe-icon-set-weather.ttf", "pe-icon-set-weather");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
QFont IconHelper::getIconFontAliBaBa()
|
||||
{
|
||||
initFont();
|
||||
return iconFontAliBaBa->getIconFont();
|
||||
}
|
||||
|
||||
QFont IconHelper::getIconFontAwesome()
|
||||
{
|
||||
initFont();
|
||||
return iconFontAwesome->getIconFont();
|
||||
}
|
||||
|
||||
QFont IconHelper::getIconFontWeather()
|
||||
{
|
||||
initFont();
|
||||
return iconFontWeather->getIconFont();
|
||||
}
|
||||
|
||||
IconHelper *IconHelper::getIconHelper(int icon)
|
||||
{
|
||||
initFont();
|
||||
|
||||
//指定了字体索引则取对应索引的字体类
|
||||
//没指定则自动根据不同的字体的值选择对应的类
|
||||
//由于部分值范围冲突所以可以指定索引来取
|
||||
//fontawesome 0xf000-0xf2e0
|
||||
//iconfont 0xe501-0xe793 0xe8d5-0xea5d
|
||||
//weather 0xe900-0xe9cf
|
||||
|
||||
IconHelper *iconHelper = iconFontAwesome;
|
||||
if (iconFontIndex < 0) {
|
||||
if ((icon > 0xe501 && icon < 0xe793) || (icon > 0xe8d5 && icon < 0xea5d)) {
|
||||
iconHelper = iconFontAliBaBa;
|
||||
}
|
||||
} else if (iconFontIndex == 0) {
|
||||
iconHelper = iconFontAliBaBa;
|
||||
} else if (iconFontIndex == 1) {
|
||||
iconHelper = iconFontAwesome;
|
||||
} else if (iconFontIndex == 2) {
|
||||
iconHelper = iconFontWeather;
|
||||
}
|
||||
|
||||
return iconHelper;
|
||||
}
|
||||
|
||||
void IconHelper::setIcon(QLabel *lab, int icon, quint32 size)
|
||||
{
|
||||
getIconHelper(icon)->setIcon1(lab, icon, size);
|
||||
}
|
||||
|
||||
void IconHelper::setIcon(QAbstractButton *btn, int icon, quint32 size)
|
||||
{
|
||||
getIconHelper(icon)->setIcon1(btn, icon, size);
|
||||
}
|
||||
|
||||
void IconHelper::setPixmap(QAbstractButton *btn, const QColor &color, int icon, quint32 size,
|
||||
quint32 width, quint32 height, int flags)
|
||||
{
|
||||
getIconHelper(icon)->setPixmap1(btn, color, icon, size, width, height, flags);
|
||||
}
|
||||
|
||||
QPixmap IconHelper::getPixmap(const QColor &color, int icon, quint32 size,
|
||||
quint32 width, quint32 height, int flags)
|
||||
{
|
||||
return getIconHelper(icon)->getPixmap1(color, icon, size, width, height, flags);
|
||||
}
|
||||
|
||||
void IconHelper::setStyle(QWidget *widget, QList<QPushButton *> btns,
|
||||
QList<int> icons, const IconHelper::StyleColor &styleColor)
|
||||
{
|
||||
int icon = icons.first();
|
||||
getIconHelper(icon)->setStyle1(widget, btns, icons, styleColor);
|
||||
}
|
||||
|
||||
void IconHelper::setStyle(QWidget *widget, QList<QToolButton *> btns,
|
||||
QList<int> icons, const IconHelper::StyleColor &styleColor)
|
||||
{
|
||||
int icon = icons.first();
|
||||
getIconHelper(icon)->setStyle1(widget, btns, icons, styleColor);
|
||||
}
|
||||
|
||||
void IconHelper::setStyle(QWidget *widget, QList<QAbstractButton *> btns,
|
||||
QList<int> icons, const IconHelper::StyleColor &styleColor)
|
||||
{
|
||||
int icon = icons.first();
|
||||
getIconHelper(icon)->setStyle1(widget, btns, icons, styleColor);
|
||||
}
|
||||
|
||||
|
||||
IconHelper::IconHelper(const QString &fontFile, const QString &fontName, QObject *parent) : QObject(parent)
|
||||
{
|
||||
//判断图形字体是否存在,不存在则加入
|
||||
QFontDatabase fontDb;
|
||||
if (!fontDb.families().contains(fontName)) {
|
||||
int fontId = fontDb.addApplicationFont(fontFile);
|
||||
QStringList listName = fontDb.applicationFontFamilies(fontId);
|
||||
if (listName.count() == 0) {
|
||||
qDebug() << QString("load %1 error").arg(fontName);
|
||||
}
|
||||
}
|
||||
|
||||
//再次判断是否包含字体名称防止加载失败
|
||||
if (fontDb.families().contains(fontName)) {
|
||||
iconFont = QFont(fontName);
|
||||
#if (QT_VERSION >= QT_VERSION_CHECK(4,8,0))
|
||||
iconFont.setHintingPreference(QFont::PreferNoHinting);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
bool IconHelper::eventFilter(QObject *watched, QEvent *event)
|
||||
{
|
||||
//根据不同的
|
||||
if (watched->inherits("QAbstractButton")) {
|
||||
QAbstractButton *btn = (QAbstractButton *)watched;
|
||||
int index = btns.indexOf(btn);
|
||||
if (index >= 0) {
|
||||
//不同的事件设置不同的图标,同时区分选中的和没有选中的
|
||||
if (btn->isChecked()) {
|
||||
if (event->type() == QEvent::MouseButtonPress) {
|
||||
QMouseEvent *mouseEvent = (QMouseEvent *)event;
|
||||
if (mouseEvent->button() == Qt::LeftButton) {
|
||||
btn->setIcon(QIcon(pixChecked.at(index)));
|
||||
}
|
||||
} else if (event->type() == QEvent::Enter) {
|
||||
btn->setIcon(QIcon(pixChecked.at(index)));
|
||||
} else if (event->type() == QEvent::Leave) {
|
||||
btn->setIcon(QIcon(pixChecked.at(index)));
|
||||
}
|
||||
} else {
|
||||
if (event->type() == QEvent::MouseButtonPress) {
|
||||
QMouseEvent *mouseEvent = (QMouseEvent *)event;
|
||||
if (mouseEvent->button() == Qt::LeftButton) {
|
||||
btn->setIcon(QIcon(pixPressed.at(index)));
|
||||
}
|
||||
} else if (event->type() == QEvent::Enter) {
|
||||
btn->setIcon(QIcon(pixHover.at(index)));
|
||||
} else if (event->type() == QEvent::Leave) {
|
||||
btn->setIcon(QIcon(pixNormal.at(index)));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return QObject::eventFilter(watched, event);
|
||||
}
|
||||
|
||||
void IconHelper::toggled(bool checked)
|
||||
{
|
||||
//选中和不选中设置不同的图标
|
||||
QAbstractButton *btn = (QAbstractButton *)sender();
|
||||
int index = btns.indexOf(btn);
|
||||
if (checked) {
|
||||
btn->setIcon(QIcon(pixChecked.at(index)));
|
||||
} else {
|
||||
btn->setIcon(QIcon(pixNormal.at(index)));
|
||||
}
|
||||
}
|
||||
|
||||
QFont IconHelper::getIconFont()
|
||||
{
|
||||
return this->iconFont;
|
||||
}
|
||||
|
||||
void IconHelper::setIcon1(QLabel *lab, int icon, quint32 size)
|
||||
{
|
||||
iconFont.setPixelSize(size);
|
||||
lab->setFont(iconFont);
|
||||
lab->setText((QChar)icon);
|
||||
}
|
||||
|
||||
void IconHelper::setIcon1(QAbstractButton *btn, int icon, quint32 size)
|
||||
{
|
||||
iconFont.setPixelSize(size);
|
||||
btn->setFont(iconFont);
|
||||
btn->setText((QChar)icon);
|
||||
}
|
||||
|
||||
void IconHelper::setPixmap1(QAbstractButton *btn, const QColor &color, int icon, quint32 size,
|
||||
quint32 width, quint32 height, int flags)
|
||||
{
|
||||
btn->setIcon(getPixmap1(color, icon, size, width, height, flags));
|
||||
}
|
||||
|
||||
QPixmap IconHelper::getPixmap1(const QColor &color, int icon, quint32 size,
|
||||
quint32 width, quint32 height, int flags)
|
||||
{
|
||||
//主动绘制图形字体到图片
|
||||
QPixmap pix(width, height);
|
||||
pix.fill(Qt::transparent);
|
||||
|
||||
QPainter painter;
|
||||
painter.begin(&pix);
|
||||
painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);
|
||||
painter.setPen(color);
|
||||
|
||||
iconFont.setPixelSize(size);
|
||||
painter.setFont(iconFont);
|
||||
painter.drawText(pix.rect(), flags, (QChar)icon);
|
||||
painter.end();
|
||||
return pix;
|
||||
}
|
||||
|
||||
void IconHelper::setStyle1(QWidget *widget, QList<QPushButton *> btns, QList<int> icons, const IconHelper::StyleColor &styleColor)
|
||||
{
|
||||
QList<QAbstractButton *> list;
|
||||
foreach (QPushButton *btn, btns) {
|
||||
list << btn;
|
||||
}
|
||||
|
||||
setStyle(widget, list, icons, styleColor);
|
||||
}
|
||||
|
||||
void IconHelper::setStyle1(QWidget *widget, QList<QToolButton *> btns, QList<int> icons, const IconHelper::StyleColor &styleColor)
|
||||
{
|
||||
QList<QAbstractButton *> list;
|
||||
foreach (QToolButton *btn, btns) {
|
||||
list << btn;
|
||||
}
|
||||
|
||||
setStyle(widget, list, icons, styleColor);
|
||||
}
|
||||
|
||||
void IconHelper::setStyle1(QWidget *widget, QList<QAbstractButton *> btns, QList<int> icons, const IconHelper::StyleColor &styleColor)
|
||||
{
|
||||
int btnCount = btns.count();
|
||||
int iconCount = icons.count();
|
||||
if (btnCount <= 0 || iconCount <= 0 || btnCount != iconCount) {
|
||||
return;
|
||||
}
|
||||
|
||||
QString position = styleColor.position;
|
||||
quint32 iconSize = styleColor.iconSize;
|
||||
quint32 iconWidth = styleColor.iconWidth;
|
||||
quint32 iconHeight = styleColor.iconHeight;
|
||||
quint32 borderWidth = styleColor.borderWidth;
|
||||
|
||||
//根据不同的位置计算边框
|
||||
QString strBorder;
|
||||
if (position == "top") {
|
||||
strBorder = QString("border-width:%1px 0px 0px 0px;padding-top:%1px;padding-bottom:%2px;")
|
||||
.arg(borderWidth).arg(borderWidth * 2);
|
||||
} else if (position == "right") {
|
||||
strBorder = QString("border-width:0px %1px 0px 0px;padding-right:%1px;padding-left:%2px;")
|
||||
.arg(borderWidth).arg(borderWidth * 2);
|
||||
} else if (position == "bottom") {
|
||||
strBorder = QString("border-width:0px 0px %1px 0px;padding-bottom:%1px;padding-top:%2px;")
|
||||
.arg(borderWidth).arg(borderWidth * 2);
|
||||
} else if (position == "left") {
|
||||
strBorder = QString("border-width:0px 0px 0px %1px;padding-left:%1px;padding-right:%2px;")
|
||||
.arg(borderWidth).arg(borderWidth * 2);
|
||||
}
|
||||
|
||||
//如果图标是左侧显示则需要让没有选中的按钮左侧也有加深的边框,颜色为背景颜色
|
||||
//如果图标在文字上面而设置的边框是 top bottom 也需要启用加深边框
|
||||
QStringList qss;
|
||||
if (styleColor.defaultBorder) {
|
||||
qss << QString("QWidget[flag=\"%1\"] QAbstractButton{border-style:solid;border-radius:0px;%2border-color:%3;color:%4;background:%5;}")
|
||||
.arg(position).arg(strBorder).arg(styleColor.normalBgColor).arg(styleColor.normalTextColor).arg(styleColor.normalBgColor);
|
||||
} else {
|
||||
qss << QString("QWidget[flag=\"%1\"] QAbstractButton{border-style:none;border-radius:0px;padding:5px;color:%2;background:%3;}")
|
||||
.arg(position).arg(styleColor.normalTextColor).arg(styleColor.normalBgColor);
|
||||
}
|
||||
|
||||
//悬停+按下+选中
|
||||
qss << QString("QWidget[flag=\"%1\"] QAbstractButton:hover{border-style:solid;%2border-color:%3;color:%4;background:%5;}")
|
||||
.arg(position).arg(strBorder).arg(styleColor.borderColor).arg(styleColor.hoverTextColor).arg(styleColor.hoverBgColor);
|
||||
qss << QString("QWidget[flag=\"%1\"] QAbstractButton:pressed{border-style:solid;%2border-color:%3;color:%4;background:%5;}")
|
||||
.arg(position).arg(strBorder).arg(styleColor.borderColor).arg(styleColor.pressedTextColor).arg(styleColor.pressedBgColor);
|
||||
qss << QString("QWidget[flag=\"%1\"] QAbstractButton:checked{border-style:solid;%2border-color:%3;color:%4;background:%5;}")
|
||||
.arg(position).arg(strBorder).arg(styleColor.borderColor).arg(styleColor.checkedTextColor).arg(styleColor.checkedBgColor);
|
||||
|
||||
//窗体背景颜色+按钮背景颜色
|
||||
qss << QString("QWidget#%1{background:%2;}")
|
||||
.arg(widget->objectName()).arg(styleColor.normalBgColor);
|
||||
qss << QString("QWidget>QAbstractButton{border-width:0px;background-color:%1;color:%2;}")
|
||||
.arg(styleColor.normalBgColor).arg(styleColor.normalTextColor);
|
||||
qss << QString("QWidget>QAbstractButton:hover{background-color:%1;color:%2;}")
|
||||
.arg(styleColor.hoverBgColor).arg(styleColor.hoverTextColor);
|
||||
qss << QString("QWidget>QAbstractButton:pressed{background-color:%1;color:%2;}")
|
||||
.arg(styleColor.pressedBgColor).arg(styleColor.pressedTextColor);
|
||||
qss << QString("QWidget>QAbstractButton:checked{background-color:%1;color:%2;}")
|
||||
.arg(styleColor.checkedBgColor).arg(styleColor.checkedTextColor);
|
||||
|
||||
//设置样式表
|
||||
widget->setStyleSheet(qss.join(""));
|
||||
|
||||
//可能会重复调用设置所以先要移除上一次的
|
||||
for (int i = 0; i < btnCount; i++) {
|
||||
for (int j = 0; j < this->btns.count(); j++) {
|
||||
if (this->btns.at(j) == btns.at(i)) {
|
||||
disconnect(btns.at(i), SIGNAL(toggled(bool)), this, SLOT(toggled(bool)));
|
||||
this->btns.at(j)->removeEventFilter(this);
|
||||
this->btns.removeAt(j);
|
||||
this->pixNormal.removeAt(j);
|
||||
this->pixHover.removeAt(j);
|
||||
this->pixPressed.removeAt(j);
|
||||
this->pixChecked.removeAt(j);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//存储对应按钮对象,方便鼠标移上去的时候切换图片
|
||||
int checkedIndex = -1;
|
||||
for (int i = 0; i < btnCount; i++) {
|
||||
int icon = icons.at(i);
|
||||
QPixmap pixNormal = getPixmap1(styleColor.normalTextColor, icon, iconSize, iconWidth, iconHeight);
|
||||
QPixmap pixHover = getPixmap1(styleColor.hoverTextColor, icon, iconSize, iconWidth, iconHeight);
|
||||
QPixmap pixPressed = getPixmap1(styleColor.pressedTextColor, icon, iconSize, iconWidth, iconHeight);
|
||||
QPixmap pixChecked = getPixmap1(styleColor.checkedTextColor, icon, iconSize, iconWidth, iconHeight);
|
||||
|
||||
//记住最后选中的按钮
|
||||
QAbstractButton *btn = btns.at(i);
|
||||
if (btn->isChecked()) {
|
||||
checkedIndex = i;
|
||||
}
|
||||
|
||||
btn->setIcon(QIcon(pixNormal));
|
||||
btn->setIconSize(QSize(iconWidth, iconHeight));
|
||||
btn->installEventFilter(this);
|
||||
connect(btn, SIGNAL(toggled(bool)), this, SLOT(toggled(bool)));
|
||||
|
||||
this->btns << btn;
|
||||
this->pixNormal << pixNormal;
|
||||
this->pixHover << pixHover;
|
||||
this->pixPressed << pixPressed;
|
||||
this->pixChecked << pixChecked;
|
||||
}
|
||||
|
||||
//主动触发一下选中的按钮
|
||||
if (checkedIndex >= 0) {
|
||||
QMetaObject::invokeMethod(btns.at(checkedIndex), "toggled", Q_ARG(bool, true));
|
||||
}
|
||||
}
|
|
@ -0,0 +1,176 @@
|
|||
#ifndef ICONHELPER_H
|
||||
#define ICONHELPER_H
|
||||
|
||||
/**
|
||||
* 超级图形字体类 作者:feiyangqingyun(QQ:517216493) 2016-11-23
|
||||
* 1. 可传入多种图形字体文件,一个类通用所有图形字体。
|
||||
* 2. 默认已经内置了阿里巴巴图形字体FontAliBaBa、国际知名图形字体FontAwesome、天气图形字体FontWeather。
|
||||
* 3. 可设置 QLabel、QAbstractButton 文本为图形字体。
|
||||
* 4. 可设置图形字体作为 QAbstractButton 按钮图标。
|
||||
* 5. 内置万能的方法 getPixmap 将图形字体值转换为图片。
|
||||
* 6. 无论是设置文本、图标、图片等都可以设置图标的大小、尺寸、颜色等参数。
|
||||
* 7. 内置超级导航栏样式设置,将图形字体作为图标设置到按钮。
|
||||
* 8. 支持各种颜色设置比如正常颜色、悬停颜色、按下颜色、选中颜色。
|
||||
* 9. 可设置导航的位置为 left、right、top、bottom 四种。
|
||||
* 10. 可设置导航加深边框颜色和粗细大小。
|
||||
* 11. 导航面板的各种切换效果比如鼠标悬停、按下、选中等都自动处理掉样式设置。
|
||||
* 12. 全局静态方法,接口丰富,使用极其简单方便。
|
||||
*/
|
||||
|
||||
#include <QtGui>
|
||||
#if (QT_VERSION >= QT_VERSION_CHECK(5,0,0))
|
||||
#include <QtWidgets>
|
||||
#endif
|
||||
|
||||
#ifdef quc
|
||||
class Q_DECL_EXPORT IconHelper : public QObject
|
||||
#else
|
||||
class IconHelper : public QObject
|
||||
#endif
|
||||
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
//样式颜色结构体
|
||||
struct StyleColor {
|
||||
QString position; //位置 left right top bottom
|
||||
bool defaultBorder; //默认有边框
|
||||
|
||||
quint32 iconSize; //图标字体尺寸
|
||||
quint32 iconWidth; //图标图片宽度
|
||||
quint32 iconHeight; //图标图片高度
|
||||
|
||||
quint32 borderWidth; //边框宽度
|
||||
QString borderColor; //边框颜色
|
||||
|
||||
QString normalBgColor; //正常背景颜色
|
||||
QString normalTextColor; //正常文字颜色
|
||||
QString hoverBgColor; //悬停背景颜色
|
||||
QString hoverTextColor; //悬停文字颜色
|
||||
QString pressedBgColor; //按下背景颜色
|
||||
QString pressedTextColor; //按下文字颜色
|
||||
QString checkedBgColor; //选中背景颜色
|
||||
QString checkedTextColor; //选中文字颜色
|
||||
|
||||
StyleColor() {
|
||||
position = "left";
|
||||
defaultBorder = false;
|
||||
|
||||
iconSize = 12;
|
||||
iconWidth = 15;
|
||||
iconHeight = 15;
|
||||
|
||||
borderWidth = 3;
|
||||
borderColor = "#029FEA";
|
||||
|
||||
normalBgColor = "#292F38";
|
||||
normalTextColor = "#54626F";
|
||||
hoverBgColor = "#40444D";
|
||||
hoverTextColor = "#FDFDFD";
|
||||
pressedBgColor = "#404244";
|
||||
pressedTextColor = "#FDFDFD";
|
||||
checkedBgColor = "#44494F";
|
||||
checkedTextColor = "#FDFDFD";
|
||||
}
|
||||
|
||||
//设置常规颜色 普通状态+加深状态
|
||||
void setColor(const QString &normalBgColor,
|
||||
const QString &normalTextColor,
|
||||
const QString &darkBgColor,
|
||||
const QString &darkTextColor) {
|
||||
this->normalBgColor = normalBgColor;
|
||||
this->normalTextColor = normalTextColor;
|
||||
this->hoverBgColor = darkBgColor;
|
||||
this->hoverTextColor = darkTextColor;
|
||||
this->pressedBgColor = darkBgColor;
|
||||
this->pressedTextColor = darkTextColor;
|
||||
this->checkedBgColor = darkBgColor;
|
||||
this->checkedTextColor = darkTextColor;
|
||||
}
|
||||
};
|
||||
|
||||
//阿里巴巴图形字体类
|
||||
static IconHelper *iconFontAliBaBa;
|
||||
//FontAwesome图形字体类
|
||||
static IconHelper *iconFontAwesome;
|
||||
//天气图形字体类
|
||||
static IconHelper *iconFontWeather;
|
||||
//图形字体索引
|
||||
static int iconFontIndex;
|
||||
|
||||
//初始化图形字体
|
||||
static void initFont();
|
||||
|
||||
//获取图形字体
|
||||
static QFont getIconFontAliBaBa();
|
||||
static QFont getIconFontAwesome();
|
||||
static QFont getIconFontWeather();
|
||||
|
||||
//根据值获取图形字体类
|
||||
static IconHelper *getIconHelper(int icon);
|
||||
|
||||
//设置图形字体到标签
|
||||
static void setIcon(QLabel *lab, int icon, quint32 size = 12);
|
||||
//设置图形字体到按钮
|
||||
static void setIcon(QAbstractButton *btn, int icon, quint32 size = 12);
|
||||
|
||||
//设置图形字体到图标
|
||||
static void setPixmap(QAbstractButton *btn, const QColor &color,
|
||||
int icon, quint32 size = 12,
|
||||
quint32 width = 15, quint32 height = 15,
|
||||
int flags = Qt::AlignCenter);
|
||||
//获取指定图形字体,可以指定文字大小,图片宽高,文字对齐
|
||||
static QPixmap getPixmap(const QColor &color, int icon, quint32 size = 12,
|
||||
quint32 width = 15, quint32 height = 15,
|
||||
int flags = Qt::AlignCenter);
|
||||
|
||||
//指定导航面板样式,带图标和效果切换+悬停颜色+按下颜色+选中颜色
|
||||
static void setStyle(QWidget *widget, QList<QPushButton *> btns, QList<int> icons, const StyleColor &styleColor);
|
||||
static void setStyle(QWidget *widget, QList<QToolButton *> btns, QList<int> icons, const StyleColor &styleColor);
|
||||
static void setStyle(QWidget *widget, QList<QAbstractButton *> btns, QList<int> icons, const StyleColor &styleColor);
|
||||
|
||||
//默认构造函数,传入字体文件+字体名称
|
||||
explicit IconHelper(const QString &fontFile, const QString &fontName, QObject *parent = 0);
|
||||
|
||||
protected:
|
||||
bool eventFilter(QObject *watched, QEvent *event);
|
||||
|
||||
private:
|
||||
QFont iconFont; //图形字体
|
||||
QList<QAbstractButton *> btns; //按钮队列
|
||||
QList<QPixmap> pixNormal; //正常图片队列
|
||||
QList<QPixmap> pixHover; //悬停图片队列
|
||||
QList<QPixmap> pixPressed; //按下图片队列
|
||||
QList<QPixmap> pixChecked; //选中图片队列
|
||||
|
||||
private slots:
|
||||
//按钮选中状态切换处理
|
||||
void toggled(bool checked);
|
||||
|
||||
public:
|
||||
//获取图形字体
|
||||
QFont getIconFont();
|
||||
|
||||
//设置图形字体到标签
|
||||
void setIcon1(QLabel *lab, int icon, quint32 size = 12);
|
||||
//设置图形字体到按钮
|
||||
void setIcon1(QAbstractButton *btn, int icon, quint32 size = 12);
|
||||
|
||||
//设置图形字体到图标
|
||||
void setPixmap1(QAbstractButton *btn, const QColor &color,
|
||||
int icon, quint32 size = 12,
|
||||
quint32 width = 15, quint32 height = 15,
|
||||
int flags = Qt::AlignCenter);
|
||||
//获取指定图形字体,可以指定文字大小,图片宽高,文字对齐
|
||||
QPixmap getPixmap1(const QColor &color, int icon, quint32 size = 12,
|
||||
quint32 width = 15, quint32 height = 15,
|
||||
int flags = Qt::AlignCenter);
|
||||
|
||||
//指定导航面板样式,带图标和效果切换+悬停颜色+按下颜色+选中颜色
|
||||
void setStyle1(QWidget *widget, QList<QPushButton *> btns, QList<int> icons, const StyleColor &styleColor);
|
||||
void setStyle1(QWidget *widget, QList<QToolButton *> btns, QList<int> icons, const StyleColor &styleColor);
|
||||
void setStyle1(QWidget *widget, QList<QAbstractButton *> btns, QList<int> icons, const StyleColor &styleColor);
|
||||
};
|
||||
|
||||
#endif // ICONHELPER_H
|
After Width: | Height: | Size: 21 KiB |
After Width: | Height: | Size: 37 KiB |
After Width: | Height: | Size: 2.5 KiB |
|
@ -0,0 +1,36 @@
|
|||
#pragma execution_character_set("utf-8")
|
||||
|
||||
#include "frmmain.h"
|
||||
#include <QApplication>
|
||||
#include <QTextCodec>
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
#if (QT_VERSION >= QT_VERSION_CHECK(5,14,0))
|
||||
//设置高分屏缩放舍入策略
|
||||
QApplication::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::Floor);
|
||||
#endif
|
||||
QApplication a(argc, argv);
|
||||
a.setFont(QFont("Microsoft Yahei", 9));
|
||||
|
||||
#if (QT_VERSION < QT_VERSION_CHECK(5,0,0))
|
||||
#if _MSC_VER
|
||||
QTextCodec *codec = QTextCodec::codecForName("gbk");
|
||||
#else
|
||||
QTextCodec *codec = QTextCodec::codecForName("utf-8");
|
||||
#endif
|
||||
QTextCodec::setCodecForLocale(codec);
|
||||
QTextCodec::setCodecForCStrings(codec);
|
||||
QTextCodec::setCodecForTr(codec);
|
||||
#else
|
||||
QTextCodec *codec = QTextCodec::codecForName("utf-8");
|
||||
QTextCodec::setCodecForLocale(codec);
|
||||
#endif
|
||||
|
||||
frmMain w;
|
||||
w.setWindowTitle("qcustomplot示例 (QQ: 517216493 WX: feiyangqingyun)");
|
||||
w.resize(1000, 650);
|
||||
w.show();
|
||||
|
||||
return a.exec();
|
||||
}
|
|
@ -0,0 +1,10 @@
|
|||
<RCC>
|
||||
<qresource prefix="/">
|
||||
<file>font/fontawesome-webfont.ttf</file>
|
||||
<file>font/iconfont.ttf</file>
|
||||
<file>font/pe-icon-set-weather.ttf</file>
|
||||
<file>image/bg1.jpg</file>
|
||||
<file>image/bg2.jpg</file>
|
||||
<file>image/data.png</file>
|
||||
</qresource>
|
||||
</RCC>
|
|
@ -0,0 +1,23 @@
|
|||
QT += core gui
|
||||
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
|
||||
greaterThan(QT_MAJOR_VERSION, 5): QT += core5compat
|
||||
|
||||
greaterThan(QT_MAJOR_VERSION, 4): CONFIG += c++11
|
||||
lessThan(QT_MAJOR_VERSION, 5): QMAKE_CXXFLAGS += -std=c++11
|
||||
|
||||
TARGET = qcustomplotdemo
|
||||
TEMPLATE = app
|
||||
DESTDIR = $$PWD/../bin
|
||||
|
||||
CONFIG += warn_off
|
||||
RESOURCES += main.qrc
|
||||
SOURCES += main.cpp
|
||||
HEADERS += iconhelper.h
|
||||
SOURCES += iconhelper.cpp
|
||||
|
||||
INCLUDEPATH += $$PWD
|
||||
INCLUDEPATH += $$PWD/form
|
||||
include ($$PWD/form/form.pri)
|
||||
|
||||
INCLUDEPATH += $$PWD/../3rd_qcustomplot
|
||||
include ($$PWD/../3rd_qcustomplot/3rd_qcustomplot.pri)
|
|
@ -4,9 +4,7 @@
|
|||
#include "qwt_dial.h"
|
||||
#include "qwt_plot.h"
|
||||
|
||||
frmMain::frmMain(QWidget *parent) :
|
||||
QWidget(parent),
|
||||
ui(new Ui::frmMain)
|
||||
frmMain::frmMain(QWidget *parent) : QWidget(parent), ui(new Ui::frmMain)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
}
|
||||
|
|
|
@ -1,3 +1,7 @@
|
|||
QT += core gui
|
||||
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
|
||||
greaterThan(QT_MAJOR_VERSION, 5): QT += core5compat
|
||||
|
||||
TARGET = qwtdemo
|
||||
TEMPLATE = app
|
||||
DESTDIR = $$PWD/../bin
|
||||
|
|
|
@ -2,6 +2,7 @@ TEMPLATE = subdirs
|
|||
SUBDIRS += hotkey
|
||||
SUBDIRS += shortcut
|
||||
SUBDIRS += qwtdemo
|
||||
SUBDIRS += qcustomplotdemo
|
||||
|
||||
#这个项目依赖QtDesigner模块,一般在arm上默认没有这个模块需要自行编译
|
||||
#所以arm上如果没有QtDesigner模块不要加载下面这个子项目
|
||||
|
@ -13,9 +14,10 @@ SUBDIRS -= hotkey
|
|||
|
||||
#Qt6有些项目还不支持
|
||||
greaterThan(QT_MAJOR_VERSION, 5) {
|
||||
SUBDIRS -= qwtdemo
|
||||
SUBDIRS -= hotkey
|
||||
SUBDIRS -= shortcut
|
||||
SUBDIRS -= qwtdemo
|
||||
SUBDIRS -= qcustomplotdemo
|
||||
}
|
||||
|
||||
win32 {
|
||||
|
|