• 7289阅读
  • 17回复

slot 找不到 [复制链接]

上一主题 下一主题
离线yuangong
 
只看楼主 倒序阅读 楼主  发表于: 2009-09-05
情况是这样的,calss A (属于cal.cpp)中有一 成员变量 iengin(为class B,属于engin.cpp),它是一个指针,在A构造的时候给给iengin赋值。
class B 有slot popup().
当我点击CLASS A 中的一个按钮(OkButton),期望 CLASS B的popup 被调用
connect(OkButton, SIGNAL(clicked()), iengin, SLOT(popup()));
结果是按下按钮却没有任何反映,却报出这样的信息:
Object::connect: No such slot engin::popup( ) in cal.cpp:112
Object::connect:  (sender name:   'OkButton')

我想popup在engin.cpp中,我在cal.cpp中也包含了头文件,编译也没有问题,为什么还是找不到slot呢?
请大家帮帮忙,谢谢!
离线dbzhang800

只看该作者 1楼 发表于: 2009-09-05
你的class B中 加 Q_OBJECT 了么?
离线rqzrqh

只看该作者 2楼 发表于: 2009-09-05
也许你把槽写成了
private:
而不是
private slots:
离线yuangong
只看该作者 3楼 发表于: 2009-09-06
to dbzhang800
class B 加了Q_OBJECT
to rqzrqh
slot 为  public
另外我不知道iengin是不是必须被CLASS A拥有(即class A含有engin的实例)才能调用slot,我的代码里并没有实例化iengin,只是通过传参数给iengin赋值.
离线dbzhang800

只看该作者 4楼 发表于: 2009-09-06
引用第3楼yuangong于2009-09-06 10:49发表的  :
我的代码里并没有实例化iengin,只是通过传参数给iengin赋值.


这与话怎么理解?
离线yuangong
只看该作者 5楼 发表于: 2009-09-06
就是说 并没有在CLASS A 里面去NEW.
类似与这样的代码:
A::A(engin* Engin)
{
    iengin = Engin;
}
离线dbzhang800

只看该作者 6楼 发表于: 2009-09-06
这个应该没什么影响,你做个一最小的能反映出这个问题的工程放到附件中让大家看看吧
离线yuangong
只看该作者 7楼 发表于: 2009-09-06
原因找到了,是因为slot 的参数引起的
popup()的参数中含有class A的指针, 当注释掉参数后就可以运行了。
但是如何能够使popup含有class A的参数仍然可以运行呢?
代码分别如下:
# ifndef A_H
#define A_H

#include <QDialog>
#include <QPushButton>
#include <QString>
#include "b.h"

class B;

class A: public QObject
{
Q_OBJECT
public:
A(B* b);
public:
void setup(QDialog* dialog);
public:
B* ib;
QString iString;
QPushButton* okButton;
};
#endif
-------------------------------------------------------
#include "a.h"

A::A(B* b)
{
ib = b;
iString = "hello,world!";
}

void A::setup(QDialog* dialog)
{
okButton = new QPushButton(dialog);
connect(okButton, SIGNAL(clicked()), ib, SLOT(popup(this)));
}



----------------------------------------------------------------------
# ifndef B_H
#define B_H

#include <QMessageBox>
#include "a.h"

class A;

class B: public QObject
{
Q_OBJECT
public:
B();
public slots:
void popup(A* a);
};
#endif

-------------------------------------------------------
#include "b.h"

B::B()
{
}

void B::popup(A* a)
{
QMessageBox msgBox;
msgBox.setText(a->iString);
msgBox.exec();
}
--------------------------------------------------------------
#include <QApplication>
#include "a.h"
#include <QDialog>


int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QDialog dialog;
B b;
A* a = new A(&b);
a->setup(&dialog);
dialog.show();

return app.exec();
}



----------------------------------------------------
离线dbzhang800

只看该作者 8楼 发表于: 2009-09-06
引用第7楼yuangong于2009-09-06 21:45发表的  :
void B::popup(A* a)
{
QMessageBox msgBox;
msgBox.setText(a->iString);
msgBox.exec();
}
.......


我奇怪的是,你的槽这样用,编译时连警告都没有?

你只是用一个string,为什么不直接传递QString 呢?
离线rqzrqh

只看该作者 9楼 发表于: 2009-09-06
槽的参数和clicked()的参数不匹配,
离线meteor
只看该作者 10楼 发表于: 2009-09-07
to  楼上的楼上
QString只是为了弹出hello world而特意写的,并不一定需要。
将popup改成
popup(A* a)
{
       QMessageBox box;
     box.SetText("hello");
box.exec();
}
同样不能显示出消息框。

to 楼上:
clicked()是okbutton的信号函数,不是slot.
ps:我是楼主。
[ 此帖被meteor在2009-09-07 18:11重新编辑 ]
离线rqzrqh

只看该作者 11楼 发表于: 2009-09-07
因为是QMessageBox box;实例化后应该可以
离线meteor
只看该作者 12楼 发表于: 2009-09-07
找到原因了
因为slot的参数是signal传递的,但是signal的 clicked()的参数为空,所以出错。

解决办法:
1:自定义slot 与 signal
public slots:
       void myslot();
signals:
       void mysignal(A* a);

void myslot()
{
     emit mysignal(this);
}

connect(okButton, SIGNAL(clicked( )), this, SLOT(myslot()));
connect(this, SIGNAL(mysignal( A* )), ib, SLOT(popup(A*)));

一点注意:
connect 的signal 与 slot 的参数都不用带具体的参数,只需要定义参数的类型就可以。
另外 signal函数不需要实现。
离线foolam
只看该作者 13楼 发表于: 2009-09-26
请问楼主  
如果我现在要做一个计算器
读入用户的输入的式子   采用栈的方式实现计算

我每次点击一个数字按钮,就将该数字加入到式子的末尾

我最初想通过参数把每个数字的char值作为参数传给我定义的一个slot,然后添加到qstring的末尾.

但是因为参数不匹配不能成功  要是按照你的方法   我要怎么保存我的参数值呢?
离线foolam
只看该作者 14楼 发表于: 2009-09-26
难道要为每一个按钮都要定义按钮和槽?
离线rqzrqh

只看该作者 15楼 发表于: 2009-09-26
引用第14楼foolam于2009-09-26 15:17发表的  :
难道要为每一个按钮都要定义按钮和槽?

按钮放到QButtonGroup里面去
离线foolam
只看该作者 16楼 发表于: 2009-09-26
引用第15楼rqzrqh于2009-09-26 15:19发表的  :
按钮放到QButtonGroup里面去

刚开始学  谢谢了~
离线meteor
只看该作者 17楼 发表于: 2009-09-27
clicked()这个signal是没有参数,所以slot也不能有参数。
如果向通过signal传递参数,可以重载QPushButton。
正好我刚好有代码,可以提供参考:

---------------------------------.h-----------------------------------
#ifndef _MYBUTTON
#define _MYBUTTON

#include <QPushButton>

class MyButton : public QPushButton
{
    Q_OBJECT
    public:
        MyButton(QWidget * parent = 0);
    public slots:
        void ButtonClicked();
    signals:
        void myclicked(const QString& str);
};
    

#endif

----------------------------------------.cpp-------------------------------------
#include "mybutton.h"

MyButton::MyButton(QWidget * parent) : QPushButton(parent)
{
    connect(this, SIGNAL(clicked()), this, SLOT(ButtonClicked()));
}
    
void MyButton::ButtonClicked()
{
    emit myclicked(this->text());
}
------------------------------------------------------------------------------------------

connect(pushButton, SIGNAL(myclicked(const QString &)),  this,  SLOT(displayNumber(const QString &)));    
快速回复
限100 字节
 
上一个 下一个