我的coding之路--实习第一个月的感悟 和 QT 入门方法

实习第一个感悟

我从投简历开始到入职一共花了大概两周不到的时间,没有什么诀窍,就是海投,我投递了实习僧和BOSS上目标城市的所有C++和QT的实习岗位,一共获得了三家的面试的机会,一家非常小的公司,一家独角兽AI公司(非常遗憾没有通过面试,自己的代码能力还是太菜),和现在入职的这家还比较大的公司,在智驾部门,还是非常满意的。
我已经实习一个月有余,岗位是软件开发 主要是用QT负责界面开发,目前我接触的QT的工作和前端类似,主要就是负责开发一款仿真软件的某一部分界面。如果大家像我是一个非科班毕业即将攻读软件工程硕士的准硕士或者想通过比较短的一段时间的学习就能找到实习,并且后期还有时间进行其他实习,我觉得QT是一个比较快能够入门并找到实习感受程序员工作方式的一门不错的框架吧。
原因有以下几点吧:第一,比较容易上手;第二,工作和前端有点相似,可以感受前端的工作方式;第三,后期也可能会用到,是一个不算冷门的框架。
今天主要就是介绍一下我是如何快速入门QT并找到实习的。另外就是讲一下我开发中遇到的两个实际问题,可能比较简单,主要是介绍一下我的思维过程吧。
后期会专门写一下最近我接触的和QT相关的技术点,希望对各位能有所帮助。

QT快速入门方法

前期基础篇

学习QT首先的首先是得会C++,如果在会C++的基础之上,学习QT入门,最多三天就可以搞定,如果你现在C++掌握得还行,就可以直接投QT岗位的实习了,边投边学一点问题没有。
好了,说一下具体的C++和QT的基础部分的学习:
首先,C++我推荐课程是黑马的C++课程,这个大概全力学习也得15天左右吧,然后可以辅以《C++ primer》或者《C++ primer plus》,听说plus要比前一个稍微基础一些,我没具体对比过,所以不太好作评价。主要重点学习基础语法和封装继承多态就行了,STL要了解一下。另外,就是QT的学习了,QT的学习一定要结合实际demo来学习,我推荐《QT5开发及实例》,这是一本非常不错的书,有非常多的实例和demo。然后课程的话我看的还是黑马的课,这个课很短,开2倍速播放都可以,主要是了解QT的编写风格和编码方式还有一些控件的使用,功能的实现。QT的核心就是控件的使用布局和功能的实现。最后,最重要的最重要的最重要的(有必要说三遍)就是官方的帮助文档,在这儿你能知道每一个控件,每一个函数具体怎么使用,真的是学习必备神器。另外,我入职之后导师给我的是一本霍亚飞的《Qt Creator 快速入门》这本书写得通俗易懂,非常适合 Qt 新手学习。这些看完了差不多就可以直接上手项目了。当然在公司中还包括从后台读取数据和其他比如图像处理,但不同的公司处理的方式不一样,这就不作介绍了,我们公司主要通过DOM读取XML,这个入职之后再学也非常的快。
学习资料总结
C++:
书籍《C++ primer》或者《C++ primer plus》
课程 黑马C++相关课程(官网和B站都有)
QT:
书籍 《QT5开发及实例》和《Qt Creator 快速入门》
课程 黑马QT课程
工具 官方帮助文档和CSDN相关博客

发展篇

如果学习完QT后,发现有一定的兴趣,可以尝试学习一些可以和QT搭配的其他框架或算法,如FFmpeg,OpenCV,OpenGL等,可以尝试做一个播放器。这个也是我在github上看到许多项目都是这几个相关的。这里我推荐一个项目吧,我觉得还不错。
链接: https://github.com/ithewei/hplayer.git.
这就是一个以上几个相结合的项目,非常适合上手学习。
然后就是可以学习了解QT相比C++的不同或改进之处。这个我后面会专门讲一下我了解学习到的源码或其他值得学习的东西。

实际开发篇

最后就是讲一下我在实际工作中遇到的两个小问题,是如何解决的。

字符串切割

第一个就是就是通过DOM读取了XML字符串后,需要取一个结点内的字符串中的不同数字填入不同的Table中,简单来说就是做一个字符串的切割,这个我最开始是不太会的,后来看了一些博客才知道可以用split+正则表达式来完成。
下面展示一些 具体代码

// 读取XML数据并完成切割
QString str=Element.attribute("value");
QVector <QString> s=str.split(QRegExp("[, ;\t\r\n]"),QString::SkipEmptyParts).toVector();//QRegExp("[]")填入切分的标志,SkipEmptyParts是忽略空格

这样就能得到想要的数据了。

Tab页的隐藏

另外一个小问题就是:显示和隐藏一个tabwidget中的部分tab页,最开始我尝试了hide发现并没有类似的接口(因为tab不是QWidegt),使用removeTab()固然可以做到,但是这样的话我们再次需要显示这些tab时再把它们加进去,有时候计算index会很麻烦。所以有没有什么办法可以在不删除tab的前提下隐藏掉某些tab呢,这样就能避免再次添加tab和计算index的麻烦。最后发现利用QTabWidget::setTabEnabled()接口与QSS来共同实现隐藏tab。
setTabEnabled()很容易理解,可以在不需要使用某些tab时将其禁用掉。但是禁用掉tab并不会使其隐藏,这时就需要QSS出马了。QSS实际上也不能隐藏tab,但它可以把处于禁用状态的tab宽度设为0,同时将文字颜色设为透明,然后就看不到这个tab了,这样就间接达到了隐藏的目的。
下面展示一些 具体代码

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    const int originalTabNum = ui->tabWidget->count();
    const int tabNum = 10;

    for (int i = 0; i < originalTabNum; i++)
    {
        ui->tabWidget->removeTab(0);
    }

    for (int i = 0; i < tabNum; i++)
    {
        ui->tabWidget->addTab(new QWidget(this), QString::number(i));
    }

    ui->comboBox->addItem("13579");
    ui->comboBox->addItem("02468");
    ui->comboBox->addItem("159");
    ui->comboBox->addItem("048");
}

Widget::~Widget()
{
    delete ui;
}

void Widget::on_comboBox_currentTextChanged(QString text)
{
    const int textLen = text.length();
    const int tabNum = ui->tabWidget->count();
    for (int i = 0; i< tabNum; i++)
    {
        ui->tabWidget->setTabEnabled(i, false);
    }
    for (int i = 0; i < textLen; i++)
    {
        bool ok = false;
        int index = text.mid(i, 1).toInt(&ok);
        if (ok)
        {
            ui->tabWidget->setTabEnabled(index, true);
        }
    }
    /*
     * 似乎由于tab并不是QWidget的缘故,需要每次在对显示的tab进行调整后,调用setStyleSheet使其生效
     */
    ui->tabWidget->setStyleSheet("QTabBar::tab:disabled {width: 0; color: transparent;}");
}

在改变QComboBox被选择的item后,会根据当前item的text而显示或隐藏某些tab。先使用setTabEnabled()禁用需要隐藏的tab,然后调用setStyleSheet()将禁用的tab宽度设为0,文字颜色设为透明。
效果图如下:
在这里插入图片描述

当然还有些细节需要注意,一个是如果之前被选择的tab如果被禁用掉的话,它不会自动重新选择一个可用的tab,这个需要手动处理;另一个是如果仔细观察的话,tab之间有一个隐藏的tab的话对显示样式会有细微的影响,最左侧和最右侧最为明显(可能会少一个边框)。

结语

后面我会自己写或者转载一些我学习到和QT源码相关的知识,希望能和大家相互交流学习,同时也希望通过知识的输出加深印象。如果有什么错误的地方还希望大家指出或相互讨论。

  • 4
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值