QCPAxisRect周围的图形选择和焦点矩形

时间:2019-03-04 09:15:48

标签: c++ user-interface user-experience qwidget qcustomplot

我们正在尝试使用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();
}

我想要的是以下内容:

Desired Selection Behavior

在图片中,最左边的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 }; }); 周围绘制一个矩形来表示选择/焦点。

现在,有什么方法可以实现这种行为?

0 个答案:

没有答案