QT槽函数传参问题

时间:2022-12-24 18:48:04
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);
              请问槽函数怎么才能传参,求解决方法?

18 个解决方案

#1


在线等结果

#2


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

#3


引用 2 楼 haibin0109 的回复:
等的好急,有用~~~~~~~~·


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

你把所有重点都简化掉了,别人根本没办法回答。
 1. test类和 Draw类什么关系?
 2. test是不是QObject的派生类?
 3. test内有没有加Q_OBJECT?
 4. 。。。

#4


引用 3 楼 dbzhang800 的回复:
引用 2 楼 haibin0109 的回复:

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


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

你把所有重点都简化掉了,别人根本没办法回答。
 1. test类和 Draw类什么关系?
 2. test是不是QObject的派生类?
 3. test内有没有加Q_OBJECT?
 4……

不好意思,我的问题就是槽函数的传参问题,我的目的就是想把connect中Slot(1)中的1传给函数void Slot(int i)中的i,然后函数void Slot(int i)的通过i就可以用这个整数1,不知道这样错在哪里?

#5


引用 4 楼 haibin0109 的回复:
不好意思,我的问题就是槽函数的传参问题,我的目的就是想把connect中Slot(1)中的1传给函数void Slot(int i)中的i,然后函数void Slot(int i)的通过i就可以用这个整数1,不知道这样错在哪里?

呵呵,先熟悉信号槽的用法吧,你这儿完完全全错了。

#6


3. test内有没有加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))的写法,还真没见过你这种写法。

#8


引用 6 楼 foxyz 的回复:
3. test内有没有加Q_OBJECT?
这个很关键,你头文件都没写对。有自定义的slot或者signal,你的类得从QObject继承,同时在类的内部最前面加上Q_OBJECT
这个当然加了,只是想简化写,因为我只想知道关于槽函数传参的那个问题

#9


信号和槽不能带参数,你这SLOT(Slot(1))算是带参数了吧

#10


信号和槽不能带参数?


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 时发生访问冲突”
请问是什么原因哪!!!急急急!

#12


知道的请抽时间回复一下吧,网上搜了一大堆都没找到解决方法啊

#13


引用 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……


是信号和槽连接的时候不能直接传进去实际的参数,只能保持相同的参数类型
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)))
这样写就可以把参数传递出去了,我只是简单的举个例子,具体怎么实现还是看你自己多查资料了

#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


引用 15 楼 ailinty 的回复:
方法1:
connect(button1, SIGNAL(clicked()), this, SLOT(buttonClick()));
connect(button2, SIGNAL(clicked()), this, SLOT(buttonClick()));
button1.setObjectName("1");
button2.setObjectName("2");

void……

有个错误:第二个YourWidget::dochangeValue1() 改为 YourWidget::dochangeValue2()

#17


这么多好心人回帖,看帖子才30分,要咋分这30分啊

#18


建议使用QButtonGroup,
QPushButton的clicked()是不能带参数的,除非你把QPushButton继承出来重写

另外,可以尝试用QSignalMapper把无参数的信号变成有参数的信号

#1


在线等结果

#2


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

#3


引用 2 楼 haibin0109 的回复:
等的好急,有用~~~~~~~~·


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

你把所有重点都简化掉了,别人根本没办法回答。
 1. test类和 Draw类什么关系?
 2. test是不是QObject的派生类?
 3. test内有没有加Q_OBJECT?
 4. 。。。

#4


引用 3 楼 dbzhang800 的回复:
引用 2 楼 haibin0109 的回复:

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


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

你把所有重点都简化掉了,别人根本没办法回答。
 1. test类和 Draw类什么关系?
 2. test是不是QObject的派生类?
 3. test内有没有加Q_OBJECT?
 4……

不好意思,我的问题就是槽函数的传参问题,我的目的就是想把connect中Slot(1)中的1传给函数void Slot(int i)中的i,然后函数void Slot(int i)的通过i就可以用这个整数1,不知道这样错在哪里?

#5


引用 4 楼 haibin0109 的回复:
不好意思,我的问题就是槽函数的传参问题,我的目的就是想把connect中Slot(1)中的1传给函数void Slot(int i)中的i,然后函数void Slot(int i)的通过i就可以用这个整数1,不知道这样错在哪里?

呵呵,先熟悉信号槽的用法吧,你这儿完完全全错了。

#6


3. test内有没有加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))的写法,还真没见过你这种写法。

#8


引用 6 楼 foxyz 的回复:
3. test内有没有加Q_OBJECT?
这个很关键,你头文件都没写对。有自定义的slot或者signal,你的类得从QObject继承,同时在类的内部最前面加上Q_OBJECT
这个当然加了,只是想简化写,因为我只想知道关于槽函数传参的那个问题

#9


信号和槽不能带参数,你这SLOT(Slot(1))算是带参数了吧

#10


信号和槽不能带参数?


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 时发生访问冲突”
请问是什么原因哪!!!急急急!

#12


知道的请抽时间回复一下吧,网上搜了一大堆都没找到解决方法啊

#13


引用 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……


是信号和槽连接的时候不能直接传进去实际的参数,只能保持相同的参数类型
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)))
这样写就可以把参数传递出去了,我只是简单的举个例子,具体怎么实现还是看你自己多查资料了

#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


引用 15 楼 ailinty 的回复:
方法1:
connect(button1, SIGNAL(clicked()), this, SLOT(buttonClick()));
connect(button2, SIGNAL(clicked()), this, SLOT(buttonClick()));
button1.setObjectName("1");
button2.setObjectName("2");

void……

有个错误:第二个YourWidget::dochangeValue1() 改为 YourWidget::dochangeValue2()

#17


这么多好心人回帖,看帖子才30分,要咋分这30分啊

#18


建议使用QButtonGroup,
QPushButton的clicked()是不能带参数的,除非你把QPushButton继承出来重写

另外,可以尝试用QSignalMapper把无参数的信号变成有参数的信号