这是一次使用vscode以cmake方式使用QT库的示例,可以以此熟悉QT的使用以及c++项目的管理与第三方库的引入使用

前期准备

  1. 安装QT

    • 在终端中使用 -v形式的命令检查是否安装了gcc,g++,clang,make,make-guile,cmake。如果没有安装,则使用sudo apt install 形式的命令进行安装。
    • 使用 sudo apt-get install build-essential 命令安装qt组件。
    • 使用 sudo apt-get install qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools 命令安装qt开发工具。
    • 使用 sudo apt-get install qtcreator 命令安装qtcreator。
    • 使用 sudo apt-get install qt5* 命令安装qt5。
  2. 配置qt环境变量

    • 使用 sudo vim /etc/profile 编辑/etc/profile文件,在文件最后一行中根据你自己的qt的bin的安装路径(我的是 /usr/lib/qt5/bin)写入 PATH='your bin path:$PATH'
    • 使用 source /etc/profile 命令更新/etc/profile文件
  3. 在vscode中安装clangd,CMake,CMake Tools,CodeLLDB,Qt tools插件

项目创建编码及其构建

  1. 在项目所在目录下创建项目文件结构

    • 结构如图
    • build文件夹是cmake编译项目的中间产物的集中管理文件夹
    • resources文件夹是存储项目所需资源的文件夹,如图片等
    • src为源代码管理文件夹

      • app文件夹为qt主程序所在文件夹
      • textFinder文件夹为qt相关界面组件实现代码文件夹

        • include文件夹为qt界面组件头文件文件夹
        • src文件夹为qt界面组件实现代码文件夹
  2. 编写源程序

    • 编写qt主程序

      • 在../src/app(..代表你的项目所在目录位置)文件夹下编写主程序main.cpp如下

        #include <textfinder.h> //自己实现的界面组件头文件
        #include <QApplication>//QT图形应用程序类,它调用各级界面以实现qt程序
        int main(int argc, char **argv) {
        QApplication a(argc, argv);//实例一个应用程序类对象
        TextFinder w;//实例化一个自己实现界面类对象
        w.show();//现实所实现的界面
        return a.exec();//循环以实现项目的持续存在
        }
    • 编写自己所定义的界面类

      • 在../src/textFinder/include文件夹下编写自己定义界面类的头文件textfinder.h如下

        // 头文件
        /**
        头文件在最前面两行写入
        #ifndef _YOURHEAFILENMAT_H_
        #define_YOURHEAFILENMAT_H_
        在最后一行写入
        #endif 
        通过以上方式的三个预处理命令可以防止当一个头文件被多个文件的同时包含的情况下,在编译连接时出现的重复定义错误
        **/
        #ifndef _TEXTFINDER_H_
        #define _TEXTFINDER_H_
        #include <QLineEdit>
        #include <QTextEdit>
        #include <QWidget>
        class TextFinder : public QWidget {
        Q_OBJECT//使用qt的信号和槽机制时在类的声明中必须要写的一个宏。
        public:
        TextFinder(QWidget *parent = nullptr);//构造函数,父窗口代表着该窗口依赖于哪一个窗口
        ~TextFinder();
        private:
        QTextEdit *m_pTextEidt;
        QLineEdit *m_pLineEdit;
        #@brief 初始化UI
        void initUI();
        #@brief 加载文本文件
        void loadTextFile();
        private slots:
        void onBtnFindClicked();
        };
        #endif  
      • 在../src/textFinder/src文件夹下编写textfinder.cpp如下

        // 源文件
        #include "textfinder.h"
        #include <QFile>
        #include <QLayout>
        #include <QPushButton>
        #include <QTextStream>
        #include <QDebug>
        TextFinder::TextFinder(QWidget *parent) : QWidget(parent) {
        initUI();
        loadTextFile();
        }
        
        TextFinder::~TextFinder() = default;
        
        void TextFinder::initUI() {
        auto hBox = new QHBoxLayout();
        auto vBox = new QVBoxLayout();
        auto btnFind = new QPushButton("Find", this);
        m_pLineEdit = new QLineEdit(this);
        m_pTextEidt = new QTextEdit(this);
        
        // 设置Text Finder组件的布局为垂直布局
        setLayout(vBox);
        
        m_pLineEdit->setPlaceholderText("Keyword:");
        hBox->addWidget(m_pLineEdit, 2);
         hBox->addWidget(btnFind, 0);
        
         vBox->addLayout(hBox);
        vBox->addWidget(m_pTextEidt);
        
        connect(btnFind, &QPushButton::clicked, this, &TextFinder::onBtnFindClicked);
        }
        
        void TextFinder::loadTextFile() {
        QFile inputFile(":/input.txt");
        inputFile.open(QIODevice::ReadOnly);
        
        QTextStream in(&inputFile);
        QString line = in.readAll();
        inputFile.close();
        
        m_pTextEidt->setPlainText(line);
        QTextCursor cursor = m_pTextEidt->textCursor();
        cursor.movePosition(QTextCursor::Start, QTextCursor::MoveAnchor, 1); // ?
        }
        
        void TextFinder::onBtnFindClicked() {
        qDebug() << "btnFind has been clicked";
        auto keyword = m_pLineEdit->text();
        m_pTextEidt->find(keyword, QTextDocument::FindWholeWords);
        }
  3. 编写各级CMakeLists.txt文件以实现项目的构建

    • 此示例主要有两级CMakeLists.txt文件,一级是和src同目录的CMakeLists.txt文件,下一级是src/app和src/textFinder里的CMakeLists.txt文件。两级文件由第一级的CMakeLists.txt文件中的add_subdirectory()进行联系起以达到构建整个项目的目的。

      • 第一级CMakeLists.txt文件

        • 其主要工作进行一些基础设置(如项目名),设置QT所特有的编译选项,如MOC,引入并构建子目录等。
        • 内容如下:img
      • 第二级中src/textFinderd的CMakeLists.txt文件

        • 主要做生成自定义的textFinder库,链接QT的Widgets库等工作。
        • 内容如下:
      • 第二级中src/app的CMakeLists.txt文件

        • 主要做生成目标文件的工作,使用了先生成目标文件,再使用target_sources()命令添加源文件的模式,链接各种库等工作。
        • 其内容如下:

xianghanfeng
6 声望1 粉丝