用惯C#再用C++的一些麻烦事

C#作为一种高级语言更接近于人的思维,而C++则更理解机器一些。就连平常用惯了的string类型,到了C++里变成了char*,wchar*等等原始的东东。由于平常只用QT这个类似C#对象系统的工具开发程序,主要奉行qt+winapi=一切,其他地都靠边站别阻挡我视线的原则,所以很少接触到纯粹c++的东西,下面把我认为是麻烦事,而C++高手们却视为家常便饭的知识点记录备忘。

1、常量字符串 :

    主要是调用WinAPI函数时,有时需要const char*,有时需要const wchar*。

const char* str="this is a string",
const wchar* wstr=L"this is a wide string"//没错加个L就搞定

  如果你用的IDE和我一样是QTCreator的话,你会发现:L"中文"时,会出现编译错误--“Illegal byte sequence”。我用的2.2.1版本没发现好的解决方法,只能用笨拙的方法,找到包含中文的.cpp或.h文件--〉用Notepad打开--〉另存为utf-8,就可以正确编译了。

  如果是QString变量而不是常量,加“L”就不灵了。这时需要强制类型转换:

 

const wchar_t *wstr = reinterpret_cast<const wchar_t *>(stitle.utf16());

2、对象为空的判断:

 

//mainwindow.h中定义的对话框窗体
Dialog* dlg;

//mainwindow.cpp中判断为空,则创建。
if(!dlg){
    dlg=new Dialog();
}
dlg.show();

本来以为这样就行了,结果出错!原因是:dlg指针没有显式初始化为0。

 

MainWindow::MainWindow():dlgset(0)

 

3、窗体设计:

a.Dock.Fill Qt中类似winforms的Dock概念是Layout布局 ,QT Creator中隐藏的好深:

 

 

 4、输出调试信息:

 

#include <QDebug>

 

 

qDebug() << "test";

 

 程序运行时,在“应用程序输出”中可以看到输出信息。

 

 5、对象的销毁:

C++没有垃圾回收,QT使用引用计数来管理对象的是否可以释放。通过delete释放和销毁对象:

 

 

 delete dlgset; //销毁掉引用DataBase的对象

 QSqlDatabase::removeDatabase("qt_sql_default_connection");

//这里就不会有下面的警告了!
QSqlDatabasePrivate::removeDatabase: connection 'qt_sql_default_connection' is still in use, all queries will cease to work.); 

 

 

6、如果使用了windows的gdi等dll,需要添加对.lib的引用,才能被正确的连接,不然会有这样的连接错误:

 

undefined reference to `CreatePen@12

解决方法: 在.pro工程文件中加入下面一行

LIBS += -lgdi32

 

特别推荐Qt开发的windows小程序实例源代码:

 

生成的程序全部打包只有4M多,用户解压后可以直接运行。
 

 

转载于:https://www.cnblogs.com/hjblog/archive/2012/02/25/2356883.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值