c++基础怎么快速学qt,推荐几本书,不要老的最近看的资料编程总是通不过,很多类在qt4 5都用不

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++基础怎么快速学qt,推荐几本书,不要老的最近看的资料编程总是通不过,很多类在qt4 5都用不相关的知识,希望对你有一定的参考价值。

  这个问题的确是够大的,Qt的代码规模在整个开源世界里也是名列前茅的,这么大的项目其中的精华是非常多的,很难说得全面,实际上我对Qt也不是完全了解,里面还有很多我不熟悉的东西。

首先,我想谈的是 signal/slot,Qt算是发明了signal/slot,这个思想也被其他一些框架语言借鉴了。

谈signal/slot之前先来谈谈C++的缺欠,这个问题也被讨论很多了,这里只谈一点,C++的设计目标是面向对象语言,它不仅提供了对象的定义和构建的方式,也定义了对象间的关系,比如 继承 派生 聚合,但是它没有提供对象间通信和共享数据的方式,这个缺点在一般程序的开发上不算个大问题,我们可以自己简单实现,但是对于GUI开发,这个缺点就被放大了很多倍。GUI上的对象实在太多,窗口是对象,布局是对象,定时器是对象,而且对象间有错综复杂的关系,通信和数据交换非常频繁,比如按钮按下要通知父窗口或容器对象,滚动条变化了要通知列表对象。这种数量庞大的对象以及复杂的通信关系,可不是自己搞个简单的实现就能解决的。

说到通信和共享,其实他们是一回事,共享很多时候就是为了通信,而C++里要通信就必然要共享。
比如,一个类实例拥有另一个的指针,就可以访问对方的数据,调用对方的方法了,这实际就是共享了一个指针,这个类指针也是另一个对象的this。访问数据和调用方法其实都是通信,把对方的数据拿过来,把自己的数据送过去,交换数据就是通信。

在C++里,由于没有GC,管理大量原生指针是极其危险的,对象的生命周期不可控,野指针的出现概率会很高,大型C++ 的GUI项目参与开发的人数众多,很难保证都不犯错。
那么用观察者模式呢?其实也一样,还是共享了IObserverXXX指针。
那么发消息行不行呢?比如 MFC那样,可以,但是本质上还是共享了窗口句柄,否则消息发给谁呢?而且还带来另外的问题,就是类型安全,消息的参数是无法类型安全的。

Qt作为大型GUI项目的Framework,它必须解决这个问题,否则这个程序是写不大的,写大了就会问题层出不穷。
来看一段代码,看看Qt 的解决方案:

  Window::Window()

QPushButton *b = new QPushButton(this);
connect(b, SIGNAL(clicked()), SLOT(on_button_clicked()));


Window::on_button_clicked()

QPushButton *b = qobject_cast<QPushButton*>(sender());
b->setText("clicked!");


  这段代码,通过Qt的signal slot机制,把QPushButton的点击事件连接到了Window的on_button_clicked响应函数上。
Window 和 QPushButton并没有互相保存对方指针,QPushButton的指针b 只是个局部变量,用过之后很快销毁,Window和QPushButton实现了通信,数据共享,事件响应,但是却没有共享指针,而且他们不受对方的生命周期影响,无论谁先销毁,这段代码都不会出错。
这种方式还是类型安全的,当signal和slot的类型不匹配的时候 connect是会报错的。

有人会说,我们用智能指针不就好了。好啊,智能指针你不会自己写吧,那么用boost?boost里能创建窗口吗?不能吧,还是要其他GUI库的,把两个异构的Framework撮合到一起也不是轻而易举的。再说了Qt出来的时候,别说Boost,STL都还没有呢。

signal/slot为对象间通信提供了非常灵活方便的实现,如果你只关心一个signal那就可以只connect一个,可以多个slot连接同一个signal,也可以一个slot连接到多个signal,Qt会负责管理连接关系和对象生命周期,对象销毁时会自动断开连接。

Qt为了实现signal/slot也是付出代价的,在无法改变C++语法的情况下,只能通过moc预编译器来扩展关键字。这大概是独一无二的实现方式了,后来的signal/slot实现要不用C++ template,或者发明种语言直接做到语法里,比如C# delegate。

最后总结下,Qt的signal/slot是为了解决对象间通信问题,同时避免共享指针造成的内存野指针和对象生命周期问题。
参考技术A

有qt5的书呀,可以百度一下

我是软件工程大二学生,现在想看一些关于软件工程的课外书,请推荐几本~~~~

C语言:
《C程序设计语言》//谭浩强的那个就不要看了。。。
C++语言:
《C++ Primer Plus》
《C++ 编程思想》(I II)
《STL 源码剖析》
《深度探索 C++ 对象模型》
《effective C++》
JAVA:
《JAVA编程思想》
数据结构与算法
数据结构部分:
《大话数据结构》
《算法与数据结构 C语言版》 清华严蔚敏
《数据结构与算法分析:C++描述》 维斯 (Mark Allen Weiss)
算法部分
《算法导论》科曼(Cormen T.H.)【计算机类工程师必须研究之神书,看这个要10+月】
《算法艺术与信息学竞赛》 【ACM竞赛的参考用书,微难】
《算法设计与分析习题解答》清华 王晓东【这本可以用来入门】
设计模式:
《大话设计模式》
《design Pattern》
操作系统:
《深入理解操作系统》
LINUX:
《鸟哥的linux私房菜》【基础版本,linux】
其他强推书籍:
《计算机程序设计艺术》高纳德
【计算机不知道高纳德就如同学物理不知道牛顿,此书共七卷,貌似国内只能见到4卷】
《编程之美》 【微软出品的书,介绍了一些算法,对以后面试很有帮之】
《编程珠玑》 【很经典】
《我是一只IT小小鸟》
【强推,你这个年级正好可以看看这个职业规划类型的书,里面是很多具体经验的人,不同技术和成长路线的人的心得】
《代码大全》【微哲学】
其他个人的一些想法:
我也是软件工程的学生,今年刚刚大四,我们平时接触电路这个层面的东西不多,我自己也没看过这方面的书,所以也就没给你写推荐。计算机说道根上就是两个方向,硬件和软件,对应物理和数学,从我个人的经验和教训出发我建议你多多加强数学方面的休养,这好比是内功,一时半会儿显不出来,但是会对你整个的发展有强有力的促进作用:
《微积分》 不要看国内的,可以看看美国和英国方面的东西
《数值分析》我记得有苏联版本的,可以看看这个,苏联的数值分析非常强悍,反映出来就是在20世纪60 70年代计算机技术还不是很成熟的时候苏联人利用数值分析的强大制造飞机
《离散数学》黑色封面的那个,好好看看
《线性代数》计算机图形学和密码学会用到,
《计算方法》这个是了解性内容了
《复变函数》这也是了解性内容,以后如果想弄电路会有帮助
《组合数学》本科不会涉及,研究生的内容,可以尝试了解,对于理解负责的算法很有帮助

以上资料有很多英文版本,如果能不看中文就尽量不看中文,因为很多翻译不如自己去理解英文准确。建议多多加强自己的英语水平,英语好了以后无论是深造还是就业都会多很多机会

参考资料:自己的学习感悟

参考技术A 可以去论坛看看。
我给你推荐一个论坛,51cto. com这个论坛不错
你自己去看看吧

以上是关于c++基础怎么快速学qt,推荐几本书,不要老的最近看的资料编程总是通不过,很多类在qt4 5都用不的主要内容,如果未能解决你的问题,请参考以下文章

自学Java用哪本书好?

程序员不要自己把自己限制死了

C++编程书籍推荐:零基础入门书籍,学C++看它们就够了!

学Python 应该看哪些书籍

2019学习java最值得看的三本书

整理最新学习Python推荐的二十本书,你看过几本?最后几本你肯定猜不到!