我已经多次检查过我的代码,但我仍然无法理解为什么它无法正常工作。 我使用连接到类中插槽的QComboBox,如下所示:
this->choixCam = new QComboBox;
this->choixCam->addItem("Camera 1");
this->choixCam->addItem("Camera 2");
this->choixCam->addItem("Camera 3");
this->choixCam->addItem("All cameras");
QObject::connect(this->choixCam, SIGNAL(currentIndexChanged(int)), this, SLOT(this->selectCam(int)));
这个代码的前一部分定义的是我的类MainWindows的构造函数,在main中调用。头文件中的定义如下:
public:
QComboBox* choixCam;
public slots:
void selectCam(int choixCam);
我尝试成功地从另一个信号中运行插槽。
使用带有QString的信号,激活信号(int)或尝试在网上找到一个例子并不起作用。信号/插槽机制也适用于QButton和QSpinBox。
我已经没想完了。一些帮助将非常感激。 谢谢。
答案 0 :(得分:-1)
@eyllanesc答案应该有效。只需将SLOT(this->selectCam(int))
更改为SLOT(selectCam(int))
。
但为什么QT不一样呢? 让我们看一下connect方法:
QMetaObject::Connection QObject::connect(const QObject *sender, const char *signal,const QObject *receiver, const char *method,
Qt::ConnectionType type)
并且在SIGNAl和SLOT定义中:
#define SLOT(a) "1"#a
#define SIGNAL(a) "2"#a
QT使用c字符串来识别qobjects的信号和插槽。
这些字符串在所有qobjects,信号和插槽中用作某种字典中的关键字。
只需尝试std::cout << SIGNAL(some text) << std::endl;
即可查看SIGNAL和SLOT的功能。
这就是为什么即使没有SIGNAL和SLOT也能调用连接:
connect(this->choixCam, "2currentIndexChanged(int)", this, "1selectCam(int)");
现在你知道了
SLOT(this->selectCam(int))
会生成"1this->selectCam(int)"
作为关键字而不是"1selectCam(int)"
使用SIGNAL和SLOT定义是因为大多数IDE在引号内禁用C ++自动完成,这使得编写正确的函数签名变得很困难。