QObject::connect无法将信号连接到槽函数

5

我在我的项目中使用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;
};

我的主窗口的一部分:
class MainWindow : public QMainWindow
{
    Q_OBJECT

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

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

private:
    AddCommentDialog *addCommentDialog;
    ...
};

最后一个对话框;

class AddDegiskenDialog : public QDialog
{
    Q_OBJECT

public:
    ...

signals:
    void variableAdded();

private slots:
    void on_buttonEkle_clicked();

private:
    Ui::AddDegiskenDialog *ui;
    ...
};

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

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

connect(addDegiskenDialog, SIGNAL(variableAdded()), this, SLOT(variableAddedSlot()));
connect(addCommentDialog, SIGNAL(snippetAdded()), this, SLOT(commentAddedSlot()));

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


你尝试过在Qt Creator中点击Build -> Run qmake并清理、重新构建你的项目吗? 你的输出窗口显示了什么? - Daniel Castro
是的,我尝试过了,但没有解决。我在槽函数中使用 qDebug() 进行打印,但它们并没有被信号调用。 - Barış Akkurt
我刚刚使用了你的代码,连接工作正常。可能还有其他问题。你是否稍后重新初始化了 addDegiskenDialog - Dave Mateer
请查看https://dev59.com/_V8d5IYBdhLWcg3wzEz4#26422155。 - Silicomancer
1个回答

3

仅查看您的代码无法确定您的问题。

但是,这里有一些要点:

  1. 正如Mike在这里所说:出现连接问题时,总是确保检查控制台是否有有关连接失败的消息。由于Qt无法判断连接是否合理直到运行时,因此会在那里通知您发生了错误。你会认为它会崩溃,但它只是在控制台中安静地说出这些话。
  2. 您可以控制connect函数的结果,因此(根据官方文档)

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

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

  4. 尝试清除项目(在QtCreator中使用“清除项目”命令),甚至手动删除所有ui_*moc_*。然后重新编译。

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


2
在我的Qt信号槽清单中,我还包括:使用Qt Creator自动完成SIGNALSLOT宏。如果它无法完成,则代码可能有问题。这也可以消除拼写错误,否则只能在运行时捕获。 - hyde
使用Qt::DirectConnection进行测试,检查线程是否存在问题。 - JustMaximumPower
感谢您的建议。这是反馈信息: 1-控制台没有警告显示没有这样的插槽或类似的内容。 2-我打印了connect函数的结果。两个连接都返回true,这意味着信号已连接到插槽。 3-我的对话框对象不为空。我用if(addDegiskenDialog==NULL)进行了测试。 4-我清理了项目。即使我删除了所有构建目录,但错误仍然存在。 - Barış Akkurt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接