• 8088阅读
  • 13回复

[讨论]QT错误集成大全 [复制链接]

上一主题 下一主题
离线ktl123
 

只看楼主 倒序阅读 楼主  发表于: 2016-11-12
本吧专业捉QT的虫子 大家都来这里把常见错贴出,感谢分享你的经验
离线harold00124

只看该作者 1楼 发表于: 2016-11-22
寫SerialPort的時候要記得在pro檔加入QT       += core gui serialport
昨天忘記寫 害我卡一整個下午找不出問題...

小弟是新手...
离线ktl123

只看该作者 2楼 发表于: 2016-12-02
QT += multimedia //QSOund  声音   没有这个QSOund  函数不识别
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets    // APP 不识别

QT       +=widgets
QT       += core gui   //基本函数会提示错误

QT += multimedia  //多媒体支持

CONFIG += console

CONFIG += qt
QT += printsupport  //没有这个打印函数不支持
<QtPrintSupport>
1条评分金钱+1
harold00124 金钱 +1 - 2016-12-02
离线ktl123

只看该作者 3楼 发表于: 2016-12-02
1 #include <QtCore/QCoreApplication>
2 #include <iostream>
3 #include <time.h>
4 #include <windows.h>
5 #include <QDateTime>
6 #include <QDebug>
7 using namespace std;
8
9 bool setDate(int,int,int);
10 int main(int argc, char *argv[])
11 {
12     QCoreApplication a(argc, argv);
13     qDebug()<<QDateTime::currentDateTime()<<endl;  // Qt API 输出当前时间
14    setDate(2011,1,1);                             //设置时间
15     qDebug()<<QDateTime::currentDateTime()<<endl;  // Qt API 获取当前时间
16    return 0;   //让程序完成任务直接退出吧...
17 }
18
19 bool setDate(int year,int mon,int day)
20 {
21     SYSTEMTIME st;    
22     GetSystemTime(&st);    // Win32 API 获取系统当前时间,并存入结构体st中
23     st.wYear=year;
24     st.wMonth=mon;
25     st.wDay=day;
26
27    return SetSystemTime(&st);    //Win32 API 设置系统时间
28 }
29


结果快了8小时 将SetSystemTime(&st);  改为SetLalTime 正常
1条评分金钱+1
harold00124 金钱 +1 - 2016-12-02
离线ktl123

只看该作者 4楼 发表于: 2016-12-02
1) 信号和槽之间的参数传递必须是对等的,比如:空-空,int-int,QString-QString。多个参数也是一样,且顺序不能错。否则connect将被视为无效的。但有些情况也是可以的。
(2) 槽的参数是不能有默认值的,也不可以在调用的时候调用常量。

举例如下:
错误:
connect(a, SIGNAL(typeBtnClicked(int)), this, SLOT(resetDishPage(1)));
connect(a, SIGNAL(typeBtnClicked()), this, SLOT(resetDishPage(1)));
运行时会提示:找不到resetDishPage(1)这个函数。
connect(a, SIGNAL(typeBtnClicked()), this, SLOT(resetDishPage(1)));
运行时会提示:QObject::connect: Incompatible sender/receiver arguments
DInputNumPage::btnClicked() --> InputForm::doInput(QString)

但是这样写是正确的:
connect(a, SIGNAL(typeBtnClicked(int)), this, SLOT(resetDishPage()));
即,信号带参数,槽不带参数。

这样写是错误的:
connect(a, SIGNAL(typeBtnClicked(int, QString)), this, SLOT(resetDishPage(QString)));

但是这样写是正确的:
connect(a, SIGNAL(typeBtnClicked(int, QString)), this, SLOT(resetDishPage(int)));
即,槽的参数比信号的少,且是开始的几个

注2:什么是Core Dump?

Core的意思是内存, Dump的意思是扔出来, 堆出来.

开发和使用Unix程序时, 有时程序莫名其妙的down了, 却没有任何的提示(有时候会提示core dumped). 这时候可以查看一下有没有形如core.进程号的文件生成, 这个文件便是操作系统把程序down掉时的内存内容扔出来生成的, 它可以做为调试程序的参考.
离线ktl123

只看该作者 5楼 发表于: 2016-12-02
总结系列_2(vc,opencv,Qt等错误调试,续...)

   本文将总结一些在使用opencv+vs过程中碰到的error。

 1.程序编译通过,运行时出现如下错误:

  

  解决方法:

  a.可能是读取文件时出现错误,比如说读图片,视频等文件名字或路径弄错了。



  2. 编译程序通过,运行时出现如下错误:

  

    解决方法:

     a.可能是数据类型不对,比如说在该语句中gray_diff.at<unsigned char>(i,j)=255;

         本来gray_diff中的数据类型是unsigned char的,如果你写成了gray_diff.at< int>(i,j)=255;或者是写成其它的就会报类似的错误。



  3. 当编译通过,运行程序一段时间后出现如下提示:

  

  解决方法:

  a. 可能是读取的地址无效,比如说你去读取一副图片,但是你给的图片目录中没有该文件的话就会出现类似错误。



  4.如果自己单独写一个头文件,比如说gmm.hpp,头文件中也包含了opencv用到的系统头文件,但是在gmm.hpp中应用opencv自带的变量类型时会报错。比如说gmm.hpp    的内容为,已被main.cpp包含进去了。

  gmm.hpp内容如下图所示:

  

  编译是报错如下:

  

  则原因是没有使用opencv的命名空间,加入一句using namespace cv;即可。以后要注意了,使用了opencv的头文件后,要同时使用其命名空间,否则是会报错的。



5. 如果生成项目时,出现如下错误提示:

  

  则说明你在头文件中定义了变量,且这个头文件有被2个或2个以上的源文件包含了。因此可以得出结论,尽量不要在头文件中定义变量,如果要定义的话,就需要在前面加一个static关键字。



6.当用单步调试,变量监视器来监视Mat型变量时,查看Mat型里面的data数据(特别是其数据类型为浮点数时),有可能出现如下显示:

  

  这并不是说明这个Mat类型数据有错误,只是变量监视显示不出来而已,可能有如下2个原因:一是该变量只能显示unsigned char型的数据,其他非此类的数据显示可能有误;二是Mat型内部数据不同点对应的数据可能不同,所以也有可能显示不出来。



7. 重装系统前用的xp+opencv2.3.1+vs2010,opencv打开摄像头正常,重装系统后用的xp+opencv2.4.2+vs2010,程序没有变化,opencv运行这些程序时打开摄像失败,但是用运行opencv1.0sample中有关摄像头的exe正常。另外摄像头驱动正常,比如qq视频,xp系统自带摄像头软件都能运行。这是什么原因呢?

   后面在网上查,他们都说opencv2.0以前只支持VWF驱动,这个是微软比较老的驱动。到opencv2.0以后就采用VedioCapture类,支持DirectShow类。难道是我摄像头的驱动过低?后面试了很多摄像头的驱动,从01年的到11年的,都不行。最后也测试了这个VideoCapture类读取视频avi文件功能,发现也不顺利。后面自己重新建立了一个工程,采用同样的代码就顺利运行了。(因为刚装opencv2.4.2,所以我拿的是以前在opencv2.3.1下没写完的代码,屏蔽之,加入摄像头测试代码的),看来可能是2.3.1下的某些东西影响了吧。总之,能工作就好!



8. 当调试时变量显示为-1.#IN00 0,有下面几种可能。一是该变量(一般是float类型)在debug模式下没有进行初始化导致的。二是有可能是计算出来的值越界了,比如说无穷大或者无穷小的float数了,有可能是除了分母为0的数。



9. 为什么opencv2.4.2中新建的视频的窗口名字会出现乱码呢?有时候甚至名字都不显示出来。且本应该有的滑动条也显示不出来或者乱套了。

  这是因为如果在debug环境下,则对应的dll库后面都应该加有d字样,比如opencv_core242d.dll,如果用的是opencv_core242.dll,则就有可能出现窗口名字乱码,甚至连滑动条都不能显示的情况。同理如果在release下用带有d字样结尾的dll则会直接内存报错,所以此时只能用不带d的dll。

  一句话,debug下用debug下对应的dll,release下用release对应的dll即可。

10. 在qt中如果定义在头文件中定义了槽函数,则在cpp源文件必须去实现该槽函数,否则会出现类似undefined reference to MainWindow::on_pushButton_clicked()的错   误,该错误是由于在UI中删除了某些不用的按钮造成的。

11.如果用Qt的控制台建立程序,运行程序时出现下面的错误提示:

  

  这是因为控制台程序不能使用Qt的界面(本程序中使用了QMessageBox),因此需要在工程pro的代码中把QT –  gui给去掉,否则会报类似的这种错误。

12.如果是在OpenCV中出现如下错误:

  

  则表示是imshow函数需要还来不及显示完成就被其它的函数给中断了,这可能在回调函数中出现这种情况。





1条评分金钱+1
harold00124 金钱 +1 - 2016-12-02
离线ktl123

只看该作者 6楼 发表于: 2016-12-02
QT错误调试总结
  1.编译时出错,多为语法错误,根据错误提示逐条修改
  2.链接时出错,表现为“ld returned 1 exit status”, 说明不同文件(类)之间的调用有问题或是有函数在头文件中声明了但没有定义。如果是交叉编译,可能是缺乏必要的依赖库cannot find -lxxx详见
  3.运行时出错,表现为“xxx.exe”遇到错误需要关闭,通常是变量没有初始化,引起了内存问题。如果两个类互相包含,会造成程序无法运行,终止后显示exit with code 1
  Cannot retrieve debugging output!
  这个问题是个小问题,其实跟程序没关系。当你开多个Qt程序(编程软件)执行程序后。且有2个以上程序用qDebug()输出时,第一个程序能输出qDebug中的内容,而当你开第2个程序就会出现上面问题。交替执行就能看出问题来了。
1条评分金钱+1
harold00124 金钱 +1 - 2016-12-02
离线ktl123

只看该作者 7楼 发表于: 2016-12-03
最近用相对路径 资源必须在资源文件夹,否则访问失败
实际测试只要在main 函数添加下面依据 即可
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    Widget *widget = new Widget;
       QDir::setCurrent(app.applicationDirPath());//添加这句 立马可以

        widget->show();
        return app.exec();
}
离线ktl123

只看该作者 8楼 发表于: 2016-12-11
编译报错内容:
[armeabi] Compile++ thumb: cocos2dcpp_shared <= HelloWorldScene.cpp
jni/../../Classes/HelloWorldScene.cpp:1:1: error: stray '\377' in program
jni/../../Classes/HelloWorldScene.cpp:1:1: error: stray '\376' in program
jni/../../Classes/HelloWorldScene.cpp:1:1: error: stray '#' in program
jni/../../Classes/HelloWorldScene.cpp:1:4: warning: null character(s) ignored [enabled by default]
jni/../../Classes/HelloWorldScene.cpp:1:6: warning: null character(s) ignored [enabled by default]
……
jni/../../Classes/HelloWorldScene.cpp:49:2: error: expected unqualified-id before '/' token
/cygdrive/e/cocos2d/Android-ndk-r9c-windows-x86/android-ndk-r9c/build/core/build-binary.mk:388: recipe for target 'obj/local/armeabi/objs/cocos2dcpp_shared/__/__/Classes/HelloWorldScene.o' failed
make: *** [obj/local/armeabi/objs/cocos2dcpp_shared/__/__/Classes/HelloWorldScene.o] Error 1
make: Leaving directory '/cygdrive/e/cocos2d/cocos2d-x-2.2.1/projects/GODS/proj.android'

在网上找了好几下,没能解决。
有的人说:可能是因为格式不是纯粹的TXT格式子,而我用的编辑器没能认出来。
也有的人说:这个错误一般是源代码中含有一些隐藏的非ascii字符,可能原因在编辑器中使用的utf-8的格式保存源代码中出现了中文的标点符号。
他们建议把东西copy到文本编辑器中,再copy回来试试
还有网友的建议是用UE(下载地址:http://lwr0312.blog.163.com/blog/static/48336807200931695730586/edit/)打开,用16进制编辑,删除掉最前面多余的字节。
我对着操作,搞得晕乎乎,呜呜……没有多余的字或者中文符号啊!并没有解决问题。
后来终于看到一个帖子,里面的“gcc”几个字,让我看到了希望!!!下面附上地址:
http://wenku.baidu.com/link?url=_NgJPYtTUJ-WwLFEk38GgS_e5YdjYlltuc9E4oc4wvGHeGgk7OopTKzX66Epfg6MEYR1M7npZBnNkkwxwG7oRkZpxPgCIoVF6pTNYOYJ7YS
文中提及到“这是因为你的编译器将文件编码存为了UTF-8格式的,可是winavr作为gcc的编译器是不认识这种格式的”,“将UTF-8改掉,改成US-ASIIC或者Chinese Simple(GB2312)都行,为什么Chinese Simple(GB2312)也行我也不知道,可能其他的也行只要不是UTF-8就行了”。
我这个原本是mac上的项目,移植到win的vs中时我把格式存为Unicode(当时错了!如果当时就改为了ANSI就不会有这些报错了!),现在从VS弄到安卓中(通过cygwin的gcc)要把格式另存为ANSI,然后就可以编译通过了。
搞定,收工!终于,可以安心睡觉觉了!晚安,good night

不能手工 不能啊  这是别人的错误
ttps://loki-lib.svn.sourceforge.net/svnroot/loki-lib/trunk
把代码检出到本地,执行 make 后提示错误:
../../include/loki/StrongPtr.h:1: error: stray ‘/357’ in program
../../include/loki/StrongPtr.h:1: error: stray ‘/273’ in program
../../include/loki/StrongPtr.h:1: error: stray ‘/277’ in program
根据错误提示,应该是文件里存在非 ASCII 码的字符,用 file 命令查看了一下 StrongPtr.h 的类型,发现是 Unicode text, UTF-8,而别的源文件则是 ASCII C++ program text,看来是 Loki 的某个维护者不小心把源文件存成 UTF-8 编码的文件并在里面引入了非 ASCII 字符(UTF-8 编码是一种兼容 ASCII 编码的变长编码方案)。上述的编译错误中的字符是以 8 进制表示的,将其转换成 16 进制后发现是”EF BB BF”,看着很眼熟——好像是 BOM(byte order mark) 控制字符,去维基百科里查一下 BOM 词条,发现 UTF-8 文件的 BOM 果真是”EF BB BF”。而大多数 Windows 文件编辑器(包括记事本)在将文件保存为 Unicode 编码时默认都会悄悄的在文件头加上 BOM 字符且不会将其显示出来(用 WinHex 之类的十六进制编辑器就打开则可以看到 BOM 字符),而 Linux 下却没这个默认的规矩,所以 Linux 下 g++ 不认 BOM 也是情理之中的。看来是 Loki 的维护者在 Windows 下修改代码后不小心将 StrongPtr.h 存成 UTF-8 编码文件,引入了肉眼看不到的 BOM 字符。后将 StrongPtr.h 另存为 ASCII 编码的文件后果然编译通过。
找到问题后去 Loki 的开发论坛上报告了这一问题,维护者之一的 syntheticpp 随后修正了问题并在回帖里打趣的说:
Good to know “no BOMbs on Linux” ;-)
一语双关的将 BOM 字符比作 BOMB(炸弹),呵呵,隐匿在文件里的 BOM 看不到摸不着,编译时报告的错误也很不直白,大家在使用 Windows 下的文本编辑器编写跨平台代码时要注意这个问题,建议使用 Notepad++ 这种可以显式指定是否要加 BOM 字符的编辑器,以免挨炸。
离线ktl123

只看该作者 9楼 发表于: 2016-12-11
我是该个用记事本打开重新保存 错误消失
离线ktl123

只看该作者 10楼 发表于: 2016-12-12
问题描述:界面线程MainApp为主线程,工作线程MyThread为一子线程,从工作线程向主线程传递字符串用于在主线程中显示。
Qt的信号与槽机制可以将任何继承自QObject类的对象捆绑在一起,使不同对象之间能够相互通信。
成功的实现Qt线程间的信号与槽:
工作线程:
class MyThread:public QThread
{
  Q_OBJECT
  ...
signals:
  void MsgSignal(const QString& tep);//用于向主线程传递字符串
protected:
  void run();//run 中的内容才是子线程中执行的内容!
}

void MyThread::run()
{
  Sleep(3000);//头文件:windows.h
  QString tep("mou-mou-mou");
  emit MsgSignal(tep);
  Sleep(3000);//各个Sleep的位置可放置具体执行的工作
}
主线程:
class MainApp:public QWidget
{
  Q_OBJECT
  ...
public:
  MainApp();
  ...
private slots:
  void OnMsgSignal(const QString& tep2);//接受子线程传递字符串用于显示
private:
  MyThread* m_thread;
}

MainApp::MainApp()
{
  ...
  m_thread= new MyThread();
  connect(m_thread, SIGNAL(MsgSignal(const QString&)),
              this, SLOT(OnMsgSignal(const QString&)));//此处connect的第五个参数默认变成Qt::QueuedConnection
  m_thread->start();
}

void MainApp::OnMsgSignal(const QString& tep2)
{
  //使用子线程传递来的tep2
}


实现过程中遇到过的问题:
1.connect函数的第五个参数代表信号与槽的连接模式,线程间的信号与槽不能使用Qt::DirectConnection直接连接方式,因为它要求在发信号的线程内执行槽函数。而Qt::QueuedConnection队列方式将信号转换成事件发送到槽函数所在线程的消息队列中让槽函数所在线程来处理,可以实现线程安全的线程间的通信。这样的时效性也不差,上面的实现中,会在子线程“run()”函数中的第二个Sleep之前执行主线程的“OnMsgSignal(constQString& tep2)”。

Qt线程间的信号与槽于是在调试的时候子线程的“emit MsgSignal(const QString& tep);”的下一步并不会立即跳转到主线程的“OnMsgSignal(const QString& tep2)”,我开始还以为信号中途丢了没送达呢。。而强制使用Qt::DirectConnection模式却怎么也摆脱不了错误。
2.线程间用“信号与槽”传递引用参数的话,一定要加const,因为const文字常量存在常量区中,生命周期与程序一样的长。这样可以避免slot调用的时候参数的运行期已过而使引用无效。

我开始没注意到需要加const,程序运行时并没有报告错误,但是主线程毫无使用子线程传递来的字符串的迹象,这让我更加错误地以为子线程发送的信号丢了。。

想不清楚的问题总算是解决了,前几天愤怒抓狂的“我”们,你们可以安心休息啦Qt线程间的信号与槽让我沿着你们没有走完的路继续前行吧!

2

只看该作者 11楼 发表于: 2017-01-04
回 ktl123 的帖子
ktl123:我是该个用记事本打开重新保存 错误消失 (2016-12-11 16:58) 

那就应该使编码问题吧!

只看该作者 12楼 发表于: 2017-01-04
回 ktl123 的帖子
ktl123:问题描述:界面线程MainApp为主线程,工作线程MyThread为一子线程,从工作线程向主线程传递字符串用于在主线程中显示。
Qt的信号与槽机制可以将任何继承自QObject类的对象捆绑在一起,使不同对象之间能够相互通信。
成功的实现Qt线程间的信号与槽:
工作线程:
class MyThread:pub .. (2016-12-12 17:34) 

这个子线程得到字符串,假设GUI线程有多个,比如MainWindow是一个ui需要接收字符串,MainWindow的ui上有个按钮,点击按钮弹出一个ui,设为Dialog,如果Dialog和MainWindow都需要从子线程得到数据,这样的connect应该如何写啊!
离线孙诚昊

只看该作者 13楼 发表于: 2017-02-10
回 harold00124 的帖子
harold00124:寫SerialPort的時候要記得在pro檔加入QT       += core gui serialport
昨天忘記寫 害我卡一整個下午找不出問題...
小弟是新手... (2016-11-22 16:54) 

一定要加吗  ?  我没有加编过了
快速回复
限100 字节
 
上一个 下一个