回答问题之前,先说下结论,其实在C++领域,Qt算是很不错了。玩C++的,如果没有听说过Qt,那么我可能要怀疑你的专业水平了。有GUI的地方都有Qt,有嵌入式的地方一般也有它,金融、工业、电力、视频监控等行业也有它。那为什么会给人以Qt框架不是很流行的错觉呢?
1、Qt在C++领域已经相当火了,但架不住C++本身不火,现在是互联网的天下……
2、Qt没有个好爹。从最早的TrollTech,到后来Nokia,再到Digia,现在甚至独立出来自己上市了。
3、授权协议,目前Qt是GPL和LGPL,这个就不用我详细解释了吧,动不动就要开源。除非买企业版解除这个限制,但是企业版又意味着一大笔开销。
4、编译后打包的东西太大太大。
最后,附一张使用Qt的QSS基础绘制的PC客户端界面换肤效果图。
Qt框架非常强大,但是,代码书写太麻烦,不适合新手。
目前有Pyqt5和pyside2是用python的代码书写制作GUI,虽然很强大,但是也只是适合老程序员,新手也还是觉得太麻烦,流行不起来。
如果只是制作简单的GUI目前有很多其他简单的工具,就python就有很多种方法制作小工具的GUI
C++作为一门优秀的编程语言,也曾经独领风骚,只是因为没有一个统一的图形库而备受诟病,虽然曾经有C++ Builder和MFC让程序员眼前一亮,但是因为这些图形库设计的先天不足,导致难以学习又使用不便,并且随着Java与C#的兴起,逐渐淡出人们的视线。
同Java、C#等语言相比,C++有一个巨大的优势就是性能,在对性能要求较高的场景还是少不了C++身影,C++依然有很大的使用群体,所以很自然的就有人想要推出一套更好的C++的图形库,于是QT就应运而生了。其实QT也是几易其主,并最终逐渐被很多程序员认识并使用。
那么为什么QT不是很流行友野御呢,我认为主要有以下几个原因:
第一, QT依赖的编程语言C++本身式微,在最新的TOBIE编程语言排行榜上,C++的份额比Java要低很多。
第二, 多语言混合编程的兴起,在早期的编程实践中,多语言编程是一件很麻烦的事情,随着技术的不断进步,混合编程已经变得容易很多,于是C++更多的是从事幕后的工作,UI的工作则可以由其它语言完成,比如C#调用C++的库。
第三, QT框架的核心技术是引入了信号-槽机制,以及在此基础上建立的图形库和辅助工具,如uic, moc, rcc等,这些工具的引入增强了QT的功能,但是却引入了另外一个严重的问题,编译时间的增长。正常情况下C++只需要编译一次,但是在使用了QT信号-槽机制的C++文件中,则需要先使用moc编译生成一个中间文件,然后再编译该中间文件,等于编译两次,大大增加了编译时间。
综上,虽然QT有一些不足,但是因为它是一套优秀的可以跨平台的编程框架,在加上C++语言的高效率,以及开源加持,目前依然有着广泛的使用场景,而且使用人数还在逐年上升。
巨头用qt的比较少,一方面是由于qt的商业授权,一方面是自主可控,还有技术沉淀,qt涉及的内容非常多,对大厂的业务来说有些臃肿。我不知道,火应该怎样定义,像python那样?毕竟cpp开发人员就少,qt不过是个ui框架,这里边还由于几大厂都有自己的发展路线。比如微软,谷歌,苹果,这也就导致没有顶级大厂支持。但是,qt在开源界,中小企业用的相当多,因为它足够强大。
大厂要的是执行效率qt是通用的给不了,qt要的是开发效率。不可想像一个京东app如果用qt开发,那个卡。除非qt深度定制,人家都有一堆脊喊高手,何必找些不可控的事来做。
PC时代已经过去了,CPP辉煌时代也已经过去了。
qt是一款容易上手和开发的工具,开发软件基本上都会用到qt的qml和qwidget,为什么不火?认好岩为是qt太重量级了,移植到嵌入式设备遇到性能问题只能求助于官方,最重要的原因是qt只有部分版本才能无限商业使用阻碍大家大范围的使用,注定其一般的人生。
KDE,QT开发的。
目前重心都是app
Qt还在忙于移植到安卓 苹果,但是桌面软件和商用软件里,它的身影比较多
qt,最近几年还是比较火热,那些大企业开发自己的ui框架算不了什么难事
1、QString2、QVariant
3、QStringList
4、QVector
5、QStack
6、QQueue
7、QList
8、QMap
QString 是qt中关于String的封装类,用于处理字符串。
'''
void testQString(){
QString str1="hello"
qDebug()<<str1
str1.append("word")
qDebug()<<str1//"hello word"
qDebug()<<str1.indexOf("word")//5
QString str2="Hello"
qDebug()<<str2
str2.fill('x')//"xxxxx"
qDebug()<<str2
str2.fill('x',2)//"xx"
qDebug()<<str2
qDebug()<<QString().isEmpty()//true
qDebug()<<QString("").isEmpty()//true
qDebug()<<QString(" ").isEmpty()//false
qDebug()<<QString("abc").isEmpty()//false
qDebug()<<QString().isNull()//true
qDebug()<<QString("").isNull()//false
qDebug()<<QString(" adc").isNull()//false
QString str3="Hello"
qDebug()<<str3
qDebug()<<str3.left(3)//"hel"
qDebug()<<str3.mid(2,2)//"ll"
qDebug()<<str3.mid(2)//"llo"
qDebug()<<str3.right(4)//"ello"
QString str4="hello word"
qDebug()<<str4//"hello word"
str4.remove(5,6)
qDebug()<<str4//"hello"
QString str5="hello word"
str5.insert(5,QString("word"))
qDebug()<<str5//"hello wordword"
QString str6="hello word"
QString re="孙此判you"
str6.replace("word",re)
qDebug()<则改<str6//"hello you"
QString path="/user/local/bin/mapp"
qDebug()<<path//扒蚂"/user/local/bin/mapp"
QStringList list=path.split('/',QString::SkipEmptyParts)
qDebug()<<list//("user,"local","bin","mapp")
QString str7="hello word"
qDebug()<<str7.startsWith("hello")//true
qDebug()<<str7.endsWith("word")//true
qDebug()<<QString("hello %1,helo you %2 ").arg("word").arg("hmf")//hello word,hello you hmf
qDebug()<<QString::localeAwareCompare("xxx","XXX")//-1
}
'''
QVariant 是万能变量,可以存取各种变量。
'''
void testQVariant(){
QVariant var
var.setValue(QString("hello word"))
qDebug()<<var//QVariant(QString, "hello word")
QString data=var.toString()
qDebug()<<data//"hello word"
//var.clear()
var.setValue(100)
qDebug()<<var//QVariant(int, 100)
int d=var.toInt()
qDebug()<<d//100
}
'''
QStringList 是存储QString类型的列表。
'''
void testQStringList(){
QStringList stL
stL<<"str1"<<"str2"<<"str3"<<"str4"
qDebug()<<stL//("str1", "str2", "str3", "str4")
QString str1=stL.join("/")
qDebug()<<str1//"str1/str2/str3/str4"
qDebug()<<stL.contains("str1")//true
qDebug()<<stL.indexOf("str2")//1
stL.append("str3")
stL.append("str4")
qDebug()<<stL//("str1", "str2", "str3", "str4", "str3", "str4")
stL.removeDuplicates()
qDebug()<<stL//("str1", "str2", "str3", "str4")
//遍历方法1
for (int i=0i<stL.size()i++){
qDebug()<<stL.at(i)
}
//遍历方法2
QStringList::Iterator itr
for(itr=stL.begin()itr!=stL.end()++itr){
qDebug()<<*itr
}
}
'''
QVector 数组的模板类,本质是动态数组,存储方式是一片连续的内存空间。
'''
void testQVector(){
QVector<QString>tV
tV.append("Str1")
tV.append("str2")
tV.append("str3")
tV.append("str4")
qDebug()<<tV//QVector("Str1", "str2", "str3", "str4")
tV.prepend("str0")
qDebug()<<tV//QVector("str0", "Str1", "str2", "str3", "str4")
tV.push_back("str5")
qDebug()<<tV//QVector("str0", "Str1", "str2", "str3", "str4", "str5")
tV.push_front("str00")
qDebug()<<tV//QVector("str00", "str0", "Str1", "str2", "str3", "str4", "str5")
for(int i=0i<tV.size()i++){
qDebug()<<tV.at(i)
}
QVector<QString>::Iterator itr
for(itr=tV.begin()itr!=tV.end()itr++){
qDebug()<<*itr
}
qDebug()<<tV.isEmpty()//false
qDebug()<<tV.at(0)//"str00"
qDebug()<<tV.value(3)//"str2"
qDebug()<<tV.size()//7
tV.pop_back()
qDebug()<<tV//QVector("str00", "str0", "Str1", "str2", "str3", "str4")
tV.pop_front()
qDebug()<<tV//QVector("str0", "Str1", "str2", "str3", "str4")
}
'''
QStack为qt中的栈模板类,继承于QVector,具有后进先出的特性。
'''
void testQStack(){
QStack<QString>stack
stack.push("str1")
stack.push("str2")
stack.push("str3")
stack.push("str4")
qDebug()<<stack//QVector("str1", "str2", "str3", "str4")
qDebug()<<stack.pop()//"str4"
qDebug()<<stack//QVector("str1", "str2", "str3")
qDebug()<<stack.top()//"str3"
qDebug()<<stack//QVector("str1", "str2", "str3")
qDebug()<<stack.isEmpty()//false
qDebug()<<stack.size()//3
while(!stack.isEmpty())
{
qDebug()<<stack.pop()
}
}
'''
QQueue 是qt中的队列的模板类,同样继承自QVector,具有先进先出的特性。
'''
void testQueue()
{
QQueue<QString>qq
qq.enqueue("str1")
qq.enqueue("str2")
qq.enqueue("str3")
qq.enqueue("str4")
}
'''
QList是qt中的链表的实现,同时可以按位置索引和快速插入删除数据。
'''
void testList(){
QList<QString>ql
ql.append("str")
ql.append("str1")
ql.append("str2")
ql.append("str3")
ql.append("str4")
ql.append("str5")
qDebug()<<ql//("str", "str1", "str2", "str3", "str4", "str5")
for(int i=0i<ql.size()i++){
qDebug()<<ql.at(i)
}
QList<QString>::Iterator itr
for(itr=ql.begin()itr!=ql.end()itr++){
qDebug()<<*itr
}
ql.pop_back()
qDebug()<<ql//("str", "str1", "str2", "str3", "str4")
ql.pop_front()
qDebug()<<ql//("str1", "str2", "str3", "str4")
qDebug()<<ql.size()//4
qDebug()<<ql.isEmpty()//false
}
'''
QMap 是qt中映射的模板类。就是字典。
'''
void testMap()
{
QMap<QString,int>map
map["one"]=1
map.insert("two",2)
map["three"]=3
map["four"]=4
map["five"]=5
qDebug()<<map//QMap(("five", 5)("four", 4)("one", 1)("three", 3)("two", 2))
qDebug()<<map.value("one")//1
qDebug()<<map["two"]//2
qDebug()<<map.contains("two")//true
qDebug()<<map.keys()//("five", "four", "one", "three", "two")
qDebug()<<map.values()//(5, 4, 1, 3, 2)
//数据遍历
QMapIterator<QString ,int>itr(map)
while(itr.hasNext()){
itr.next()
qDebug()<<itr.key()<<itr.value()
}
}
'''
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)