QObject::connect 未将信号连接到插槽

Bar*_*urt 5 c++ user-interface qt signals-slots

我在我的项目中使用 C++ 和 Qt,我的问题是 QObject::connect 函数没有将信号连接到插槽。我有以下课程:

class AddCommentDialog : public QDialog
{
    Q_OBJECT

public:
    ...some functions 

signals:
    void snippetAdded();

private slots:
    void on_buttonEkle_clicked();

private:
    Ui::AddCommentDialog *ui;
    QString snippet;
};
Run Code Online (Sandbox Code Playgroud)

我的主窗口的一部分:

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void commentAddedSlot();
    void variableAddedSlot();
    ...

private:
    AddCommentDialog *addCommentDialog;
    ...
};
Run Code Online (Sandbox Code Playgroud)

Ant 最后一个对话;

class AddDegiskenDialog : public QDialog
{
    Q_OBJECT

public:
    ...

signals:
    void variableAdded();

private slots:
    void on_buttonEkle_clicked();

private:
    Ui::AddDegiskenDialog *ui;
    ...
};
Run Code Online (Sandbox Code Playgroud)

在主窗口构造函数中,我连接信号和插槽:

addCommentDialog=new AddCommentDialog();
addDegiskenDialog=new AddDegiskenDialog();

connect(addDegiskenDialog, SIGNAL(variableAdded()), this, SLOT(variableAddedSlot()));
connect(addCommentDialog, SIGNAL(snippetAdded()), this, SLOT(commentAddedSlot()));
Run Code Online (Sandbox Code Playgroud)

关键是我的 commentAddedSlot 成功连接到它的信号,但 commentAddedSlot 失败。有 Q_OBJECT 宏,没有警告,例如没有 x 插槽。除此之外,receivers(SIGNAL(snippetAdded())) 给了我 1 但receivers(SIGNAL(variableAdded())) 给了我 0 并且我使用了命令 qmake -project; qmake 和 make 完全编译。我错过了什么?

tro*_*ane 3

快速查看您的代码不知道您的问题是什么。

但是,这里有一些时刻:

  1. 正如迈克在这里所说:出现连接问题时,请务必检查控制台是否有有关连接失败的消息。由于 Qt 在运行时之前无法判断连接是否有意义,因此它会通知您连接失败。你可能认为它会崩溃,但它只是在控制台中悄悄地说出这些内容。使用 Qt,始终观看控制台是有意义的。Qt 打印出各种错误消息,当您遇到问题时可以为您提供帮助。
  2. 您可以控制connect函数的结果,所以(来自官方文档)

    如果该函数成功将信号连接到槽,则返回 true。如果它无法创建连接,例如,如果 QObject 无法验证信号或方法是否存在,或者它们的签名不兼容,它将返回 false。

  3. 检查您的对象(对话框)是否创建良好并且指针不等于NULL

  4. 尝试清除您的项目(QtCreator 中的“清除项目”命令),甚至手动删除所有ui_*, moc_*. 然后重新编译就可以了。

祝你好运!请给我们反馈。

  • 在我的 Qt 信号槽清单中,我还有:使用 *Qt Creator* 自动完成“SIGNAL”和“SLOT”宏。如果它不能做到这一点,那么代码中就有问题。还消除了拼写错误,否则只能在运行时捕获。 (2认同)