• 6189阅读
  • 29回复

[提问]Qt和C++Builder的一些问题 [复制链接]

上一主题 下一主题
离线liuligang88
 

只看楼主 倒序阅读 楼主  发表于: 2015-11-30

这是C++Builder中的代码,C++Builder中的TList和TStringList在Qt中是什么???
哪位大神能指点一下。如果能把这段代码转化成Qt中的代码就更好了。。。谢谢!!!
TList *List = new TList;
  for (int i = 0; i < cnt; i++)
  {
         TStringList *StringList = new TStringList;
          List->Add(StringList);
   }
  TStringList *StringList = (TStringList *)List->Items[0];
离线z55716368

只看该作者 1楼 发表于: 2015-11-30
感觉TList就是Qt里面的QList<QString> 然后TList就是QList<QList<QString>>
每一个问题 都是一次进步
离线liuligang88

只看该作者 2楼 发表于: 2015-11-30
回 z55716368 的帖子
z55716368:感觉TList就是Qt里面的QList<QString> 然后TList就是QList<QList<QString>> (2015-11-30 16:23) 

非常感谢。可我这么写,会报错,不知是哪里不对,求指点

#include <QStringList>
#include <QList>

QList *list = new QList;
    for (int i = 0; i < cnt; i++)
    {
       QStringList *StringList = new QStringList;
       list->append(StringList);
    }
QStringList *StringList = (QStringList *)list->indexOf(0);
离线stlcours

只看该作者 3楼 发表于: 2015-11-30
C++Builder中的TList和TStringList在Qt中是什么?
对应还是TList和TStringList

不过,QT里真正使用,应该加上泛型;

你写的代码应该改成:
    QList<QStringList*> *list;;
离线liuligang88

只看该作者 4楼 发表于: 2015-11-30
回 stlcours 的帖子
stlcours:C++Builder中的TList和TStringList在Qt中是什么?
对应还是TList和TStringList
不过,QT里真正使用,应该加上泛型;
....... (2015-11-30 17:51) 

非常感谢你的帮助。
那我这么写,行吗?和上C++中的代码意思相同吗?

QList<QStringList*> list;
    for (int i = 0; i < cnt; i++)
    {
       QStringList *StringList = new QStringList;
       list.append(StringList);
    }
    QStringList *StringList = (QStringList *)list[0];
离线z55716368

只看该作者 5楼 发表于: 2015-11-30
恩 3楼的这个 我忘了直接有个QStringList
每一个问题 都是一次进步
离线liuligang88

只看该作者 6楼 发表于: 2015-11-30
回 z55716368 的帖子
z55716368:恩 3楼的这个 我忘了直接有个QStringList (2015-11-30 18:13) 

恩,谢谢,可他们的属性我还不太了解,如果可以的话,能不能把上面C++那段代码,改成Qt上面能运行的。麻烦了
离线stlcours

只看该作者 7楼 发表于: 2015-12-01
回 liuligang88 的帖子
liuligang88:非常感谢你的帮助。
那我这么写,行吗?和上C++中的代码意思相同吗?
QList<QStringList*> list;
....... (2015-11-30 18:12) 

行啊,试试不就知道了,都是C++的语法,连类名都一模一样,哪有多大差别。

这种问题不属于疑难杂症,属于基础知识,有功夫在论坛上问,不然自己当场学教程里的一段,或者查QT的帮助,就能搞定的。
离线liuligang88

只看该作者 8楼 发表于: 2015-12-01
回 stlcours 的帖子
stlcours:行啊,试试不就知道了,都是C++的语法,连类名都一模一样,哪有多大差别。
这种问题不属于疑难杂症,属于基础知识,有功夫在论坛上问,不然自己当场学教程里的一段,或者查QT的帮助,就能搞定的。 (2015-12-01 06:27) 

恩,非常感谢,因为这是给公司改代码,要求时间比较紧,还对Qt不是太了解,
我再问一下C++Builder中StringList->Strings[kk]);这一句,在Qt中对应StringList应该是哪个属性,
我试过很多,但都不是,急求,望解答,谢谢!!!
离线stlcours

只看该作者 9楼 发表于: 2015-12-01
回 liuligang88 的帖子
liuligang88:恩,非常感谢,因为这是给公司改代码,要求时间比较紧,还对Qt不是太了解,
我再问一下C++Builder中StringList->Strings[kk]);这一句,在Qt中对应StringList应该是哪个属性,
我试过很多,但都不是,急求,望解答,谢谢!!!
 (2015-12-01 09:11) 

对应StringList[kk],或者StringList->at(kk),推荐用后一种方法,因为这种方法采用了隐式共享(类似于BCB的String的自动引用计数),效率更高。
离线sevencat

只看该作者 10楼 发表于: 2015-12-01
直接用std::vector,std::list也可以,我觉得能用stl的时候优先使用stl而不是qt的容器。
战争就是和平,自由就是奴役,愚味就是力量
离线stlcours

只看该作者 11楼 发表于: 2015-12-01
回 sevencat 的帖子
sevencat:直接用std::vector,std::list也可以,我觉得能用stl的时候优先使用stl而不是qt的容器。 (2015-12-01 16:34) 

QT基本上重新封装了一遍std的各种功能,采用Java风格。我感觉QT封装的,要比STD更好用。

最近一段时间,已经几次看到文章说,尽量不要使用STD(唱衰),理由若干。

而且你不能否认,QT库的开发者们都是高手里的高手,他们重新实现一遍,肯定不是吃饱了饭没事做,是有他们自己的理由的。
离线sevencat

只看该作者 12楼 发表于: 2015-12-01
因为早期std不完善。唱衰std?我觉得没必要听,唱衰c++倒是有合理性。
战争就是和平,自由就是奴役,愚味就是力量
离线johnyork

只看该作者 13楼 发表于: 2015-12-01
可是我还在用STD,没办法人家是标准的嘛,标准的意思就是不管你什么平台,只要你用C++,那你就得兼容我!
我们的代码不能做成离了Qt就活不了的那种啊,否则太受制于人了三
离线sevencat

只看该作者 14楼 发表于: 2015-12-01
其实也可以程序里面qt的库只用在ui层,其他层尽量用std或者其他的。
战争就是和平,自由就是奴役,愚味就是力量
离线dbzhang800

只看该作者 15楼 发表于: 2015-12-01
回 stlcours 的帖子
stlcours:QT基本上重新封装了一遍std的各种功能,采用Java风格。我感觉QT封装的,要比STD更好用。
最近一段时间,已经几次看到文章说,尽量不要使用STD(唱衰),理由若干。
....... (2015-12-01 19:01) 

这种说法我倒没听说,我听说的是:尽可能使用stl中的容器,而不是Qt自己的容器。

QtWidgets的维护者 Marc Mutz 有一篇博客比较详尽的介绍了 Qt自己的容器。介绍了何时用什么比较好

https://marcmutz.wordpress.com/effective-qt/containers/
离线johnyork

只看该作者 16楼 发表于: 2015-12-01
回 sevencat 的帖子
sevencat:其实也可以程序里面qt的库只用在ui层,其他层尽量用std或者其他的。 (2015-12-01 19:55) 

英雄所见略同!
离线stlcours

只看该作者 17楼 发表于: 2015-12-02
回 dbzhang800 的帖子
dbzhang800:这种说法我倒没听说,我听说的是:尽可能使用stl中的容器,而不是Qt自己的容器。
QtWidgets的维护者 Marc Mutz 有一篇博客比较详尽的介绍了 Qt自己的容器。介绍了何时用什么比较好
....... (2015-12-01 20:08) 

我只是有印象,也没细看,现在一搜,就出来两篇:
http://www.zhihu.com/question/20201972
http://www.oschina.net/question/188977_58777

望德宝兄加以批判,真理是越辩越明的~
离线dbzhang800

只看该作者 18楼 发表于: 2015-12-02
回 stlcours 的帖子
stlcours:我只是有印象,也没细看,现在一搜,就出来两篇:
http://www.zhihu.com/question/20201972
http://www.oschina.net/question/188977_58777
....... (2015-12-02 00:52) 

你贴的两个链接,是C++的用户在探讨:是该用标准库中的容器,还是要自己去实现容器。这个问题不好回答,因为在某些特定应用下,可能有其他更合适的库,或者个人确实可以写出更高效的容器,但一般程序员,很难做到这点。

Qt用户现在的问题是:是用Qt自己的容器,还是C++标准库的容器。这个也没有固定答案,marc mutz在blog中开篇是这么说的:

Qt comes with its own set of container classes, closely modeled after those in the STL, but with subtle and not-so-subtle differences, some of them clever additions, others; not quite so. As a Qt programmer, it is important to understand when to use which Qt container class, and, if you have the option, when to use STL containers instead.
离线sevencat

只看该作者 19楼 发表于: 2015-12-02
不使用stl的原因很简单,
一些特定环境,特定项目不允许,比如说一个内存只有几百K的上面你去大量用stl,造成难以控制。
还有一种是性能原因,要追求极限的性能,你当然不能随便使用第三方库了。
另外一种人是偏激,那种人不要理他们。
战争就是和平,自由就是奴役,愚味就是力量
离线sevencat

只看该作者 20楼 发表于: 2015-12-02
再说,你已经使用qt了,还关心性能问题?
战争就是和平,自由就是奴役,愚味就是力量
离线sevencat

只看该作者 21楼 发表于: 2015-12-02
我建议你看这个吧,国内的人偏激的多,很多是非此即彼和“不是我用的,就是我喷的”
http://stackoverflow.com/questions/1668259/stl-or-qt-containers
战争就是和平,自由就是奴役,愚味就是力量
离线stlcours

只看该作者 22楼 发表于: 2015-12-02
回 sevencat 的帖子
sevencat:再说,你已经使用qt了,还关心性能问题? (2015-12-02 11:37) 

QT性能很不错啊。我用TreeView创建20万个节点并当场显示,也就1、2秒时间。其它的,我也不知道,因为我不追求图形的极限性能。

但是有一次我竟然看到有人说,说QT的性能比原生的性能还要好!比原生API性能更好是不可能的,但是比其它原生的某些框架性能更好还是有可能的。你要是懂这句话,还望指教或者批判。
离线stlcours

只看该作者 23楼 发表于: 2015-12-02
回 dbzhang800 的帖子
dbzhang800:你贴的两个链接,是C++的用户在探讨:是该用标准库中的容器,还是要自己去实现容器。这个问题不好回答,因为在某些特定应用下,可能有其他更合适的库,或者个人确实可以写出更高效的容器,但一般程序员,很难做到这点。
Qt用户现在的问题是:是用Qt自己的容器,还是C++标准库的 .. (2015-12-02 11:14) 

老兄,这段英文我看得不是很明白。能否翻译一下?

我的理解是,QT容器更模型化,它和STL只有细小的差异。然后又说了一句 not quite so,我就不明白,他到底想说什么了。

不过我猜想,根本原因,可能是为了让早期那些对STL支持不佳的编译器来使用QT吧?
离线stlcours

只看该作者 24楼 发表于: 2015-12-02
回 dbzhang800 的帖子
dbzhang800:你贴的两个链接,是C++的用户在探讨:是该用标准库中的容器,还是要自己去实现容器。这个问题不好回答,因为在某些特定应用下,可能有其他更合适的库,或者个人确实可以写出更高效的容器,但一般程序员,很难做到这点。
Qt用户现在的问题是:是用Qt自己的容器,还是C++标准库的 .. (2015-12-02 11:14) 

德宝兄,我现在仔细看了那2个帖子,引入STL带来的问题,有很多个,而不仅仅是“个人确实可以写出更高效的容器”。你要是只拿这一点说事,貌似还是在回避问题。
离线sevencat

只看该作者 25楼 发表于: 2015-12-03
TreeView创建20万个节点并当场显示

//================================
这个主要还是因为treeview其实是虚拟列表吧。
战争就是和平,自由就是奴役,愚味就是力量
离线realfan

只看该作者 26楼 发表于: 2015-12-03
回 dbzhang800 的帖子
dbzhang800:这种说法我倒没听说,我听说的是:尽可能使用stl中的容器,而不是Qt自己的容器。
QtWidgets的维护者 Marc Mutz 有一篇博客比较详尽的介绍了 Qt自己的容器。介绍了何时用什么比较好
....... (2015-12-01 20:08) 

大概浏览了一下。文中说stl只有string是隐式共享的,其它容器,复制都要深拷贝。而Qt容器,普遍采用了隐式共享方式,所以效率会高。
并且能用const标识的,尽量用const,会减少内部很多额外的工作,提高效率。

好像没看到说尽可能使用stl,而不用Qt容器。
离线dbzhang800

只看该作者 27楼 发表于: 2015-12-03
回 realfan 的帖子
realfan:大概浏览了一下。文中说stl只有string是隐式共享的,其它容器,复制都要深拷贝。而Qt容器,普遍采用了隐式共享方式,所以效率会高。
并且能用const标识的,尽量用const,会减少内部很多额外的工作,提高效率。
好像没看到说尽可能使用stl,而不用Qt容器。
....... (2015-12-03 11:50) 

恩,这篇blog是没有这么说,该blog中只是在比较Qt容器和stl容器的异同,并给出何时用什么比较合适的建议。以及如何用好Qt容器的建议。比如:如果能利用Qt容器的写时复制特性,则建议优先选用Qt容器,而不是stl容器。比如:建议优先使用vector(QVector或std::vector)而不是QList等。

我只是印象中记得在哪儿看过,在二者都可用的情况下且不确定那个更好的时候,优先选择stl中的容器。

但很多时候是不能自由选择的,比如使用Qt相应的API时候,只能用API采用的容器。再比如写时复制,Qt容器支持,而stl的不支持等。再比如C++11中的 ranged for,用于Qt的容器的话,会导致深拷贝。而Qt的 foreach 用于stl容器也会导致深拷贝等。
离线liuligang88

只看该作者 28楼 发表于: 2015-12-03
恩,非常感谢上面的回答者,我看了上面讨论都蒙了,感觉自己太LOW 了,还得加紧学习!!!
离线stlcours

只看该作者 29楼 发表于: 2015-12-03
回 sevencat 的帖子
sevencat:TreeView创建20万个节点并当场显示
//================================
这个主要还是因为treeview其实是虚拟列表吧。 (2015-12-03 08:35) 

能显示、能响应不就行了?什么东西不是虚拟的?

另外告诉一点心得,就是Windows窗口的按钮,点击前有一个矩形边框,知道怎么显示的吗?就是选中两种合适的颜色,就可以达到欺骗人的眼睛的目的,让人看起来是立体的!!这是我研究Delphi源码时候发现的,以前还一直好奇呢!
快速回复
限100 字节
 
上一个 下一个