用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`添加到主窗口中,并将按钮的点击事件连接到绘图函数中。