• 7136阅读
  • 3回复

[提问]程序遇到一个莫名其妙的警告!求大神指点迷津! [复制链接]

上一主题 下一主题
离线bazzi2011
 

只看楼主 倒序阅读 楼主  发表于: 2014-12-10
有一个对话框,上面有个QTreeWidget,由于需要随时监控树列表上项的在线状态,所以将其放在了一个线程中,用定时器2秒刷新一次。

在线程中使用定时器的方法运用了这篇文章中的方法 【QT中使用另外的线程运行定时器  http://blog.csdn.net/jwybobo2007/article/details/8314271 】,直接用
  1. m_pRefreshTimer->moveToThread(m_pRefreshThread); //线程指针m_pRefreshThread  QTimer指针 m_pRefreshTimer
  2. connect(m_pRefreshTimer, SIGNAL(timeout()), this, SLOT(RefreshTreeSlot()), Qt::DirectConnection);

当某树项重启时,我会设置树控件的文本变为‘离线’。



问题来了:当我将树控件的项文本改变时,在我的打印中(我在程序中加入了log),会出现以下这句话,
Warning: File:(kernel\qobject.cpp) Line:(92) QObject::connect: Cannot queue arguments of type 'QVector<int>'
(Make sure 'QVector<int>' is registered using qRegisterMetaType().)
如图:


每两秒钟检测一次在线状态,当第一次获取到离线时,就发生了这个警告。

需要说明几点:
1.我的打印是在设置树节点文本之后,也就是说当我设置树节点文本时,发出了这个警告。
2.我的程序中完全没有用到QVector这个内置容器类型,更没有定义过'QVector<int>。所以我感觉很莫名其妙,不知所措。
3.我获取树项状态时,调用了MainWindow主界面的一个函数,这个函数的一个参数是vector<QString>* 类型。难道是这里所导致?但和QVector<int>差的有点多啊!

个人猜想难道是线程中不能够操控ui所致???但是我的对话框树文本的确改变了啊!求各位大神指点啊!!!


离线dbzhang800

只看该作者 1楼 发表于: 2014-12-10
首先,你提到的blog中的方法非常不可取。建议放弃

其次:如果你想知道这些Warning是如何触发的,你可以一步步调试程序。跟踪进入Qt的源码,看看哪一个 的Qt::AutoConnection型的 connect 出现的问题。

估计原因是:因为错误的多线程用法,使得Qt内部某些本该direct方式的连接变成了queue方式。
离线kimtaikee

只看该作者 2楼 发表于: 2014-12-10
你用typedef重定义一下
typedef QVector<int> IntVector;
然后再调用qRegisterMetaType注册一下就可以了.

离线dbzhang800

只看该作者 3楼 发表于: 2014-12-10
回 kimtaikee 的帖子
kimtaikee:你用typedef重定义一下
typedef QVector<int> IntVector;
然后再调用qRegisterMetaType注册一下就可以了. (2014-12-10 17:39) 

正常情况下,自己的代码出现这个问题,应该这么做。但是楼主提到,它根本就没有用QVector这个类,如果再这样做,估计会其他导致更怪异的问题。会使他在错误的路上越走越远。
快速回复
限100 字节
 
上一个 下一个