QT槽函数传参问题

haibin0109 2011-09-14 07:23:05
class test
{
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);
请问槽函数怎么才能传参,求解决方法?
...全文
1411 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaogu_wuxin 2012-07-27
  • 打赏
  • 举报
回复
建议使用QButtonGroup,
QPushButton的clicked()是不能带参数的,除非你把QPushButton继承出来重写

另外,可以尝试用QSignalMapper把无参数的信号变成有参数的信号
我是学友 2011-09-15
  • 打赏
  • 举报
回复
这么多好心人回帖,看帖子才30分,要咋分这30分啊
ailinty 2011-09-15
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 ailinty 的回复:]
方法1:
connect(button1, SIGNAL(clicked()), this, SLOT(buttonClick()));
connect(button2, SIGNAL(clicked()), this, SLOT(buttonClick()));
button1.setObjectName("1");
button2.setObjectName("2");

void……
[/Quote]
有个错误:第二个YourWidget::dochangeValue1() 改为 YourWidget::dochangeValue2()
ailinty 2011-09-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
}
方法二够恶心的吧?但是能做到你要做到事情。。。。飘过!!! 淡定。。。
我是学友 2011-09-15
  • 打赏
  • 举报
回复
引用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)))
这样写就可以把参数传递出去了,我只是简单的举个例子,具体怎么实现还是看你自己多查资料了
我是学友 2011-09-15
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 yiyaaixuexi 的回复:]
信号和槽不能带参数?


C/C++ code


signals:
void mySignal();
void mySignal(int x);
void mySignalParam(int x, int y);

public slots:
void mySlot();
void mySlot(int x);
void mySignalParam(int……
[/Quote]

是信号和槽连接的时候不能直接传进去实际的参数,只能保持相同的参数类型
void Slot(int i);
connect(pushbutton_1,SIGNAL(clicked()),this,SLOT(Slot(1)));
我的意思是看楼业主这么写,貌似是连接的时候直接把1,2,3三个参数传进槽函数了
caoyutian861565428 2011-09-14
  • 打赏
  • 举报
回复
知道的请抽时间回复一下吧,网上搜了一大堆都没找到解决方法啊
caoyutian861565428 2011-09-14
  • 打赏
  • 举报
回复
我写的第一个程序
#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 时发生访问冲突”
请问是什么原因哪!!!急急急!
念茜 2011-09-14
  • 打赏
  • 举报
回复
信号和槽不能带参数?


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]
我是学友 2011-09-14
  • 打赏
  • 举报
回复
信号和槽不能带参数,你这SLOT(Slot(1))算是带参数了吧
haibin0109 2011-09-14
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 foxyz 的回复:]

3. test内有没有加Q_OBJECT?
这个很关键,你头文件都没写对。有自定义的slot或者signal,你的类得从QObject继承,同时在类的内部最前面加上Q_OBJECT
[/Quote]这个当然加了,只是想简化写,因为我只想知道关于槽函数传参的那个问题
donwmufromdying 2011-09-14
  • 打赏
  • 举报
回复
同意大壮的意见,你好好看看signal-slot到底是什么。
connect(pushbutton_1,SIGNAL(clicked()),this,SLOT(Slot(1)));
这里边很多错误啊。signal的参数要跟slot一致,你的clicked是无参数信号,怎么可能传参数给slot函数呢?再说了,你这样connect根本就不对啊SLOT(Slot(1))能这么写吗?我只见过SLOT(Slot(int))的写法,还真没见过你这种写法。
donwmufromdying 2011-09-14
  • 打赏
  • 举报
回复
3. test内有没有加Q_OBJECT?
这个很关键,你头文件都没写对。有自定义的slot或者signal,你的类得从QObject继承,同时在类的内部最前面加上Q_OBJECT
dbzhang800 2011-09-14
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 haibin0109 的回复:]

不好意思,我的问题就是槽函数的传参问题,我的目的就是想把connect中Slot(1)中的1传给函数void Slot(int i)中的i,然后函数void Slot(int i)的通过i就可以用这个整数1,不知道这样错在哪里?
[/Quote]
呵呵,先熟悉信号槽的用法吧,你这儿完完全全错了。
haibin0109 2011-09-14
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 dbzhang800 的回复:]

引用 2 楼 haibin0109 的回复:

等的好急,有用~~~~~~~~·


http://www.beiww.com/doc/oss/smart-questions.html

你把所有重点都简化掉了,别人根本没办法回答。
1. test类和 Draw类什么关系?
2. test是不是QObject的派生类?
3. test内有没有加Q_OBJECT?
4……
[/Quote]
不好意思,我的问题就是槽函数的传参问题,我的目的就是想把connect中Slot(1)中的1传给函数void Slot(int i)中的i,然后函数void Slot(int i)的通过i就可以用这个整数1,不知道这样错在哪里?
dbzhang800 2011-09-14
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 haibin0109 的回复:]

等的好急,有用~~~~~~~~·
[/Quote]

http://www.beiww.com/doc/oss/smart-questions.html

你把所有重点都简化掉了,别人根本没办法回答。
1. test类和 Draw类什么关系?
2. test是不是QObject的派生类?
3. test内有没有加Q_OBJECT?
4. 。。。
haibin0109 2011-09-14
  • 打赏
  • 举报
回复
等的好急,有用~~~~~~~~·
haibin0109 2011-09-14
  • 打赏
  • 举报
回复
在线等结果

16,211

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧