找回密码
 FreeOZ用户注册
楼主: 四香油饼
打印 上一主题 下一主题

[菜鸟学堂] qt学习笔记

[复制链接]
61#
发表于 2-2-2009 17:06:19 | 只看该作者

回复 #60 四香油饼 的帖子

很正常,一般出现这种情况的时候就表示该起身去喝杯咖啡了
回复  

使用道具 举报

62#
发表于 3-2-2009 09:17:50 | 只看该作者
所以说我觉得先打好c++基础才是王道。

评分

参与人数 1威望 +20 收起 理由
四香油饼 + 20 我很赞同!我的基础太差了,还要继续努力

查看全部评分

回复  

使用道具 举报

63#
发表于 3-2-2009 10:08:34 | 只看该作者
四香油饼,你看的是中文的书吗?
回复  

使用道具 举报

64#
 楼主| 发表于 3-2-2009 10:23:08 | 只看该作者



不是,我看的是qt网站的英文的。不过我这次回国倒是带了2本中文的qt书回来,不过还没看。

新问题请教老师:

还是昨天那个程序,发现编译还是老通不过,错误信息是: in fuction 'ZN8MyWidgetC1EP7QWidget', hello.cp:23: undifined reference to 'vtable for MyWidget‘

经过反复检查后,发现如果把MyWidget定义中的'Q_OBJECT'去掉,就能通过了。这里我不太理解,Q_OBJECT不是‘使能’meta-object特性的吗?是否因为MyWidget里面没有用到signal/slot就不能加入Q_OBJECT呢?还是说其它的原因?
回复  

使用道具 举报

65#
发表于 3-2-2009 10:52:44 | 只看该作者
你只要用到QT类或者是继承QT类,都必须有Q_OBJECT

        
        QPainter *painter(this);
        painter.setBrush(Qt::blue);
        painter.drawRect(30,-30,10,10);

这里如果你实例化类用指针,后面要用->
        QPainter *painter = new QPainter (this);
        painter->setBrush(Qt::blue);
        painter->drawRect(30,-30,10,10);

但是根据你报错信息, 你有可能是某个类的.h文件未包含,或者是未声明。 不知道你hello.cp:23是哪一行?
回复  

使用道具 举报

66#
 楼主| 发表于 3-2-2009 14:33:13 | 只看该作者

回复 #65 migao21 的帖子

指针那个问题我已经注意了,不是那个问题。现在的问题是去掉 Q_OBJECT那句,就通过了,运行也正确。我不理解的是为什么不能加上。

出错的一行是这个:
MyWidget::MyWidget(QWidget *parent) : QWidget(parent)
{-------------------------------------------------------------------------------------------这一行是23行
        QLCDNumber *Disp1 = new QLCDNumber;
        QPushButton *Button1 = new QPushButton("Quit");
        MyPaintArea *Area1 = new MyPaintArea;
        QVBoxLayout *Box1 = new QVBoxLayout;
        Box1->addWidget(Disp1);
        Box1->addWidget(Area1);
        Box1->addWidget(Button1);
        setLayout(Box1);
        connect(Button1, SIGNAL(clicked()), qApp, SLOT(quit()));
        connect(Area1, SIGNAL(AreaChanged(int)), Disp1, SLOT(display(int)));
}
回复  

使用道具 举报

67#
发表于 3-2-2009 17:37:34 | 只看该作者

回复 #66 四香油饼 的帖子

你是把所有的东西都写在.cpp里的吧。 qmake解析.pro文件的时候是只对.h文件进行Q_OBJECT扫描的,如果找到了就调用moc xxx.h 从而生成moc_xxx.cpp并一起编译链接到最后的程序中。

如果Q_OBJECT是在.cpp中的, 你需要手工moc xxx.cpp, 生成的moc_xxx.cpp也需要放到.pro的SOURCE列表中。

避免出现此类问题的最好办法就是严格按照QT的开发规范来写程序, 类的声明放在.h文件中,类的实现放在.cpp文件中

评分

参与人数 2威望 +30 收起 理由
migao21 + 20 高手
四香油饼 + 10 高手就是高手阿!

查看全部评分

回复  

使用道具 举报

68#
发表于 5-2-2009 11:10:12 | 只看该作者
我正在想学用GTK+(GTKMM)呢,还是Qt。GTK在GNOME的桌面下用,Qt是在KDE下,问题是如果有一些现有的东西是在GNOME下的,新的用QT是不是不好呢?

另外,Qt好像有liscense的限制吗?据说GTKMM用的是STL,而Qt用的是自己的container。是不是STL比较通用点呢?

请高手指点下啊
回复  

使用道具 举报

69#
发表于 5-2-2009 15:18:37 | 只看该作者
我正在想学用GTK+(GTKMM)呢,还是Qt。
-----用GTK最好不要用GTKMM,这是很不成熟的C++封装,大部分gtk程序使用c写出来的

GTK在GNOME的桌面下用,Qt是在KDE下
-----not at all, gnome上用qt一点事没有, kde下跑gtk也很正常。不过跨平台方面,QT比较有优势

问题是如果有一些现有的东西是在GNOME下的,新的用QT是不是不好呢?
----自己权衡利弊了

另外,Qt好像有liscense的限制吗?
---多看技术新闻,多qtsoftware.com的主页上看看,不要盯着N年前的老文章。或者好好看这个帖子,上面一层楼对这个问题说得很清楚了。

据说GTKMM用的是STL,而Qt用的是自己的container。是不是STL比较通用点呢?
---用了就知道了,QT的container不是stl,但是不排斥你在qt中使用stl,就像在MFC中不用CString而用std::string一样自然
回复  

使用道具 举报

70#
发表于 5-2-2009 20:58:11 | 只看该作者
谢谢coredump指点。

既然QT在GNOME上也没问题,那就OK了。
现在的问题就是原有的系统是用GTK和C,新加的用C++跟Qt是没问题了。主要是如果局部要改原来的,就要用Gtk了。看来两个都要学。
我是觉得做界面怎么也要用OO的东西,用C似乎笨了一点。而且好象Qt在游戏开发上也不错,不知道我理解对否。

COREDUMP真是高手啊,请问是在做哪个方面的东东呢?这里高手不少,以后一定多多请教。
回复  

使用道具 举报

71#
发表于 5-2-2009 21:39:55 | 只看该作者

回复 #70 GPS 的帖子

我现在整天写MFC
回复  

使用道具 举报

72#
发表于 6-2-2009 08:28:31 | 只看该作者
原帖由 coredump 于 5-2-2009 22:39 发表
我现在整天写MFC


高手做MFC是不是觉得不够过瘾啊?呵呵。

我看了一下Qt的Whitepaper,有几个问题请教,请各位高手指点一下。

Qt并不只是一个GUI的API, 里面包括了container,graphic,socket,database,整个基本都包括了application级别的构架。是不是可以说,我用Qt,即使不做GUI,也是可行而且有效的。基本上,做application的话就不用别的东西了,就象MFC?如果这样,那真是合算啊,学一个就基本够用了。

用了Qt是不是可以不用ACE了?因为Qt已经有socketle?

另外,如果在Linux下,用Qtdesigner好还是g++好呢?有什么比较建议吗?

谢谢。

[ 本帖最后由 GPS 于 6-2-2009 09:37 编辑 ]
回复  

使用道具 举报

73#
发表于 6-2-2009 10:28:22 | 只看该作者
高手做MFC是不是觉得不够过瘾啊?呵呵。
------- MFC很刺激的

Qt并不只是一个GUI的API, 里面包括了container,graphic,socket,database,整个基本都包括了application级别的构架。是不是可以说,我用Qt,即使不做GUI,也是可行而且有效的。基本上,做application的话就不用别的东西了,就象MFC?如果这样,那真是合算啊,学一个就基本够用了。
----QT 强项在GUI,很多基础设计(比如signal slot)都是为GUI量身定做的。不用GUI又要用QT的话可以用QT的server版,其实QT的各个组件都是很独立的,想用哪个模块就用哪个模块好了。

用了Qt是不是可以不用ACE了?因为Qt已经有socketle?
--- QT和ACE不是一个层面的东西,ACE是专注网络通讯方面的框架,在网络方面QT远不及ACE,不过要看情况决定,如果开发的应用不是对网络通讯要求非常苛刻,QT的网络模块还是很好用的,封装的让人感觉很舒服。而且结合QT4.4开始引进的Qconcurrent框架开发网络程序很自然。

另外,如果在Linux下,用Qtdesigner好还是g++好呢?有什么比较建议吗?
---     这两个东西有什么共同点吗?
回复  

使用道具 举报

74#
发表于 6-2-2009 19:56:57 | 只看该作者
Qtdesigner 是个Qt的IDE,如果不用它的话,是不是就要用命令行,用G++来编译。QtDesigner会自动生成一些code。我想问的是,这两种方式有什么优劣比较吗?或者是完全等同呢?
回复  

使用道具 举报

75#
发表于 6-2-2009 19:59:23 | 只看该作者
这里好象有不少Linux和Qt的高手及爱好者,版主是不是组织个Linux的group,定期见面讨论,学习下啊?对新手很有帮助的。呵呵。不过高手可能觉得浪费时间了。
回复  

使用道具 举报

76#
发表于 6-2-2009 20:03:29 | 只看该作者

回复 #74 GPS 的帖子

qtdesigner只是个qt的ui设计器,生成的是.ui的xml配置文件, 编译成代码的是uic编译器,就像moc一样是qt的一个辅助工具,和g++是完全两个不同层面的东西。

目前qtdesigner可以单独使用,也可以和vs或eclipse结合使用(商业版),也可以在qt最新推出的qt-creator中使用。
回复  

使用道具 举报

77#
发表于 6-2-2009 21:53:57 | 只看该作者
看来还是先学学,一步步做吧。
回复  

使用道具 举报

78#
发表于 18-2-2009 23:38:39 | 只看该作者
coredump -
我在学Qt4的database编程。
ubuntu 8。10, mysql。

#include <QSqlDatabase>
#include <QDebug>

int main(int argc, char **argv)
{

    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");

    db.setHostName( "localhost");
    db.setDatabaseName("mydb");
    db.setUserName("root");
    db.setPassword("qyyqyy");

    if( !db.open() )
    {
        qDebug()<< db.lastError();
        qFatal( "Failed to connect.");
    }
}
编译-
qmake -project
qmake
make

错误-找不到QSqlDatabase.h,我加上目录 QSql/ 后,还是有编译错误,把   qDebug()<< db.lastError(); 注释后,编译通过,但是连接不行,就是DB的库没连上。
qt4安装在-
apt-get install libqt4...... 好几个package都装了,在/usr下

请问应该在哪里设置? 估计socket编程也要出类似问题。

非常感谢了。
回复  

使用道具 举报

79#
发表于 19-2-2009 09:20:07 | 只看该作者
已经解决了。
我在project file里加了 QT += sql , 在source code中 #inlucde<QSqlError>.
回复  

使用道具 举报

80#
发表于 19-2-2009 20:28:36 | 只看该作者

怎样debug Qt4?

哪位高手指点一下吧。谢谢了。
是不是要自己改Makefile?
回复  

使用道具 举报

81#
发表于 19-2-2009 20:57:10 | 只看该作者

回复 #80 GPS 的帖子

改.pro文件,编译为debug模式即可

http://doc.trolltech.com/4.4/qma ... g-and-release-modes
回复  

使用道具 举报

82#
 楼主| 发表于 20-2-2009 08:34:25 | 只看该作者
老师,再问个问题:QT做出来的程序,能像c++ builder那样是一个单独的exe文件么?如果不是,如果想把程序给别人用,该怎么做呢?
回复  

使用道具 举报

83#
发表于 20-2-2009 10:24:08 | 只看该作者

回复 #82 四香油饼 的帖子

差不多都是一样的,一般一个.exe文件夹上QT的几个DLL就行了,如果要做安装包的话可以用各种制作软件安装包的工具制作
回复  

使用道具 举报

84#
 楼主| 发表于 20-2-2009 14:48:03 | 只看该作者
老师:再请指点一下

这次请老师指点一下我下一步该向哪个方向学习。

通过一段时间的学习,我觉得我初步了解了qt编程的基础,对于一个应用程序来讲,可能剩下的就是一些具体的widget的应用了,比如各种按钮等等的,我想我的目的在于能够编写一些应用程序,我觉得我需要学的东西还有很多,不知道是不是应该在熟练应用这些widget的内建函数、属性的方面花费很多的时间,还是可以需要用哪个了再去查手册就好了。

因为我觉得我还得学习比如linux的基础等等,我希望能打下一个比较扎实的基础,但又不希望在细节上花费太多的时间,所以想请老师给我点建议,现在应该怎么做?
回复  

使用道具 举报

85#
发表于 20-2-2009 15:02:45 | 只看该作者
原帖由 四香油饼 于 8-1-2009 11:04 发表
回国前开始想学习qt,因为底子太差,很多基础的东西都不懂,先补习了一下c++(原来只看过一遍谭浩强,没实际编过程序),然后发现有些东西比如gcc等都跟linux关系很密切,没接触过linux的我经常看得一头雾水,又转头去 ...


葱油原来是IT的啊
回复  

使用道具 举报

86#
发表于 20-2-2009 21:21:30 | 只看该作者
原帖由 四香油饼 于 20-2-2009 14:48 发表
老师:再请指点一下

这次请老师指点一下我下一步该向哪个方向学习。

通过一段时间的学习,我觉得我初步了解了qt编程的基础,对于一个应用程序来讲,可能剩下的就是一些具体的widget的应用了,比如各种按钮等 ...


这个学期就这到这里吧,先把下学期学费交了再说

本学期作业:找个感兴趣的功能先做起来,在做中学,干学,学者学者就烦了,没有成就感。就像旅游,光读别人的游记,那留下来的印象和自己经历过的怎么能相比呢,对吧
回复  

使用道具 举报

87#
 楼主| 发表于 20-2-2009 22:08:53 | 只看该作者
原帖由 coredump 于 20-2-2009 22:21 发表


这个学期就这到这里吧,先把下学期学费交了再说

本学期作业:找个感兴趣的功能先做起来,在做中学,干学,学者学者就烦了,没有成就感。就像旅游,光读别人的游记,那留下来的印象和自己经历过的怎么能相比 ...


成吧,老师说的肯定有道理,我回头编个小程序万万
回复  

使用道具 举报

88#
发表于 21-2-2009 21:23:45 | 只看该作者
四香油饼你找个题目吧,我也一起编编,互相学习把。
回复  

使用道具 举报

89#
 楼主| 发表于 24-2-2009 15:21:04 | 只看该作者
原帖由 GPS 于 21-2-2009 22:23 发表
四香油饼你找个题目吧,我也一起编编,互相学习把。



这两天在想,想好了我写出来你看看
回复  

使用道具 举报

90#
发表于 28-2-2009 16:58:35 | 只看该作者
有问题,请高手指教。
QT4的内存管理问题。 是不是Q的widgets都是可以有系统直接释放内存? 只要new, 不用delete? 包括我自己的QObject的派生类? 那么,我在其中自己 new 的其它类, 打开的DB,FILE呢?应该在何时关闭?
一般在C++中,用DESTRUCTOR 来释放在类中动态分配的各种资源,那么在QT中怎么办呢? WIDGET本身可以有QT的reflection 结构来释放,可是WIDGET中用户再分配的其它资源呢? 我怎么没看到哪个例子中有DESTRUCTOR的。
高手指点指点吧。
回复  

使用道具 举报

您需要登录后才可以回帖 登录 | FreeOZ用户注册

本版积分规则

小黑屋|手机版|Archiver|FreeOZ论坛

GMT+10, 28-7-2026 09:53 , Processed in 0.057430 second(s), 49 queries , Gzip On, Redis On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表