MyChartView::MyChartView(QChart* chart, QWidget* parent) : MyChartView( parent ) { setChart(chart); setMouseTracking(true); // 创建用于显示游标线的QGraphicsLineItem int lineCount = chart->series().size(); // 获取曲线数 for (int i = 0; i < lineCount; ++i) { QGraphicsLineItem* cursorLine = new QGraphicsLineItem(chart->plotArea().x(), chart->plotArea().y(), chart->plotArea().x(), chart->plotArea().height()); cursorLine->setPen(QPen(QColor(Qt::blue), 1)); cursorLine->setVisible(true); chart->scene()->addItem(cursorLine); m_cursorLines.append(cursorLine); } }这样设置之后QGraphicsLineItem 不显示的原因是什么?该怎么让图层置顶显示呢
时间: 2024-03-11 18:49:14 浏览: 149
有可能是因为 `chart->plotArea().x()` 或 `chart->plotArea().y()` 返回的值为0,导致游标线在视图内不可见。您可以检查一下这两个值是否正确。
如果游标线已经被创建但是没有显示出来,您可以使用 `setZValue()` 函数将其放置在图层的最上面,例如:
```cpp
cursorLine->setZValue(10); // 10为游标线的图层编号,可以调整为其他数字
```
这样可以确保游标线始终处于视图的最上层。
相关问题
优化这串代码MainWidget::MainWidget(QWidget *parent) : QWidget(parent), ui(new Ui::MainWidget), chart(new QChart), chart2(new QChart), chart3(new QChart), // tip(0), timer(new QTimer), count(0), isStopping(true) { ui->setupUi(this); initUI(); timer->setInterval(500); timer->stop(); lastTime=QDateTime::currentDateTime().addDays(-1*7); initSlot(); db = QSqlDatabase::addDatabase("QSQLITE"); db.setDatabaseName("Impella.db3"); }
这段代码看起来已经很简洁了,但还是可以进一步优化:
1. 将变量的初始化放在构造函数的初始化列表中,可以提高代码的性能:
```
MainWidget::MainWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::MainWidget),
chart(new QChart),
chart2(new QChart),
chart3(new QChart),
timer(new QTimer),
count(0),
isStopping(true),
db(QSqlDatabase::addDatabase("QSQLITE", "Impella"))
{
ui->setupUi(this);
initUI();
timer->setInterval(500);
timer->stop();
lastTime = QDateTime::currentDateTime().addDays(-7);
initSlot();
db.setDatabaseName("Impella.db3");
}
```
2. 在初始化数据库时,可以指定连接名称,这样可以方便地在多个数据库连接中切换:
```
db(QSqlDatabase::addDatabase("QSQLITE", "Impella"))
```
3. 可以使用一种更加安全的方式来初始化成员变量 `lastTime`,以避免潜在的问题:
```
lastTime = QDateTime::currentDateTime().addDays(-7);
```
4. 如果 `timer` 只是用来触发某个事件,可以将其单独抽象成一个类,这样可以提高代码的可维护性和可扩展性。
5. 可以将 `initUI()` 和 `initSlot()` 合并成一个函数,以避免重复的代码。
我的代码报错terminate called after throwing an instance of 'std::bad_alloc' what(): std::bad_alloc,我写的代码如下:#include "mainwindow.h" #include "ui_mainwindow.h" #include <QtWidgets> #include <QResizeEvent> #include <QDebug> #include <QThread> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); replotTimer = new QTimer; ui->plot->setOpenGl(true); ui->plot->setNoAntialiasingOnDrag(true); mXDataTol = new QVector<double>; mYDataTol = new QVector<double>; mXDataTol->reserve(10000000); mYDataTol->reserve(10000000); 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,10000000); ui->plot->yAxis->setLabel("数据"); ui->plot->xAxis->setLabel("个数"); for (int i=0;i<10000000;i++) { mXDataTol->append(i); if(i<5000000) mYDataTol->append(0); else mYDataTol->append(QRandomGenerator::global()->bounded(1.00)); } ui->plot->graph(0)->setData(*mXDataTol,*mYDataTol,true); }
这个错误通常表示你的程序在运行过程中无法分配足够的内存空间。由于你的程序中有大量的内存分配,这可能是由于你的程序在分配内存时没有正确释放内存所导致的。查看你的代码,你在构造函数中分配了两个 QVector<double> 实例,每个实例都预留了 10,000,000 个元素的空间。这将需要大约 160 MB 的内存空间。如果你在程序执行过程中创建多个这样的实例并且没有及时释放内存,就会导致内存不足的错误。你可以尝试使用 std::vector 来代替 QVector,并且只在需要时分配内存。你还可以使用 C++11 中的 unique_ptr 或 shared_ptr 来自动管理内存,以避免内存泄漏的问题。
阅读全文