qcustomplot 使用plot->setInteractions( QCP::iSelectPlottables); 怎么不改变选中rect中QCPGraph *graph的颜色
时间: 2023-11-28 22:48:26 浏览: 192
`QCustomPlot` 中的 `setInteractions()` 函数只负责设置交互方式,而不会直接影响选中的 `QCPGraph` 的颜色。如果你想改变选中 `QCPGraph` 的颜色,可以使用信号槽机制,如下所示:
```cpp
connect(plot, SIGNAL(selectionChangedByUser()), this, SLOT(onSelectionChanged()));
```
在 `onSelectionChanged()` 槽函数中,你可以获取到被选中的 `QCPGraph`,并在函数中修改其颜色,如下所示:
```cpp
void MyClass::onSelectionChanged()
{
QCPDataSelection selection = mPlot->graph()->selection();
if (selection.dataRange().isValid()) {
QCPGraph *graph = mPlot->graph();
graph->setPen(QPen(Qt::red)); // 设置选中的曲线颜色为红色
}
}
```
上述例子中,当用户选择 `QCustomPlot` 中的某个 `QCPGraph` 时,`onSelectionChanged()` 槽函数就会被调用。在该槽函数中,我们首先获取当前被选中的数据,然后根据需要修改选中的 `QCPGraph` 的颜色。在这里,我们将选中的 `QCPGraph` 的颜色设置为红色。
相关问题
qcustomplot 使用plot->setInteractions( QCP::iSelectPlottables); 怎么不改变选中点的颜色
`setInteractions` 方法是设置图形界面中与用户交互的方式,比如允许用户选中点,拖动图像等。如果你想改变选中点的颜色,可以使用 `QCPScatterStyle` 类中的 `setSelected` 方法。
以下是一个实例代码:
```cpp
// 创建一个 scatter plot
QCustomPlot *customPlot = new QCustomPlot(this);
QCPGraph *graph = customPlot->addGraph();
graph->setScatterStyle(QCPScatterStyle::ssCircle);
// 设置选中点的颜色
QCPScatterStyle selectedStyle;
selectedStyle.setShape(QCPScatterStyle::ssCircle);
selectedStyle.setPen(QPen(Qt::red));
selectedStyle.setBrush(Qt::red);
graph->setSelectionDecorator(selectedStyle);
// 设置交互方式
customPlot->setInteractions(QCP::iSelectPlottables);
// 显示图像
customPlot->replot();
```
在这个例子中,我们首先创建了一个 scatter plot,并设置了默认的散点样式为圆形。然后我们创建了一个 `QCPScatterStyle` 对象 `selectedStyle`,用于设置选中点的样式,其中 `setPen` 和 `setBrush` 方法分别设置选中点的边框颜色和填充颜色。接下来,我们使用 `setSelectionDecorator` 方法将 `selectedStyle` 应用到 scatter plot 上。最后,我们使用 `setInteractions` 方法设置了交互方式,允许用户选中散点。
#include "mainwindow.h" #include "ui_mainwindow.h" #include <QtWidgets> #include <QResizeEvent> //绘图区域大小变化事件 #include <QDebug> #include <QThread> #include <QTimer> #include <QVector> #include <QRandomGenerator> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); ui->plot->setOpenGl(true); ui->plot->setNoAntialiasingOnDrag(true); CreateChart(); } MainWindow::~MainWindow() { delete ui; } void MainWindow::CreateChart() { ui->plot->addGraph(); ui->plot->graph(0)->setPen(QPen(QColor(100,149,237))); mData = ui->plot->graph(0)->data()->coreData(); ui->plot->xAxis2->setVisible(true); ui->plot->xAxis2->setTickLabels(false); ui->plot->yAxis2->setVisible(true); ui->plot->yAxis2->setTickLabels(false); connect(ui->plot->xAxis, SIGNAL(rangeChanged(QCPRange)), ui->plot->xAxis2, SLOT(setRange(QCPRange))); connect(ui->plot->yAxis, SIGNAL(rangeChanged(QCPRange)), ui->plot->yAxis2, SLOT(setRange(QCPRange))); ui->plot->setInteractions(QCP::iRangeDrag|QCP::iRangeZoom|QCP::iSelectPlottables); ui->plot->yAxis->setRange(-1.5,1.5); ui->plot->xAxis->setRange(0,50); ui->plot->yAxis->setLabel("数据"); ui->plot->xAxis->setLabel("个数"); for (int i = 0; i < 50; i++) { mXDataTol.append(i); mYDataTol.append(QRandomGenerator::global()->bounded(1.00)); } ui->plot->graph(0)->setData(mXDataTol,mYDataTol,true); ui->plot->replot(); }这是我的全部代码,系统报错:terminate called after throwing an instance of 'std::bad_alloc' what(): std::bad_alloc请帮我修改一下代码,我不知道到底哪里出了错
这个错误通常是由于内存不足导致的,也就是说程序尝试分配的内存超过了系统可用的内存。在你的代码中,我没有看到明显的内存泄漏或者内存溢出的问题。因此,我建议你尝试使用 Valgrind 等内存检测工具来检查你的程序是否存在内存问题。
此外,你可以尝试优化你的代码,减少内存的使用。具体来说,你可以考虑使用 QVector::reserve() 函数来预分配内存,避免频繁地动态分配和释放内存。例如:
```cpp
mXDataTol.reserve(50);
mYDataTol.reserve(50);
for (int i = 0; i < 50; i++) {
mXDataTol.append(i);
mYDataTol.append(QRandomGenerator::global()->bounded(1.00));
}
```
另外,你还可以使用 Qt 的智能指针类来管理内存,避免手动分配和释放内存。例如,你可以将 mData 声明为一个 QSharedPointer<QCPDataMap> 类型的智能指针,这样可以自动管理 mData 的内存,避免内存泄漏和悬挂指针的问题。
阅读全文