当前位置: 代码迷 >> QT开发 >> QT槽函数传参有关问题
  详细解决方案

QT槽函数传参有关问题

热度:75   发布时间:2016-04-25 04:37:32.0
QT槽函数传参问题
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);
  请问槽函数怎么才能传参,求解决方法?

------解决方案--------------------
我写的第一个程序
#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 时发生访问冲突”
请问是什么原因哪!!!急急急!
------解决方案--------------------
引用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)))
这样写就可以把参数传递出去了,我只是简单的举个例子,具体怎么实现还是看你自己多查资料了
------解决方案--------------------

方法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
}
方法二够恶心的吧?但是能做到你要做到事情。。。。飘过!!! 淡定。。。
  相关解决方案