• 8272阅读
  • 14回复

如何把槽函数 作为 另一个函数的参数?   解决! [复制链接]

上一主题 下一主题
离线iiiyyyhhhsss
 

只看楼主 倒序阅读 楼主  发表于: 2009-09-21
填空题(从声明,定义,最后调用):

例如:
protected:
void B(需要一个槽函数作为参数,如何写?);

private slots:
void A();
void C();
void D();


void B(把一个槽函数作为参数,如何写?)
{
    connect(this->pushButton,SIGNAL(clicked()),this,SLOT(一个槽函数,如何写?));
}


那么,我想把函数(A,C或D)作为函数B的参数来输入,然后在函数B里给某个按钮的信号与这个槽函数建立一个连接,实际调用函数B()又该如何写:

B(选择其中一个槽函数,如何写?);
[ 此帖被iiiyyyhhhsss在2009-09-22 11:00重新编辑 ]
离线rqzrqh

只看该作者 1楼 发表于: 2009-09-21
一个特定按钮产生的点击信号难道要它实现多态?
离线iiiyyyhhhsss

只看该作者 2楼 发表于: 2009-09-21
我试过这样,但是失败了,如下:

声明:
void B(void (*)());

定义:
void B(void (*mm)())
{
.........
connect(this->pushButton,SIGNAL(clicked()),this,SLOT((*mm)()));
}
调用:
B(&A);//把槽函数A作为输入参数
离线iiiyyyhhhsss

只看该作者 3楼 发表于: 2009-09-21
严格上来说,connect(......)是不是一个函数?我想看看它的原始定义。。。谁知道哪里有有关connect源码的信息?
离线318065268
只看该作者 4楼 发表于: 2009-09-21
Re:如何把槽函数 作为 另一个函数的参数?   一道填空题
我觉得设计的有问题,要达到目的不需要这样设计。
而且你的clicked()信号是不可能和你的槽匹配。信号的参数可以比槽多,但不能比槽少,更不能类型不匹配。
Email  rsail@126.com(私人邮箱)
QQ:   318065268
离线318065268
只看该作者 5楼 发表于: 2009-09-21
Re:如何把槽函数 作为 另一个函数的参数?   一道填空题
我错了,发帖子的时候没有看到3楼的帖子。
楼主的方法不错,但是在C++中,涉及到函数的访问权限问题,用函数指针还要保证该指针对应的内容存在,对内存操作往往是危险的。
我觉得可以使用一个信号连接到多个槽的机制。直接把所有你要连接到的槽都给连上,然后再用一些全局变量什么的判断是否应该做进一步的处理。
satic int stat = 0;
connect(this->pushButton,SIGNAL(clicked()),this,SLOT(A()));
connect(this->pushButton,SIGNAL(clicked()),this,SLOT(C()));
connect(this->pushButton,SIGNAL(clicked()),this,SLOT(D()));
void A()
{
  if(state != 1)
    return;
}
void C()
{
  if(state != 2)
    return;
}
void D()
{
  if(state != 3)
    return;
}
Email  rsail@126.com(私人邮箱)
QQ:   318065268
离线shiroki

只看该作者 6楼 发表于: 2009-09-21
实现不了你说的这个功能。 因为connect里面写的SLOT(xxx)是直接引用字符串的, 这里不能写函数指针
--
shiro is White
ki is tree
http://www.cuteqt.com
论坛 http://www.cuteqt.com/bbs
博客 http://www.cuteqt.com/blog
博客镜像: http://sites.cuteqt.com/cuteqt
Linux/Qt/嵌入式讨论群 http://qun.qq.com/air/5699823
离线iiiyyyhhhsss

只看该作者 7楼 发表于: 2009-09-21
直接引用字符串?是否有可能把槽函数名的字符串作为函数参数输入去呢?
离线cspp

只看该作者 8楼 发表于: 2009-09-22
可以,用char*就可以了。

void MainWindow::init()
{
    //......
    addToMenu(plugin, iFilter->filters(), filterMenu, SLOT(applyFilter()));
    //......
}

void MainWindow::addToMenu(QObject *plugin, const QString &text,
                           QMenu *menu, const char *member)
{
    QAction *action = new QAction(text, plugin);
    connect(action, SIGNAL(triggered()), this, member);
    menu->addAction(action);
}
离线iiiyyyhhhsss

只看该作者 9楼 发表于: 2009-09-22
SLOT(applyFilter())是const char* 类吗?

我调过,编译不通过啊。。。
离线iiiyyyhhhsss

只看该作者 10楼 发表于: 2009-09-22
没错SLOT()返回的确是const char*类型,刚才const char* member=SLOT(applyFilter());编译通过了

但是为什么我在函数调用是写 SLOT(applyFilter())却报错说调用了没有匹配的函数呢?奇怪
离线iiiyyyhhhsss

只看该作者 11楼 发表于: 2009-09-22
成功通过,这个方法是正确的!!刚才是我写错函数了,不好意思,thanks!
离线onglus
只看该作者 12楼 发表于: 2009-10-12
Re:如何把槽函数 作为 另一个函数的参数?   解决!
更正一下四楼网友的说法,在槽函数关联机制里,大多数情况下信号槽的参数类型的确是与信号函数的参数类型相同并等量的,但是,今天看书,见到书上有提到说一个槽的参数个数是可以少于信号的参数个数的。不过,缺少的这几个参数必须得是排在信号函数最后面的那几个。至于如何把槽函数作为一个函数的参数进行传递?我个人还不是很懂。
[ 此帖被onglus在2009-10-12 13:51重新编辑 ]
Qt高阶编程交流群71555992,进群条件是非常勿扰。
离线hiti_tony
只看该作者 13楼 发表于: 2009-10-12
Re:如何把槽函数 作为 另一个函数的参数?   解决!
小试了下 不行
离线guhan010

只看该作者 14楼 发表于: 2009-10-12
Re:如何把槽函数 作为 另一个函数的参数?   解决!
这个槽函数首先应该是静态函数吧,
能够回调就行了。
快速回复
限100 字节
 
上一个 下一个