{
public:
test();
......
private slots:
void Slot(int i);
private:
....
};
test::test()
{
.....
connect(pushbutton_1,SIGNAL(clicked()),this,SLOT(Slot(1)));
connect(pushbutton_2,SIGNAL(clicked()),this,SLOT(Slot(2)));
connect(pushbutton_3,SIGNAL(clicked()),this,SLOT(Slot(3)));
}
void test::Slot(int i)
{
.......
}
菜鸟求教:执行结果是 ;No such slot Drawer::Slot(1);No such slot Drawer::Slot(2);No such slot Drawer::Slot(3);
请问槽函数怎么才能传参,求解决方法?
18 个解决方案
#1
在线等结果
#2
等的好急,有用~~~~~~~~·
#3
http://www.beiww.com/doc/oss/smart-questions.html
你把所有重点都简化掉了,别人根本没办法回答。
1. test类和 Draw类什么关系?
2. test是不是QObject的派生类?
3. test内有没有加Q_OBJECT?
4. 。。。
#4
不好意思,我的问题就是槽函数的传参问题,我的目的就是想把connect中Slot(1)中的1传给函数void Slot(int i)中的i,然后函数void Slot(int i)的通过i就可以用这个整数1,不知道这样错在哪里?
#5
呵呵,先熟悉信号槽的用法吧,你这儿完完全全错了。
#6
3. test内有没有加Q_OBJECT?
这个很关键,你头文件都没写对。有自定义的slot或者signal,你的类得从QObject继承,同时在类的内部最前面加上Q_OBJECT
这个很关键,你头文件都没写对。有自定义的slot或者signal,你的类得从QObject继承,同时在类的内部最前面加上Q_OBJECT
#7
同意大壮的意见,你好好看看signal-slot到底是什么。
connect(pushbutton_1,SIGNAL(clicked()),this,SLOT(Slot(1)));
这里边很多错误啊。signal的参数要跟slot一致,你的clicked是无参数信号,怎么可能传参数给slot函数呢?再说了,你这样connect根本就不对啊SLOT(Slot(1))能这么写吗?我只见过SLOT(Slot(int))的写法,还真没见过你这种写法。
connect(pushbutton_1,SIGNAL(clicked()),this,SLOT(Slot(1)));
这里边很多错误啊。signal的参数要跟slot一致,你的clicked是无参数信号,怎么可能传参数给slot函数呢?再说了,你这样connect根本就不对啊SLOT(Slot(1))能这么写吗?我只见过SLOT(Slot(int))的写法,还真没见过你这种写法。
#8
这个当然加了,只是想简化写,因为我只想知道关于槽函数传参的那个问题
#9
信号和槽不能带参数,你这SLOT(Slot(1))算是带参数了吧
#10
信号和槽不能带参数?
通过调用 QObject 对象的 connect 函数来将某个对象的信号与另外一个对象的槽函数相关联
signals:
void mySignal();
void mySignal(int x);
void mySignalParam(int x, int y);
public slots:
void mySlot();
void mySlot(int x);
void mySignalParam(int x,int y);
通过调用 QObject 对象的 connect 函数来将某个对象的信号与另外一个对象的槽函数相关联
bool QObject::connect ( const QObject * sender, const char * signal,
const QObject * receiver, const char * member ) [static]
#11
我写的第一个程序
#include "cv.h"
#include "highgui.h"
using namespace cv;
int main(int argc, char* argv[])
{
Mat img = imread("Lena.jpg");
if(!img.data) return -1;
namedWindow("loveLena",CV_WINDOW_AUTOSIZE);
imshow("loveLena",img);
waitKey();
return 0;
}
然后弹出中断对话框显示“ 图像读入和显示.exe 中的 0x5622b130 (msvcr80d.dll) 处有未经处理的异常: 0xC0000005: 读取位置 0x00000000 时发生访问冲突”
请问是什么原因哪!!!急急急!
#include "cv.h"
#include "highgui.h"
using namespace cv;
int main(int argc, char* argv[])
{
Mat img = imread("Lena.jpg");
if(!img.data) return -1;
namedWindow("loveLena",CV_WINDOW_AUTOSIZE);
imshow("loveLena",img);
waitKey();
return 0;
}
然后弹出中断对话框显示“ 图像读入和显示.exe 中的 0x5622b130 (msvcr80d.dll) 处有未经处理的异常: 0xC0000005: 读取位置 0x00000000 时发生访问冲突”
请问是什么原因哪!!!急急急!
#12
知道的请抽时间回复一下吧,网上搜了一大堆都没找到解决方法啊
#13
是信号和槽连接的时候不能直接传进去实际的参数,只能保持相同的参数类型
void Slot(int i);
connect(pushbutton_1,SIGNAL(clicked()),this,SLOT(Slot(1)));
我的意思是看楼业主这么写,貌似是连接的时候直接把1,2,3三个参数传进槽函数了
#14
引用10楼的高人说两句,信号和槽参数类型必须一致,而且有一点,在connect的时候是不能直接传参数的,看你的意思是想多个按键的信号连接多个槽,有两种办法,
一:如果你想用clicked()信号,那槽函数只能是slot(),不能是slot(int),这样信号和槽的参数类型不一致,必然会报错,而且你还在connect的时候传进去参数了。你可以选择定义多个槽函数与每个按钮相对应。
二:你自己定义一个槽函数emitSignal(),将clicked()与其相连,然后在该槽函数中发射一个信号signal(int),这样就可以与你的slot(int)相连了,参数是通过函数调用实现传递,不会出现在connect中
举个简单的例子
槽函数
void emitSignal()
{
int i;
emit signal(i);
}
然后connect(...,SIGNAL(signal(int)),...,SLOT(slot(int)))
这样写就可以把参数传递出去了,我只是简单的举个例子,具体怎么实现还是看你自己多查资料了
一:如果你想用clicked()信号,那槽函数只能是slot(),不能是slot(int),这样信号和槽的参数类型不一致,必然会报错,而且你还在connect的时候传进去参数了。你可以选择定义多个槽函数与每个按钮相对应。
二:你自己定义一个槽函数emitSignal(),将clicked()与其相连,然后在该槽函数中发射一个信号signal(int),这样就可以与你的slot(int)相连了,参数是通过函数调用实现传递,不会出现在connect中
举个简单的例子
槽函数
void emitSignal()
{
int i;
emit signal(i);
}
然后connect(...,SIGNAL(signal(int)),...,SLOT(slot(int)))
这样写就可以把参数传递出去了,我只是简单的举个例子,具体怎么实现还是看你自己多查资料了
#15
方法1:
connect(button1, SIGNAL(clicked()), this, SLOT(buttonClick()));
connect(button2, SIGNAL(clicked()), this, SLOT(buttonClick()));
button1.setObjectName("1");
button2.setObjectName("2");
void YourWidget::buttonClick()
{
QPushButton *clickedButton = qobject_cast<QPushButton *>(sender());
if(clickedButton != NULL)
{
if(clickedButton->objectName() == "1")
{
//button1
}
if(clickedButton->objectName() == "2")
{
//button2
}
}
}
方法2:
connect(button1, SIGNAL(yourClicked(int)), this, SLOT(YourButtonClick(int)));
connect(button2, SIGNAL(yourClicked(int)), this, SLOT(YourButtonClick(int)));
connect(button1, SIGNAL(click()), this, SLOT(dochangeValue1()));
connect(button2, SIGNAL(click()), this, SLOT(dochangeValue2()));
void YourWidget::dochangeValue1()
{
emit yourClicked(1);
}
void YourWidget::dochangeValue1()
{
emit yourClicked(2);
}
void YourWidget::YourButtonClick(int value)
{
//value==1 button1
//value==2 button2
}
方法二够恶心的吧?但是能做到你要做到事情。。。。飘过!!! 淡定。。。
#16
有个错误:第二个YourWidget::dochangeValue1() 改为 YourWidget::dochangeValue2()
#17
这么多好心人回帖,看帖子才30分,要咋分这30分啊
#18
建议使用QButtonGroup,
QPushButton的clicked()是不能带参数的,除非你把QPushButton继承出来重写
另外,可以尝试用QSignalMapper把无参数的信号变成有参数的信号
QPushButton的clicked()是不能带参数的,除非你把QPushButton继承出来重写
另外,可以尝试用QSignalMapper把无参数的信号变成有参数的信号
#1
在线等结果
#2
等的好急,有用~~~~~~~~·
#3
http://www.beiww.com/doc/oss/smart-questions.html
你把所有重点都简化掉了,别人根本没办法回答。
1. test类和 Draw类什么关系?
2. test是不是QObject的派生类?
3. test内有没有加Q_OBJECT?
4. 。。。
#4
不好意思,我的问题就是槽函数的传参问题,我的目的就是想把connect中Slot(1)中的1传给函数void Slot(int i)中的i,然后函数void Slot(int i)的通过i就可以用这个整数1,不知道这样错在哪里?
#5
呵呵,先熟悉信号槽的用法吧,你这儿完完全全错了。
#6
3. test内有没有加Q_OBJECT?
这个很关键,你头文件都没写对。有自定义的slot或者signal,你的类得从QObject继承,同时在类的内部最前面加上Q_OBJECT
这个很关键,你头文件都没写对。有自定义的slot或者signal,你的类得从QObject继承,同时在类的内部最前面加上Q_OBJECT
#7
同意大壮的意见,你好好看看signal-slot到底是什么。
connect(pushbutton_1,SIGNAL(clicked()),this,SLOT(Slot(1)));
这里边很多错误啊。signal的参数要跟slot一致,你的clicked是无参数信号,怎么可能传参数给slot函数呢?再说了,你这样connect根本就不对啊SLOT(Slot(1))能这么写吗?我只见过SLOT(Slot(int))的写法,还真没见过你这种写法。
connect(pushbutton_1,SIGNAL(clicked()),this,SLOT(Slot(1)));
这里边很多错误啊。signal的参数要跟slot一致,你的clicked是无参数信号,怎么可能传参数给slot函数呢?再说了,你这样connect根本就不对啊SLOT(Slot(1))能这么写吗?我只见过SLOT(Slot(int))的写法,还真没见过你这种写法。
#8
这个当然加了,只是想简化写,因为我只想知道关于槽函数传参的那个问题
#9
信号和槽不能带参数,你这SLOT(Slot(1))算是带参数了吧
#10
信号和槽不能带参数?
通过调用 QObject 对象的 connect 函数来将某个对象的信号与另外一个对象的槽函数相关联
signals:
void mySignal();
void mySignal(int x);
void mySignalParam(int x, int y);
public slots:
void mySlot();
void mySlot(int x);
void mySignalParam(int x,int y);
通过调用 QObject 对象的 connect 函数来将某个对象的信号与另外一个对象的槽函数相关联
bool QObject::connect ( const QObject * sender, const char * signal,
const QObject * receiver, const char * member ) [static]
#11
我写的第一个程序
#include "cv.h"
#include "highgui.h"
using namespace cv;
int main(int argc, char* argv[])
{
Mat img = imread("Lena.jpg");
if(!img.data) return -1;
namedWindow("loveLena",CV_WINDOW_AUTOSIZE);
imshow("loveLena",img);
waitKey();
return 0;
}
然后弹出中断对话框显示“ 图像读入和显示.exe 中的 0x5622b130 (msvcr80d.dll) 处有未经处理的异常: 0xC0000005: 读取位置 0x00000000 时发生访问冲突”
请问是什么原因哪!!!急急急!
#include "cv.h"
#include "highgui.h"
using namespace cv;
int main(int argc, char* argv[])
{
Mat img = imread("Lena.jpg");
if(!img.data) return -1;
namedWindow("loveLena",CV_WINDOW_AUTOSIZE);
imshow("loveLena",img);
waitKey();
return 0;
}
然后弹出中断对话框显示“ 图像读入和显示.exe 中的 0x5622b130 (msvcr80d.dll) 处有未经处理的异常: 0xC0000005: 读取位置 0x00000000 时发生访问冲突”
请问是什么原因哪!!!急急急!
#12
知道的请抽时间回复一下吧,网上搜了一大堆都没找到解决方法啊
#13
是信号和槽连接的时候不能直接传进去实际的参数,只能保持相同的参数类型
void Slot(int i);
connect(pushbutton_1,SIGNAL(clicked()),this,SLOT(Slot(1)));
我的意思是看楼业主这么写,貌似是连接的时候直接把1,2,3三个参数传进槽函数了
#14
引用10楼的高人说两句,信号和槽参数类型必须一致,而且有一点,在connect的时候是不能直接传参数的,看你的意思是想多个按键的信号连接多个槽,有两种办法,
一:如果你想用clicked()信号,那槽函数只能是slot(),不能是slot(int),这样信号和槽的参数类型不一致,必然会报错,而且你还在connect的时候传进去参数了。你可以选择定义多个槽函数与每个按钮相对应。
二:你自己定义一个槽函数emitSignal(),将clicked()与其相连,然后在该槽函数中发射一个信号signal(int),这样就可以与你的slot(int)相连了,参数是通过函数调用实现传递,不会出现在connect中
举个简单的例子
槽函数
void emitSignal()
{
int i;
emit signal(i);
}
然后connect(...,SIGNAL(signal(int)),...,SLOT(slot(int)))
这样写就可以把参数传递出去了,我只是简单的举个例子,具体怎么实现还是看你自己多查资料了
一:如果你想用clicked()信号,那槽函数只能是slot(),不能是slot(int),这样信号和槽的参数类型不一致,必然会报错,而且你还在connect的时候传进去参数了。你可以选择定义多个槽函数与每个按钮相对应。
二:你自己定义一个槽函数emitSignal(),将clicked()与其相连,然后在该槽函数中发射一个信号signal(int),这样就可以与你的slot(int)相连了,参数是通过函数调用实现传递,不会出现在connect中
举个简单的例子
槽函数
void emitSignal()
{
int i;
emit signal(i);
}
然后connect(...,SIGNAL(signal(int)),...,SLOT(slot(int)))
这样写就可以把参数传递出去了,我只是简单的举个例子,具体怎么实现还是看你自己多查资料了
#15
方法1:
connect(button1, SIGNAL(clicked()), this, SLOT(buttonClick()));
connect(button2, SIGNAL(clicked()), this, SLOT(buttonClick()));
button1.setObjectName("1");
button2.setObjectName("2");
void YourWidget::buttonClick()
{
QPushButton *clickedButton = qobject_cast<QPushButton *>(sender());
if(clickedButton != NULL)
{
if(clickedButton->objectName() == "1")
{
//button1
}
if(clickedButton->objectName() == "2")
{
//button2
}
}
}
方法2:
connect(button1, SIGNAL(yourClicked(int)), this, SLOT(YourButtonClick(int)));
connect(button2, SIGNAL(yourClicked(int)), this, SLOT(YourButtonClick(int)));
connect(button1, SIGNAL(click()), this, SLOT(dochangeValue1()));
connect(button2, SIGNAL(click()), this, SLOT(dochangeValue2()));
void YourWidget::dochangeValue1()
{
emit yourClicked(1);
}
void YourWidget::dochangeValue1()
{
emit yourClicked(2);
}
void YourWidget::YourButtonClick(int value)
{
//value==1 button1
//value==2 button2
}
方法二够恶心的吧?但是能做到你要做到事情。。。。飘过!!! 淡定。。。
#16
有个错误:第二个YourWidget::dochangeValue1() 改为 YourWidget::dochangeValue2()
#17
这么多好心人回帖,看帖子才30分,要咋分这30分啊
#18
建议使用QButtonGroup,
QPushButton的clicked()是不能带参数的,除非你把QPushButton继承出来重写
另外,可以尝试用QSignalMapper把无参数的信号变成有参数的信号
QPushButton的clicked()是不能带参数的,除非你把QPushButton继承出来重写
另外,可以尝试用QSignalMapper把无参数的信号变成有参数的信号