• 8503阅读
  • 10回复

QT 应用程序(win xp) 两个奇怪的问题。(第2个问题神奇的解决了) [复制链接]

上一主题 下一主题
离线keimaoqi
 
只看楼主 倒序阅读 楼主  发表于: 2009-09-17
① 编译好的一个QT mainwindow类型的 exe文件放在我机子上任意文件夹下都能正常运行, 而在别人机子上(vc和QT都没装)需要带上 QtCored4.dll   QtGuid4.dll  才能运行起来,但是奇怪的是:exe上的图标都显示不出来(原资源中的ico和png文件) ,(在我自己机器上都能正常显示出来),是缺哪个库么?



②我设定的几个工具栏按钮在我自己定义的类cpp中各自connect了个弹出对话框的slot。但奇怪的是:我运行exe时,点击按钮会弹出两个一样的对话框,为什么不是1个呢?
QObject::connect(ui.actionCfg, SIGNAL(triggered()), this, SLOT(on_actionCfg_triggered()));

[ 此帖被keimaoqi在2009-09-25 11:07重新编辑 ]
离线dbzhang800

只看该作者 1楼 发表于: 2009-09-17
1. image 的插件你没有随程序一块发布。

2. 你的程序写的可能哪儿没考虑周到
离线keimaoqi
只看该作者 2楼 发表于: 2009-09-17
楼上的兄弟, image 插件?是哪个文件要随程序发布?我就用QT designer自带的东西做的啊。

connect部分:
QObject::connect(ui.actionCfg, SIGNAL(triggered()), this, SLOT(on_actionCfg_triggered()));

on_actionCfg_triggered()函数体部分:
pcfg =new Config(this);
pcfg->show();
离线dbzhang800

只看该作者 3楼 发表于: 2009-09-17
把你Qt安装目录下的 plugins 目录下的 imageformats 文件夹拷到 你的 exe 程序所在目录
离线keimaoqi
只看该作者 4楼 发表于: 2009-09-17
第1个问题搞定了,谢谢
离线浪漫天使
只看该作者 5楼 发表于: 2009-09-18
第二个问题
估计你是用qt3转过来到qt4的ui文件,在qt3里面designer里面connect了一次
自己的代码里面又connect了一次

权当猜测。
离线keimaoqi
只看该作者 6楼 发表于: 2009-09-18
5楼兄弟,倒也不是那样,我没用过QT3,这个ui就是我用Qt4自己做的。我自己怀疑过是不是多了connect语句,但查了半天,对于这个action就这一个connect语句,而且我试过在这个connect语句下再复制这句一遍,运行程序结果一样,还是按1下工具栏按钮弹出两次对话框。单句追踪发现我按1下那个工具栏按钮,对应的那个slot函数连续运行了2遍,同时moc***文件中的那个qt_metacall函数也是连续运行了2遍。

是不是信号设置不对啊,不应该用triggered()这个信号?工具栏 按下 和 弹起 分别用哪个信号啊?是因为我点了1下触发了这两个信号了么?


designer中编辑action中图标设置那有这么几个选项:Normal off,Normal on,Disable off,Disable on,Active off,Active on,Selected off,Selected on. 我选的默认的Normal off,和这有关吗?



刚才试1下,我改了个  Normal on  好像只弹出1次了,不过这几个选项什么意思啊,什么时候用哪个呢?



又出现了个很郁闷的问题:designer老报错,开不起来,   我好像干了件错事? 我再一个项目中开了两个mainwindow的ui。   现在的情况是,我把自己编译好的包解压出来一份,先开designer打开ui文件可以,但在vc里面点击解决方案中的ui貌似就把designer给破换了,再开就开不起来了,老报错。然后又得删了QT文件夹,重新解压,这个很烦啊。是因为我上面提到的这个错事么?我编译Qt时候为了做出的程序不需要带vc的那个run-time库,把  mkspecs\win32-msvc2008下的qmake.conf 中的QMAKE_CFLAGS_RELEASE    = -O2 -MD
QMAKE_CFLAGS_DEBUG      = -Zi -MDd改成了QMAKE_CFLAGS_RELEASE    = -O2 -MT
QMAKE_CFLAGS_DEBUG      = -Zi -MTd  应该不会和这有关吧


现在图标那个选项又设置不了了,只能用Normal off.....
[ 此帖被keimaoqi在2009-09-18 12:15重新编辑 ]
离线keimaoqi
只看该作者 7楼 发表于: 2009-09-25
第2个问题的神奇解决!!!

我都不知道自己怎么悟出这种办法来的。。。

原来不知道是从那个帖子还是哪个文档中看到的slot函数命名规范:在对象名 action***的前面加on_ 后面加信号名如_triggered,  如:
on_actionopen_triggered()   我学新东西都喜欢按规范来,于是照做,结果出了这个诡异的错误。

解决办法:打翻这个命名规范即可,随自己喜好把slot函数名字重改一下,一切正常:按1下工具栏按钮弹一个对话框。或者按如上命名方式命名  把之前的connect语句删除。
望以后的新手引以为戒。。

原因分析:on_action***_信号名  的这种风格的slot函数 QT会自动把它与 信号  connect起来,无需手动 connect  !!!!  
[ 此帖被keimaoqi在2009-09-25 11:25重新编辑 ]
离线foxyz

只看该作者 8楼 发表于: 2009-09-25
第二个问题5楼已经回答了.因为Qt会自动产生一个格式是On_Button_Clicked的slot并且 connect一次
离线rqzrqh

只看该作者 9楼 发表于: 2009-09-25
引用第8楼foxyz于2009-09-25 13:42发表的  :
第二个问题5楼已经回答了.因为Qt会自动产生一个格式是On_Button_Clicked的slot并且 connect一次

原来是这种方法导致的。
难怪去 ui生成的头文件里去找槽的链接,就是怎么找也找不到,但是信号却接收了。
坚决反对这种方法,非常不直观
离线rqzrqh

只看该作者 10楼 发表于: 2009-09-28
快速回复
限100 字节
 
上一个 下一个