用qt制作一个可以绘制一次函数和二次函数的程序 要有坐标轴 要有刻度 要有正负轴 函数的各项系数以及常数由使用者输入

时间: 2024-05-07 13:18:41 浏览: 8
以下是一个简单的基于Qt的程序,可以绘制一次函数和二次函数,并且由用户输入函数的系数和常数,同时包含坐标轴、刻度和正负轴。请注意,此程序仅作为示例,可能需要您进行修改以满足您的实际需求。 ```cpp #include <QtWidgets> class GraphWidget : public QWidget { public: GraphWidget(QWidget *parent = nullptr) : QWidget(parent) { // 初始化参数 m_a = 1.0; m_b = 0.0; m_c = 0.0; m_xMin = -10.0; m_xMax = 10.0; m_yMin = -10.0; m_yMax = 10.0; // 设置窗口大小 setFixedSize(500, 500); } void setCoefficients(double a, double b, double c) { m_a = a; m_b = b; m_c = c; } void setRange(double xMin, double xMax, double yMin, double yMax) { m_xMin = xMin; m_xMax = xMax; m_yMin = yMin; m_yMax = yMax; } protected: void paintEvent(QPaintEvent *event) override { Q_UNUSED(event); QPainter painter(this); // 绘制坐标轴 painter.drawLine(0, height() / 2, width(), height() / 2); painter.drawLine(width() / 2, 0, width() / 2, height()); // 绘制刻度 double xStep = (m_xMax - m_xMin) / 10.0; double yStep = (m_yMax - m_yMin) / 10.0; QFont font; font.setPointSize(8); painter.setFont(font); for (int i = 1; i < 10; i++) { int x = width() * i / 10; int y = height() * i / 10; painter.drawLine(x, height() / 2 - 5, x, height() / 2 + 5); painter.drawText(x - 10, height() / 2 + 15, QString::number(m_xMin + i * xStep)); painter.drawLine(width() / 2 - 5, y, width() / 2 + 5, y); painter.drawText(width() / 2 + 10, y + 5, QString::number(m_yMax - i * yStep)); } // 绘制正负轴 painter.setPen(Qt::DashLine); painter.drawLine(0, height() / 2 - (m_yMin / (m_yMax - m_yMin)) * height(), width(), height() / 2 - (m_yMin / (m_yMax - m_yMin)) * height()); painter.drawLine(width() / 2 + (m_xMin / (m_xMax - m_xMin)) * width(), 0, width() / 2 + (m_xMin / (m_xMax - m_xMin)) * width(), height()); // 绘制函数 painter.setPen(Qt::SolidLine); painter.setBrush(Qt::NoBrush); QPainterPath path; double xStepSize = (m_xMax - m_xMin) / width(); for (int i = 0; i < width(); i++) { double x = m_xMin + i * xStepSize; double y = m_a * x * x + m_b * x + m_c; int xPixel = i; int yPixel = height() / 2 - (y / (m_yMax - m_yMin)) * height(); if (i == 0) { path.moveTo(xPixel, yPixel); } else { path.lineTo(xPixel, yPixel); } } painter.drawPath(path); } private: double m_a; double m_b; double m_c; double m_xMin; double m_xMax; double m_yMin; double m_yMax; }; class MainWindow : public QMainWindow { public: MainWindow(QWidget *parent = nullptr) : QMainWindow(parent) { QWidget *centralWidget = new QWidget(this); setCentralWidget(centralWidget); QVBoxLayout *layout = new QVBoxLayout(centralWidget); // 创建输入框和按钮 QLineEdit *aLineEdit = new QLineEdit; QLineEdit *bLineEdit = new QLineEdit; QLineEdit *cLineEdit = new QLineEdit; QLineEdit *xMinLineEdit = new QLineEdit; QLineEdit *xMaxLineEdit = new QLineEdit; QLineEdit *yMinLineEdit = new QLineEdit; QLineEdit *yMaxLineEdit = new QLineEdit; QPushButton *plotButton = new QPushButton(tr("Plot")); // 创建绘图窗口 GraphWidget *graphWidget = new GraphWidget; // 将控件添加到布局中 layout->addWidget(new QLabel(tr("a:"))); layout->addWidget(aLineEdit); layout->addWidget(new QLabel(tr("b:"))); layout->addWidget(bLineEdit); layout->addWidget(new QLabel(tr("c:"))); layout->addWidget(cLineEdit); layout->addWidget(new QLabel(tr("xMin:"))); layout->addWidget(xMinLineEdit); layout->addWidget(new QLabel(tr("xMax:"))); layout->addWidget(xMaxLineEdit); layout->addWidget(new QLabel(tr("yMin:"))); layout->addWidget(yMinLineEdit); layout->addWidget(new QLabel(tr("yMax:"))); layout->addWidget(yMaxLineEdit); layout->addWidget(plotButton); layout->addWidget(graphWidget); // 连接按钮的点击事件 connect(plotButton, &QPushButton::clicked, [=]() { bool ok; double a = aLineEdit->text().toDouble(&ok); if (!ok) { QMessageBox::warning(this, tr("Error"), tr("Invalid a value")); return; } double b = bLineEdit->text().toDouble(&ok); if (!ok) { QMessageBox::warning(this, tr("Error"), tr("Invalid b value")); return; } double c = cLineEdit->text().toDouble(&ok); if (!ok) { QMessageBox::warning(this, tr("Error"), tr("Invalid c value")); return; } double xMin = xMinLineEdit->text().toDouble(&ok); if (!ok) { QMessageBox::warning(this, tr("Error"), tr("Invalid xMin value")); return; } double xMax = xMaxLineEdit->text().toDouble(&ok); if (!ok) { QMessageBox::warning(this, tr("Error"), tr("Invalid xMax value")); return; } double yMin = yMinLineEdit->text().toDouble(&ok); if (!ok) { QMessageBox::warning(this, tr("Error"), tr("Invalid yMin value")); return; } double yMax = yMaxLineEdit->text().toDouble(&ok); if (!ok) { QMessageBox::warning(this, tr("Error"), tr("Invalid yMax value")); return; } graphWidget->setCoefficients(a, b, c); graphWidget->setRange(xMin, xMax, yMin, yMax); graphWidget->update(); }); } }; int main(int argc, char *argv[]) { QApplication app(argc, argv); MainWindow mainWindow; mainWindow.show(); return app.exec(); } ``` 在此程序中,我们创建了一个名为`GraphWidget`的自定义QWidget类,用于绘制坐标轴、刻度、正负轴和函数。我们还创建了一个名为`MainWindow`的主窗口,包含输入框和按钮,用于让用户输入函数的系数和常数,以及用于显示绘图的`GraphWidget`实例。 在`GraphWidget`类中,我们重载了`paintEvent()`函数,用于绘制坐标轴、刻度、正负轴和函数。在`MainWindow`类中,我们使用Qt的布局管理器将输入框、按钮和`GraphWidget`添加到主窗口中,并将按钮的点击事件连接到绘图函数中。

相关推荐

最新推荐

recommend-type

Qt图形图像开发之曲线图表模块QChart库坐标轴和数据不对应、密集的散点图无法显示问题解决方法

主要介绍了Qt图形图像开发之曲线图表模块QChart库坐标轴和数据不对应、密集的散点图无法显示问题解决方法,需要的朋友可以参考下
recommend-type

C++程序中main(int argc, char *argv[])函数的参数意义

主要介绍了C++程序中main(int argc, char *argv[])函数的参数意义,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
recommend-type

Qt图形图像开发之曲线图表模块QChart库一个chart中显示两条曲线详细方法与实例

主要介绍了Qt图形图像开发之曲线图表模块QChart库一个chart中显示两条曲线详细方法与实例,需要的朋友可以参考下
recommend-type

Qt图形图像开发之曲线图表模块QChart库读取/设置X轴的显示区间

主要介绍了Qt图形图像开发之曲线图表模块QChart库读取/设置X轴的显示区间,需要的朋友可以参考下
recommend-type

Qt使用QPainter绘制3D立方体

主要为大家详细介绍了Qt使用QPainter绘制3D立方体,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

MATLAB柱状图在信号处理中的应用:可视化信号特征和频谱分析

![matlab画柱状图](https://img-blog.csdnimg.cn/3f32348f1c9c4481a6f5931993732f97.png) # 1. MATLAB柱状图概述** MATLAB柱状图是一种图形化工具,用于可视化数据中不同类别或组的分布情况。它通过绘制垂直条形来表示每个类别或组中的数据值。柱状图在信号处理中广泛用于可视化信号特征和进行频谱分析。 柱状图的优点在于其简单易懂,能够直观地展示数据分布。在信号处理中,柱状图可以帮助工程师识别信号中的模式、趋势和异常情况,从而为信号分析和处理提供有价值的见解。 # 2. 柱状图在信号处理中的应用 柱状图在信号处理
recommend-type

解释这行代码 c = ((double)rand() / RAND_MAX) * (a + b - fabs(a - b)) + fabs(a - b);

这行代码是用于生成 a 和 b 之间的随机数。首先,它使用 rand() 函数生成一个 [0,1) 之间的随机小数,然后将这个小数乘以 a、b 范围内的差值,再加上 a 和 b 中的较小值。这可以确保生成的随机数大于等于 a,小于等于 b,而且不会因为 a 和 b 之间的差距过大而导致难以生成足够多的随机数。最后,使用 fabs() 函数来确保计算结果是正数。
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。