QComboBox信号未触发

时间:2017-07-28 15:24:05

标签: c++ qt signals-slots

我已经多次检查过我的代码,但我仍然无法理解为什么它无法正常工作。 我使用连接到类中插槽的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。

我已经没想完了。一些帮助将非常感激。 谢谢。

1 个答案:

答案 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)

https://github.com/qt/qtbase/blob/e4c39d5e1e7ee8c2bba273e6d613ec519b7fa9c2/src/corelib/kernel/qobject.cpp#L2659

并且在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 ++自动完成,这使得编写正确的函数签名变得很困难。