在VS2008中使用Qt编程(转)
这三个软件安装好后,在VS的菜单界面上就会出现"QT"选项了。
(1) 选择“可执行文件”,在里面添加:C:\Qt4.7.0\bin;
(2) 选择“包含文件”,在里面添加:C:\Qt4.7.0\include; C:\Qt4.7.0\include\Qt;
C:\Qt4.7.0\include\QtCore; C:\Qt4.7.0\include\QtGui
(3) 选择“库文件”,在里面添加:C:\Qt4.7.0\lib;
写为:helloQT。然后保存为Hello.ui,再将它添加到源文件中。
命令行:uic.exe Hello.ui -o HelloUi.h
输出:HelloUi.h
附加依赖项:uic.exe; Hello.ui
然后,点击“确定”。这时再右击“Hello.ui”,选择“编译”,则会生成HelloUi.h。
- #include "stdafx.h"
- #include "HelloUi.h"
- #include <QtGui/QApplication>
- #include <QtGui/QMainWindow>
- int _tmain(int argc, _TCHAR* argv[])
- {
- QApplication app(argc,argv);
- QMainWindow *dlg=new QMainWindow();
- Ui::Form ui;
- ui.setupUi(dlg);
- dlg->show();
- return app.exec();
- }
(1) “常规”:选择“字符集”为“使用多字节字符集”;
(2) “调试”:填写“环境”值为:PATH=C:\Qt4.7.0\bin;
填写“合并环境”值为:是;
(3) “链接器”:进入“常规”选项,填写“附加库目录”为:C:\Qt4.7.0\lib;
(注意,这两个库之间为空格,不能写逗号)
四、 信号与槽
信号与槽的使用,需要用到moc(即meta object compiler)。
这是因为:当要在GUI中用到信号与槽,就需在.h文件中的类里写入Q_OBJECT宏。而任何含有Q_Object的类都必须使用Qt的moc工具生成对应的cpp文件,然后在项目里面包含这个cpp,编译才能成功,否则会出错链接错误,如下。
总结:
1) Qt中的元对象系统是用来处理对象间通讯的信号/槽机制、运行时的类型信息和动态属性系统。
2) moc读取C++源文件(应该是.h头文件吧)。如果它发现其中包含一个或多个类的声明中含有Q_OBJECT宏,它就会给含有Q_OBJECT宏的类生成另一个含有元对象代码的C++源文件。这个生成的源文件可以被类的源文件包含(#include)到或者和这个类的实现一起编译和连接。
下面开始编程:
A 编写 main.cpp
- #include "stdafx.h"
- #include <QtGui/QApplication>
- #include "hello.h"
- int _tmain(int argc, _TCHAR* argv[])
- {
- QApplication app(argc,argv);
- Widget w;
- w.show();
- return app.exec();
- }
B 编写 hello.h
- #ifndef WIDGET_H
- #define WIDGET_H
- #include <QWidget>
- #include <stdio.h>
- namespace Ui {
- //class Widget; //1 把Widget换成Form (共3处)
- class Form;
- }
- class Widget : public QWidget {
- Q_OBJECT
- public:
- Widget(QWidget *parent = 0);
- ~Widget();
- protected:
- void changeEvent(QEvent *e);
- private:
- //Ui::Widget *ui; //2 把Widget换成Form (共3处)
- Ui::Form *ui;
- public slots:
- void on_pushButton_clicked(void);
- };
- #endif // WIDGET_H
C 编写 hello.cpp
- #include "stdafx.h"
- #include "hello.h"
- #include "ui_hello.h"
- //#include "moc_hello.cpp" //不是头文件,不可以加此句
- Widget::Widget(QWidget *parent) :
- QWidget(parent),
- //ui(new Ui::Widget) //3 把Widget换成Form (共3处)
- ui(new Ui::Form)
- {
- ui->setupUi(this);
- }
- Widget::~Widget()
- {
- delete ui;
- }
- void Widget::changeEvent(QEvent *e)
- {
- QWidget::changeEvent(e);
- switch (e->type()) {
- case QEvent::LanguageChange:
- ui->retranslateUi(this);
- break;
- default:
- break;
- }
- }
- void Widget::on_pushButton_clicked(void)
- {
- ui->label->setText("liangbing8612.blog.51cto.com");
- printf("liangbing8612.blog.51cto.com");
- }
D 制作.ui文件,并生成ui_hello.h
打开designer,拖入一个pushButton,一个label。保存为hello.ui。然后生成ui_hello.h,并添加到项目的源文件中。
编译运行,则出现如下错误:
错误 1 error LNK2001: 无法解析的外部符号 "public: virtual struct QMetaObject const * __thiscall Widget::metaObject(void)const " (?metaObject@Widget@@UBEPBUQMetaObject@@XZ)
错误 2 error LNK2001: 无法解析的外部符号 "public: virtual void * __thiscall Widget::qt_metacast(char const *)" (?qt_metacast@Widget@@UAEPAXPBD@Z)
错误 3 error LNK2001: 无法解析的外部符号 "public: virtual int __thiscall Widget::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@Widget@@UAEHW4Call@QMetaObject@@HPAPAX@Z)
错误 4 fatal error LNK1120: 3 个无法解析的外部命令
这是因为在源文件中没有添加上moc_hello.cpp文件。
解决方法:右击hello.h,选择“自定义生成步骤”,“常规”
命令行:moc.exe hello.h -o moc_hello.cpp
输出:moc_hello.cpp
附加依赖项:moc.exe hello.h
确定,然后,右击hello.h,选择 “编译”,则在文件夹中生成moc_hello.cpp,再将其添加到源文件中。
然后,运行程序,出现错误:
错误 fatal error C1010: 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include "stdafx.h"”?
则在moc_hello.cpp文件的开头添加上:#include "stdafx.h"。
然后,再运行。仍然出现上面错误。这是因为当运行程序,又重新生成了moc_hello.cpp文件(这个新的文件的开头显然是没有#include "stdafx.h"),覆盖了已经修改过的文件。
解决方法:右击hello.h,选择“自定义生成步骤”,“常规”
清空“命令行” “输出” “附加依赖项” 里对应的内容。这样在运行程序时就不会再生成新的moc_hello.cpp文件了。然后确定。
这样再次运行程序,可以成功运行。运行结果如图。
在VS2008中使用Qt编程(转)的更多相关文章
- VS2008中MFC界面编程Caption中文全是乱码的解决办法 -转载
一.问题 在预览状态下可能看到中文,但是编译运行后对话框中的中文全是问号.即使你用的VS中文版,即使你也用了Unicode编码,即使有条件编译 #ifdef _WIN32LANGUAGE LANG_C ...
- 配置VS2008下的Qt开发环境有感
写一篇小小的日志为了在VS2008中安装Qt的插件,花了我很多的时间.1.vs2008在win7中破解问题我的VS2008已经安装好了,不知道为何,当初没有破解,现在只剩下15天限制了.于是为了破解, ...
- QT中的SOCKET编程(QT-2.3.2)
转自:http://mylovejsj.blog.163.com/blog/static/38673975200892010842865/ QT中的SOCKET编程 2008-10-07 23:13 ...
- Visual Studio下Qt编程中对中文的处理
Visual Studio下Qt编程中对中文的处理 本文为原创文章,原文地址http://www.cnblogs.com/c4isr/p/qt_develop_in_vs.html Visual St ...
- 在windows下的QT编程中的_TCHAR与QString之间的转换
由于在windows下的QT编程中,如果涉及到使用微软的API,那么不可避免使用_TCHAR这些类型,因此在网上查了一下,其中一个老外的论坛有人给出了这个转换,因此在这里做一下笔记 : )#ifdef ...
- 在Ubuntu18.04中QT编程的环境构建(转)
在Ubuntu18.04中QT编程的环境构建 原点分析 百家号06-2110:14 如果说QT大家觉得陌生的话,那么 Windows 早年推出的C++图形用户界面的应用程序开发框架MFC,应该是耳熟能 ...
- QT安装在VS2008中的方法
(一)工欲善其事,必先利其器,废话不多讲. 原文:http://www.cnblogs.com/zwq194/archive/2011/02/19/1958713.html 总结起来网上流行的VS20 ...
- QT中的SOCKET编程
转自:http://mylovejsj.blog.163.com/blog/static/38673975200892010842865/ QT中的SOCKET编程 2008-10-07 23:13 ...
- qt编程入门
面对qt编程,必须先知道qt中常用的类: QPushButton按钮类.QLabel标签类.QMessageBox对话框类.QCheckBox.QAction.QMenu.QStatusBar.QTo ...
随机推荐
- Machine Learning No.10: Anomaly detection
1. Algorithm 2. evaluating an anomaly detection system 3. anomaly detection vs supervised learning 4 ...
- 学习使用ExpressJS 4.0中的新Router
概述 ExpressJS 4.0中提出了新的路由Router.Router好比是一个"迷你版"的express应用,它没有引入views或者settings,但是提供了路由应有的A ...
- 创建一个HTML5与JQuery结合的幻灯片
1. [代码][JavaScript]代码 $(window).load(function(){ //我们监听了 window.load 事件,因此我们确定幻灯片上的所有图片都能够正确进行加载. ...
- BZOJ(begin) 1328 [Usaco2003 Open]Jumping Cows:贪心【波峰波谷模型】
题目链接:http://begin.lydsy.com/JudgeOnline/problem.php?id=1328 题意: 给你一个长度为n的正整数序列. 可以选任意个数字,只能从左往右选. 偶数 ...
- 分享知识-快乐自己:JAVA中的 Iterator 和 Iterable 区别
java.lang.Iterable java.util.Iterator Iterator是迭代器类,而Iterable是接口. 好多类都实现了Iterable接口,这样对象就可以调用itera ...
- hdu 1042 N!(大数)
题意:求n!(0 ≤ N ≤ 10000) 思路:大数,用数组存储 1.首先要考虑数据N!的位数,因为最大是10000!,可以计算一下大概是5+9000*4+900*3+90*2+10*1=38865 ...
- inode、软连接、硬链接
一.inode是什么? 理解inode,要从文件储存说起.文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector).每个扇区储存512字节(相当于0.5KB).操作系统读取 ...
- Linux网络编程socket错误分析
socket错误码: EINTR: 阻塞的操作被取消阻塞的调用打断.如设置了发送接收超时,就会遇到这种错误. 只能针对阻塞模式的socket.读,写阻塞的socket时,-1返回,错误号为INTR.另 ...
- BJOI2018爆零记
没啥可说的 Day1 0分 T1 给你一个二进制串,每次修改一个位置,询问[l,r]区间中有多少二进制子串重排后能被3整除 T2 一个无向图(无重边自环)每个点有一个包含两种颜色的染色集合,一个边的两 ...
- python 之闭包,装饰器,生成器
一.可迭代的对象(也就是可以用for循环,generator 是生成器的意思) 怎么判断是否可迭代呢?通俗的方法建立一个for循环 高大上的方法是: In [40]: from collections ...