【Qt】常见问题总结 .

来源:互联网 发布:苹果手机录音软件 编辑:程序博客网 时间:2024/05/29 14:30

 

1、汉字显示乱码问题的简单解决方法

QTextCodec::codecForName("GB2312")->toUnicode("显示汉字");

在这里得包含头文件 #include<QTextCodec>


2、当在Windows下运行时,程序默认不会有控制台输出。这就意味着,默认情况下,windows程序不会将输出信息写到命令行界面。为了能看到qDebug()的输出信息,你需要在工程文件中增加一行内容:

        CONFIG += console

        (注:网上有写 win32:CONFIG += console,暂不知有何不同)

摘自:Johan Thelin《Foundations of Qt Development》

原文:When running Windows, applications do not get a console output by default. This means that Windows applications cannot, by default, write output to the command-line users. To see any output from qDebug(), you must add a line reading CNFIGO += console to the project file. If you built the executable and then saw this tip, try fixing the project file; then run make clean followed by make. This process ensures that the project is completely rebuilt and that the new configuration is taken into account.


3、undefined reference to `vtable for  ClassName错误

    今天练习一个关于clipboard的小程序时,由于只需要一个类并且只有几个不大的函数,所以直接和main函数写在了同一个cpp文件中。刚开始执行程序时,命令提示符里报警告:

 

        Object::connect: No such slot QWidget::copy() in main.cpp:39

        Object::connect: No such slot QWidget::paste() in main.cpp:40

才突然想起一句话:对于所有定义了信号和槽的类,在类的定义开始处都要加上Q_OBJECT宏。可是加上这个宏之后又会报另外的错误: undefined reference to `vtable for CopyToClipboard'。上网一查才知道:qmake 不会处理.cpp文档里的Q_OBJECT,所以,假如在.cpp文档中有它的话,就会出现该错误。关于该错误,网上解释还有可能是:

    预编译器打开宏Q_OBJECT,声明若干个由moc处理(implement)的成员函数。假如得到类似于“undefined reference to vtable for LcdNumber”的编译错误(if you get compiler errors along the lines of "undefined reference to vtable for LcdNumber"),您可能是忘记了执行moc,或忘记了将moc输出加入到link命令里。

 

4、 error: QSqlDatabase: No such file or directory错误

    当包含了<QSqlDatabase>头文件,程序报错:error: QSqlDatabase: No such file or directory。

    解决方法:在.pro工程文件中添加“QT += sql”。

 

5、error: invalid use of incomplete type 'struct QSqlError'错误

     当程序中使用了QSqlDatabase::lastError()函数,而没有包含<QSqlError>头文件,便会报出error: invalid use of incomplete type 'struct QSqlError'错误,加上<QSqlError>头文件即可。

    分析原因:QSqlDatabase类的声明文件中引用了前向声明class QSqlError,同时其cpp文件中也没有包含<QSqlError>头文件,仅仅是简单的调用了d->driver->lastError()(其中d为QSqlDatabasePrivate对象指针,声明在qsqldatabase.cpp文件中。dirver为QSqlDriver对象指针,qsqldatabase.cpp文件中包含"qsqldriver.h"头文件,qsqldriver.cpp文件中是包含"qsqlerror.h"文件的)。详细参看qt源码,下面写个简单的模拟程序(包括A.h、A.cpp、C.h、D.h、main.cpp五个文件,main函数在main.cpp文件中):

    

[cpp] view plaincopyprint?
  1. // A.h   
  2. #ifndef __A_H__   
  3. #define __A_H__   
  4. class D;  
  5. class A  
  6. {  
  7. public:  
  8.     A();  
  9.     ~A();  
  10.     D GetDObj();  
  11. private:  
  12.     friend class B;  
  13.     B *m_b;  
  14. };  
  15. #endif // __A_H__  
 

    

[cpp] view plaincopyprint?
  1. // A.cpp   
  2. #include "A.h"   
  3. #include "C.h"   
  4. class B  
  5. {  
  6. public:  
  7.     B(){m_c = new C;}  
  8.     ~B(){delete m_c;}  
  9.     C *m_c;  
  10. };  
  11. A::A()  
  12. {  
  13.     m_b = new B;  
  14. }  
  15. A::~A()  
  16. {  
  17.     delete m_b;  
  18. }  
  19. D A::GetDObj()  
  20. {  
  21.     return m_b->m_c->GetDObj();  
  22. }  
 

    

[cpp] view plaincopyprint?
  1. // C.h   
  2. #ifndef __C_H__   
  3. #define __C_H__   
  4. #include "D.h"   
  5. class C  
  6. {  
  7. public:  
  8.     D GetDObj(){return D();}  
  9. };  
  10. #endif //__C_H__  
 

    

[cpp] view plaincopyprint?
  1. // D.h   
  2. #ifndef __D_H__   
  3. #define __D_H__   
  4. #include <stdio.h>   
  5. class D  
  6. {  
  7. public:  
  8.     D(){printf("D object is created!/n");}  
  9. };  
  10. #endif // __D_H__  
 

    

[cpp] view plaincopyprint?
  1. // main.cpp   
  2. #include "A.h"   
  3. #include "D.h"   
  4. int main(int argc, char *argv[])  
  5. {  
  6.     A a;  
  7.     a.GetDObj();  
  8.       
  9.     return 0;  
  10. }  
 

    从main.cpp函数可以看出,这里没有直接创建D类对象,但是 main.cpp文件中必须包含D.h头文件,否则在vc6中会报出error C2027: use of undefined type 'D'错误,上面所说的error: invalid use of incomplete type 'struct QSqlError'错误就是这个原因。

原创粉丝点击