作者本人最近受朋友所托,让帮助写个上位机的小程序,方便他直观的处理自己采集的数据,由于需要得底层硬件打交道,因此需要处理的数据都是16进制数。作者目前所在团队使用的上位机软件是LabVIEW,这款软件是NI公司的产品,主要是配合他们公司的数据采集卡使用,因此在数据采集上很有优势,特别是使用图形化的语言,上手开发速度比较快。由于作者个人原因,不太喜欢LabVIEW那种编程方式,还是喜欢C/C++这种可以把底层数据处理掌握在手中的感觉,因此对比了多种图形界面库后,选择了Qt5。选择Qt除了可以制作图形界面外,还包括很多其它的功能,比如多线程、数据库、网络通信、文件操作、串口通信等,有了这些功能,我就可以在Qt这个框架下完成几乎所有的工作,不用再使用其它第三方库,方便了后续代码的移植。关于版权方面,目前没有考虑用Qt来盈利,所以就直接使用Qt5的开源版了,不过好像有针对小企业的499美金/年的价格,感觉还是挺合适的,不过在没有盈利之前感觉买来还是有点贵。
本文主要交流一下我对Qt5开发环境的选择,其中遇到了一些坑,算是和大家交流一下。
QtCreator是官方发布的IDE,如果没有特殊要求,能用官方的就用官方的,其实也不是太差。不过个人觉得,和VS比功能上还是差点,特别是对工程的配置,感觉总是有点别扭,很多时候都看不懂是什么意思。还有就是明明装了个中文版的开发环境,结果菜单上还有很多地方是英文的,如下图所示,虽然不影响使用,但是对于一个强迫症来说,确实有点闹心。
CLion我觉得目前是除了Visual Studio之外最好用的开发C/C++的IDE了,特别是我有教育优惠账号,可以长期白嫖,而且整个软件相对Visual Studio的体积来说要小的多,加上跨平台的特性,我还真想把它做为我的主力开发工具。但是在用CLion配置Qt5的开发过程中,当使用QtChart库的时候,总是出问题,特别是把Widget控件提升成QChartView之后,再运行程序就会莫名奇妙的闪退,使用了QT_CHARTS_USE_NAMESPACE之后也还是闪退,这不得不让我放弃CLion。
下面我展示一下我出现的错误,如果哪位知道问题在哪,可以交流一下。我的目的很简单,就是想用QtChart画个图,首先我用CLion新建了Qt UI类,然后在生成的ui界面上拖了个widget控件,并提升成QChartView了。
代码主要有CMakeLists.txt,main.cpp,mainwindow.cpp,mainwindow.h,ui_mainwindow.h
其中CMakeLists.txt的代码如下:
cmake_minimum_required(VERSION 3.22)
project(untitled1)
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_PREFIX_PATH "C:/Qt/Qt5.14.2/5.14.2/msvc2017/lib/cmake")
find_package(Qt5 COMPONENTS
Core
Gui
Widgets
Charts
REQUIRED)
add_executable(untitled1 main.cpp mainwindow.cpp mainwindow.h mainwindow.ui)
target_link_libraries(untitled1
Qt5::Core
Qt5::Gui
Qt5::Widgets
Qt5::Charts
)
其中main.cpp代码如下:
#include
#include
int main(int argc, char *argv[]) {
QApplication a(argc, argv);
QPushButton button("Hello world!", nullptr);
button.resize(200, 100);
button.show();
return QApplication::exec();
}
mainwindow.h代码如下:
#ifndef UNTITLED1_MAINWINDOW_H
#define UNTITLED1_MAINWINDOW_H
#include
QT_BEGIN_NAMESPACE
namespace Ui { class mainwindow; }
QT_END_NAMESPACE
class mainwindow : public QMainWindow {
Q_OBJECT
public:
explicit mainwindow(QWidget *parent = nullptr);
~mainwindow() override;
private:
Ui::mainwindow *ui;
};
#endif //UNTITLED1_MAINWINDOW_H
ui_mainwindow.h代码如下:
#ifndef UI_MAINWINDOW_H
#define UI_MAINWINDOW_H
#include
#include
#include
#include
#include "qchartview.h"
QT_CHARTS_USE_NAMESPACE
QT_BEGIN_NAMESPACE
class Ui_mainwindow
{
public:
QWidget *centralWidget;
QChartView *widget;
void setupUi(QMainWindow *mainwindow)
{
if (mainwindow->objectName().isEmpty())
mainwindow->setObjectName(QString::fromUtf8("mainwindow"));
mainwindow->resize(400, 300);
centralWidget = new QWidget(mainwindow);
centralWidget->setObjectName(QString::fromUtf8("centralWidget"));
widget = new QChartView(centralWidget);
widget->setObjectName(QString::fromUtf8("widget"));
widget->setGeometry(QRect(10, 80, 381, 211));
mainwindow->setCentralWidget(centralWidget);
retranslateUi(mainwindow);
QMetaObject::connectSlotsByName(mainwindow);
} // setupUi
void retranslateUi(QMainWindow *mainwindow)
{
mainwindow->setWindowTitle(QCoreApplication::translate("mainwindow", "mainwindow", nullptr));
} // retranslateUi
};
namespace Ui {
class mainwindow: public Ui_mainwindow {};
} // namespace Ui
QT_END_NAMESPACE
#endif // UI_MAINWINDOW_H
mainwindow.cpp代码如下:
#include "mainwindow.h"
#include "ui_mainwindow.h"
mainwindow::mainwindow(QWidget *parent) :
QMainWindow(parent), ui(new Ui::mainwindow) {
ui->setupUi(this);
}
mainwindow::~mainwindow() {
delete ui;
}
点运行程序,程序直接结束,连界面都不出,报下图的错误。
这个问题想了很多的办法解决,比如说注释掉QChartView控件,然后有的时候会跑通,有的时候就跑不通。改了一下CMakeLists.txt里面的QtChart库,也不行,测试了很多也解决不了,不得不放弃用CLion开发Qt的想法。如果哪位朋友知道怎么解决这个问题,麻烦赐教一下。
经历了CLion总是闪退的问题,不得不考虑其它的开发环境了。想用CLion做为开发环境还有一个原因就是它是用CMake管理整个工程,方便后续向Linux平台迁移。不过目前的开发还主要是在Windows环境下,想想还是先把功能做出来,迁移的事情后续再考虑。如果不是为了用CMake,其实在QtCreator下用qmake已经可以使用QtChart了,而且非常方便,基本上不用配置什么内容,但是不太喜欢QtCreator,也不想学习qmake,就考虑使用Visual Studio开发Qt。在Windows平台上肯定是Visual Studio最好用了,但是想到它那巨大的体积,实在是没法忍受。要不是CLion总是闪退,肯定不会考虑用Visual Studio的,为了这个还特意安装了Visual Studio 2022版本,虽然只装了个C++的功能,就占了8G,太恐怖了。Visual Studio体积大归大,使用起来还是挺方便的,在扩展里面安装了个Qt VS tools插件,简单配置了一下,把原来在CLion工程里写的那几句关键代码移过来,很快就跑出了结果。如下图所示:
现在的Qt VS tools好像可以不用配置Qt的pro文件了,直接按正常的C++编程配置方式就可以把各个第三方的库加进来,还是挺方便的。
目前能写Qt的开发环境应该有很多,就我个人来说,我还是倾向于CLion和Visual Studio的,毕竟这两个IDE的影响力比较大,特别是CLion是跨平台的,后期可以省很多事。这次为了使用QtChart功能,可能遇到了一些小Bug导致没有在CLion下运行成功,不过后续如果解决了这个问题,可能还会再迁回来CLion的。Visual Studio就不说了,windows环境下的首先IDE,功能强大,使用方便,就是太大了。