我们正在尝试使用QCustomPlot配置内部比较工具。该框架非常好用。
现在,在一个绘图中经常有多个QCPAxisRect
整齐地排列,以便用户可以比较不同的曲线。
为了交互配置QCPAxisRect
属性,用户应在QCustomPlot
小部件中交互选择这些权限。使用axisRectAt
函数可以轻松完成此操作。
现在有一部分我无法解决。我只是想通过在所选项目周围绘制一个简单的矩形来显示QCustomPlot
内部的当前选择。我想为此目的使用QCPItemRect
,但无法使其运行。 (特别是它被裁剪到QCPAxisRect的内部,但是我想在外部绘制矩形。)
我能得到的最接近的是以下解决方案,该解决方案简单地更改了QCPAxisRect
的背景颜色。我真的不喜欢这种解决方案,因为用户会感到烦躁,而且他/他的曲线样式可能不再清晰可见。
PlotWidget.h
#pragma once
#include <QWidget>
#include "ifmQCustomPlot/qcustomplot.h"
class PlotWidget : public QWidget {
Q_OBJECT
public:
PlotWidget(QWidget* parent=nullptr);
private:
QCustomPlot* mPlot{ nullptr };
private:
QString mCurrentSelection;
};
PlotWidget.cpp
#include "PlotWidget.h"
#include <QVBoxLayout>
#include <QDebug>
PlotWidget::PlotWidget(QWidget* parent/*=nullptr*/) : QWidget(parent)
{
mPlot = new QCustomPlot;
resize(3*400, 400);
setLayout(new QVBoxLayout);
layout()->addWidget(mPlot);
auto layout = mPlot->plotLayout();
layout->clear();
auto rect1 = new QCPAxisRect(mPlot);
rect1->setObjectName("R1");
auto rect2 = new QCPAxisRect(mPlot);
rect2->setObjectName("R2");
auto rect3 = new QCPAxisRect(mPlot);
rect3->setObjectName("R3");
layout->setColumnSpacing(20);
layout->addElement(rect1);
layout->addElement(rect2);
layout->addElement(rect3);
mPlot->rescaleAxes();
mPlot->replot(QCustomPlot::rpImmediateRefresh);
connect(mPlot, &QCustomPlot::mouseMove, [this](auto event ) {
QBrush noSelectionBrush(QColor("#00ffffff"));
QBrush hasFocusBrush(QBrush(QColor("#ff00ff80")));
QBrush isSelectedBrush(QBrush(QColor("#ff000080")));
for (auto iter : mPlot->axisRects()) {
iter->setBackground(noSelectionBrush); // Transparent
}
if (auto rect = mPlot->axisRectAt(event->pos())) {
rect->setBackground(hasFocusBrush);
}
auto children = mPlot->findChildren<QCPAxisRect*>(mCurrentSelection);
if (children.size()==1) {
children[0]->setBackground(isSelectedBrush);
}
mPlot->replot(QCustomPlot::rpImmediateRefresh);
});
connect(mPlot, &QCustomPlot::mouseDoubleClick, [this](auto event) {
QBrush noSelectionBrush(QColor("#00ffffff"));
QBrush hasFocusBrush(QBrush(QColor("#ff00ff80")));
QBrush isSelectedBrush(QBrush(QColor("#ff000080")));
for (auto iter : mPlot->axisRects()) {
iter->setBackground(noSelectionBrush);
}
if (auto rect = mPlot->axisRectAt(event->pos())) {
rect->setBackground(isSelectedBrush);
mCurrentSelection = rect->objectName();
}
else {
mCurrentSelection = "";
}
mPlot->replot(QCustomPlot::rpImmediateRefresh);
});
}
main.cpp
#include <QApplication>
#include "PlotWidget.h"
int main(int argc, char** args) {
QApplication app(argc, args);
auto w = new PlotWidget;
w->show();
app.exec();
}
我想要的是以下内容:
在图片中,最左边的QCPLayoutElement
被选中,而最右边的QCPAxisRect
被选中(双击将被选中)。
通过简单地在$("#total").click(function(){
$("#yourtable tr").each(function(i, el){ //go through each tr in table id=yourtable
var a = $(el).find(".a").val(); //find .a in each row
var b = $(el).find(".b").val(); //find .b in each row
var tt = a+b;
$(el).find('.a-b').text(tt); //set result into .a-b of current row
};
});
周围绘制一个矩形来表示选择/焦点。
现在,有什么方法可以实现这种行为?