• 14662阅读
  • 7回复

请教signal 和 slot的参数传递问题!! [复制链接]

上一主题 下一主题
离线nanawoaini
 
只看楼主 倒序阅读 楼主  发表于: 2006-08-04
自己编写了slot
public slot:
    virtual void display(unsigned char *buffer);
在CCS类的构造函数中定义并且初始化如下:
    unsigned char buffer[256];
    int j;
    for(j=0;j<256;j++)
        buffer[j]=j;
然后将slot与一个button的clicked()信号连接
connect(button1,SIGNAL(clicked()),this,SLOT(display(unsigned char *)))
display函数中有如下代码:
void CCS::display(unsigned char *buffer)
{
  int k;
  for(k=0;k<256;k++)
    printf("the number of buffer %d is &d\n",k,buffer[k]);
}

程序运行后发现按下button1按钮后打印出的buffer数组内容与定义的不同,我认为是buffer参数没有传给display,而且这个错误很容易造成段错误!!!但是该如何做才能将buffer指针传过去呢??
请大家赐教!!!十分感谢!!!
[ 此贴被XChinux在2006-08-04 19:39重新编辑 ]
离线nanawoaini
只看该作者 1楼 发表于: 2006-08-05
怎么没有人赐教呢??自己顶一下急等!!!
离线yangmiao322
只看该作者 2楼 发表于: 2006-08-08
试一下connect(button1,SIGNAL(clicked()),this,SLOT(display(ccs->buf)))
但是听说,槽的参数比信号的参数多的话,会出现错误。
我一千也遇到过这样的问题
离线nick
只看该作者 3楼 发表于: 2006-08-09
1。slot的参数是signal传给它的。你connect的signal和slot根本不匹配。一般来说signal的参数和slot的参数应该一致,最起码slot的参数不能多于signal的参数,并且参数列表的顺序和类型都要一致。

2。正是由于第一点,display传入的参数实际上是一个非法指针,并不是你想象中的在构造函数里申明的那个局部数组(实际上离开构造函数它也完蛋了)。

你可以这样做:
1.申明一个CCS类的成员变量:unsigned char m_buffer[256];
2.在构造函数初始化m_buffer:
  int j;
  for(j=0;j<256;j++)
    m_buffer[j]=j;

3.修改display函数:
void CCS::display()
{
int k;
for(k=0;k<256;k++)
  printf("the number of buffer %d is &d\n",k,m_buffer[k]);
}

4.这样连接signal和slot:
connect(button1,SIGNAL(clicked()),this,SLOT(display()));
Qt...
离线weiwei22844

只看该作者 4楼 发表于: 2013-04-15
学习了,呵呵!
离线yearl

只看该作者 5楼 发表于: 2013-04-16
引用第3楼nick于2006-08-09 06:01发表的  :
一般来说signal的参数和slot的参数应该一致,最起码slot的参数不能多于signal的参数,并且参数列表的顺序和类型都要一致。
.......


实际应用中经常需要signal带有参数,就象楼主的需求一样,怎么办?
1、继承基类,自己在继承的类中处理这个signalemit一个新的带有参数的signal
2、使用QSignalMapper



离线kaon

只看该作者 6楼 发表于: 2013-04-18
可以用lamba
离线kaon

只看该作者 7楼 发表于: 2013-04-18
快速回复
限100 字节
 
上一个 下一个