QComboBox 信号未触发

QComboBox signal not trigged

我已经检查了我的代码好几次了,但我仍然不明白为什么它不起作用。 我使用 QComboBox 连接到 class 中的插槽,如下所示:

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)));

这部分代码定义的是我的 class MainWindows 的构造函数,在 main 中调用。头文件中的定义如下:

public:
    QComboBox* choixCam;
public slots:
    void selectCam(int choixCam);

我尝试从另一个信号成功 运行 插槽。

将信号与 QString 一起使用,激活信号(int)或尝试在网上查找示例均无效。 Signals/slots 机制也适用于 QButton 和 QSpinBox。

我运行不知道。一些帮助将不胜感激。 谢谢。

@eyllanesc 的回答应该有效。只需将 SLOT(this->selectCam(int)) 更改为 SLOT(selectCam(int)).

但是为什么QT不一样呢? 让我们看一下连接方法:

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 字符串来识别 qobject 的信号和槽。 这些字符串在某种字典中用作所有 qobject、信号和槽的关键字。 试试 std::cout << SIGNAL(some text) << std::endl; 看看 SIGNAL 和 SLOT 的作用。

这就是为什么即使没有 SIGNAL 和 SLOT 也可以调用 connect 的原因:

connect(this->choixCam, "2currentIndexChanged(int)", this, "1selectCam(int)");

现在你知道了 SLOT(this->selectCam(int)) 将生成 "1this->selectCam(int)" 作为关键字而不是 "1selectCam(int)"

使用 SIGNAL 和 SLOT 定义是因为大多数 IDE 禁用引号内的 C++ 自动完成,这使得编写正确的函数签名变得困难。