使用QTCreator实现窗体,其中拟合程度图左侧是测点列表,右侧是改测点的拟合程度图(不使用UI,使用代码编写实现)
实现思路
- 创建主窗口:继承
QMainWindow
类来创建主窗口。 - 布局管理:使用
QSplitter
来实现左右布局,左侧放置测点列表,右侧放置拟合程度图。 - 测点列表:使用
QListWidget
来显示测点列表。 - 拟合程度图:使用
QCustomPlot
库来绘制拟合程度图。 - 交互逻辑:当点击测点列表中的某一项时,更新右侧的拟合程度图。
具体步骤
1. 创建 Qt Widgets Application 项目
打开 Qt Creator,选择 File
-> New File or Project
,在模板中选择 Qt Widgets Application
,按照向导完成项目创建。
2. 安装 QCustomPlot 库
从 QCustomPlot 官方网站 下载源码,将 qcustomplot.h
和 qcustomplot.cpp
文件添加到项目中。
3. 编写代码
以下是完整的代码示例:
qt-fit-degree-window-code-only纯代码实现包含测点列表和拟合程度图的 Qt 窗体
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QListWidget>
#include <QCustomPlot>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void on_listWidget_itemClicked(QListWidgetItem *item);
private:
QListWidget *listWidget;
QCustomPlot *customPlot;
QSplitter *splitter;
void setupList();
void setupPlot();
void plotDataForPoint(const QString &pointName);
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include <QVector>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
splitter = new QSplitter(Qt::Horizontal, this);
setupList();
setupPlot();
splitter->addWidget(listWidget);
splitter->addWidget(customPlot);
setCentralWidget(splitter);
}
MainWindow::~MainWindow()
{
// 析构函数中无需手动删除子控件,Qt 会自动处理
}
void MainWindow::setupList()
{
listWidget = new QListWidget(splitter);
listWidget->addItem("测点 1");
listWidget->addItem("测点 2");
listWidget->addItem("测点 3");
connect(listWidget, &QListWidget::itemClicked, this, &MainWindow::on_listWidget_itemClicked);
}
void MainWindow::setupPlot()
{
customPlot = new QCustomPlot(splitter);
customPlot->setMinimumSize(600, 400);
}
void MainWindow::on_listWidget_itemClicked(QListWidgetItem *item)
{
QString pointName = item->text();
plotDataForPoint(pointName);
}
void MainWindow::plotDataForPoint(const QString &pointName)
{
QVector<double> x(101), y(101);
for (int i = 0; i < 101; ++i)
{
x[i] = i / 50.0 - 1;
if (pointName == "测点 1")
{
y[i] = x[i] * x[i];
}
else if (pointName == "测点 2")
{
y[i] = x[i] * x[i] * x[i];
}
else
{
y[i] = qSin(x[i]);
}
}
customPlot->clearGraphs();
customPlot->addGraph();
customPlot->graph(0)->setData(x, y);
customPlot->xAxis->setLabel("X");
customPlot->yAxis->setLabel("Y");
customPlot->rescaleAxes();
customPlot->replot();
}
main.cpp
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
代码解释
mainwindow.h
:定义了MainWindow
类,包含测点列表、拟合程度图和分割器等成员变量,以及相关的槽函数和私有方法声明。mainwindow.cpp
:- 构造函数:创建
QSplitter
并调用setupList
和setupPlot
方法来初始化列表和绘图区域,最后将它们添加到分割器中并设置为中心部件。 setupList
方法:创建QListWidget
并添加测点列表项,同时连接itemClicked
信号到on_listWidget_itemClicked
槽函数。setupPlot
方法:创建QCustomPlot
对象并设置其最小尺寸。on_listWidget_itemClicked
槽函数:获取点击的测点名称并调用plotDataForPoint
方法来更新绘图。plotDataForPoint
方法:根据测点名称生成相应的数据并绘制到QCustomPlot
上。
- 构造函数:创建
main.cpp
:程序的入口点,创建QApplication
对象和MainWindow
对象,显示窗口并启动应用程序的事件循环。
编译和运行
点击 Qt Creator 工具栏上的 “Build” 按钮编译项目,编译成功后点击 “Run” 按钮运行项目,你将看到一个包含测点列表和拟合程度图的窗体,点击测点列表项会更新右侧的拟合程度图。
可以根据实际需求修改测点列表和拟合程度图的数据。
error: C1083: 无法打开包括文件: “QCustomPlot”: No such file or directory
出现 error: C1083: 无法打开包括文件: “QCustomPlot”: No such file or directory
错误,意味着编译器找不到 QCustomPlot
头文件。下面为你详细分析可能的原因以及对应的解决办法:
可能的原因
- 文件未添加到项目中:
QCustomPlot
的头文件和源文件没有被添加到 Qt 项目里。 - 文件路径配置有误:项目的包含路径里没有包含
QCustomPlot
头文件所在的目录。 - 文件名大小写问题:在 Windows 系统下,文件名大小写不敏感,但在某些编译器环境中可能会有影响。
解决办法
1. 确保 QCustomPlot
文件已添加到项目
- 从 QCustomPlot 官方网站 下载源码,一般会得到
qcustomplot.h
和qcustomplot.cpp
这两个文件。 - 把这两个文件复制到你的项目目录下。
- 在 Qt Creator 里,右键点击项目名称,选择
Add Existing Files
,然后选中qcustomplot.h
和qcustomplot.cpp
文件添加到项目中。
2. 配置项目的包含路径
- 打开项目的
.pro
文件,在文件里添加如下内容:
INCLUDEPATH += $$PWD # 假设 QCustomPlot 文件在项目根目录下
若 QCustomPlot
文件存放在项目的子目录中,要相应地修改路径,例如:
INCLUDEPATH += $$PWD/customplot # 假设 QCustomPlot 文件在 customplot 子目录下
- 修改完成后,保存
.pro
文件,然后在 Qt Creator 中点击Build
->Run qmake
让修改生效。
3. 检查文件名大小写
确保在代码里包含 QCustomPlot
头文件时使用的文件名大小写和实际文件一致,通常应该是:
#include "qcustomplot.h"
完整示例
以下是一个简单的 .pro
文件示例:
# 项目名称
TARGET = YourProjectName
TEMPLATE = app
# 源文件
SOURCES += main.cpp\
mainwindow.cpp \
qcustomplot.cpp
# 头文件
HEADERS += mainwindow.h \
qcustomplot.h
# 包含路径
INCLUDEPATH += $$PWD
完成上述操作后,重新编译项目,这个错误应该就会消失。
qcustomplot.obj:-1: error: LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: __cdecl QPrinter::QPrinter(enum QPrinter::PrinterMode)" (__imp_??0QPrinter@@QEAA@W4PrinterMode@0@@Z),函数 "public: bool __cdecl QCustomPlot::savePdf(class QString const &,int,int,enum QCP::ExportPen,class QString const &,class QString const &)" (?savePdf@QCustomPlot@@QEAA_NAEBVQString@@HHW4ExportPen@QCP@@00@Z) 中引用了该符号
这个错误 LNK2019: 无法解析的外部符号
通常表示链接器在链接阶段找不到某个符号的定义。具体到这个错误,链接器无法找到 QPrinter::QPrinter(enum QPrinter::PrinterMode)
的定义,该符号在 QCustomPlot::savePdf
函数中被引用。这一般是因为缺少必要的库文件或者库文件没有正确链接。以下是具体的解决步骤:
1. 确保在 .pro
文件中添加了必要的 Qt 模块
QPrinter
属于 QtPrintSupport
模块,所以需要在项目的 .pro
文件中添加该模块。打开项目的 .pro
文件,添加如下行:
QT += printsupport
完整的 .pro
文件示例如下:
# 项目名称
TARGET = YourProjectName
TEMPLATE = app
# 源文件
SOURCES += main.cpp\
mainwindow.cpp \
qcustomplot.cpp
# 头文件
HEADERS += mainwindow.h \
qcustomplot.h
# 包含路径
INCLUDEPATH += $$PWD
# 添加 QtPrintSupport 模块
QT += printsupport
添加完后保存 .pro
文件,然后在 Qt Creator 中选择 Build
-> Run qmake
让修改生效。
2. 清理并重新构建项目
有时候,旧的构建文件可能会导致链接错误。可以尝试清理项目并重新构建:
- 在 Qt Creator 中选择
Build
->Clean All
清理所有旧的构建文件。 - 然后选择
Build
->Rebuild All
重新构建整个项目。
3. 检查 Qt 安装是否完整
确保你的 Qt 安装包含了 QtPrintSupport
模块。可以通过以下步骤检查:
- 打开 Qt Maintenance Tool(在安装 Qt 时会自动安装)。
- 在 Maintenance Tool 中,查看是否安装了
QtPrintSupport
模块。如果没有安装,可以选择安装该模块。
4. 检查环境变量
确保 Qt 的环境变量配置正确。在 Windows 系统中,需要确保 PATH
环境变量包含了 Qt 的 bin
目录,例如:
C:\Qt\Qt5.x.x\msvc2019_64\bin
其中 Qt5.x.x
是你安装的 Qt 版本,msvc2019_64
是编译器套件。
完成以上步骤后,再次尝试编译和运行项目,链接错误应该会得到解决。