当插槽确实存在时,Qt连接“没有这样的插槽”

时间:2012-05-18 16:38:25

标签: qt signals-slots

Qt v4.8.0,VC2010编译器

我有一个基于QMainWindow的课程,我正在尝试向其发送涉及QUuid的信号

但是,每次运行它都会出现错误:

Object::connect: No such slot MainWindow::on_comp_connected(QUuid) in ..\..\src\mainwindow.cpp:143
Object::connect:  (receiver name: 'MainWindow')

由于插槽肯定存在(它在moc _中),这让我变得便利了

class MainWindow : public QMainWindow
{
Q_OBJECT

// SNIP private typedefs

public:
    MainWindow(QWidget *parent = 0, Qt::WFlags flags = 0);
    ~MainWindow();
// SNIP public methods

signals:
   void testSendQuuid(const QUuid &qcid);

public slots:
   void on_comp_connected(const QUuid &qcid);

private:
// SNIP private parts

QOpenAcnController *acnInt;  // This is where the signal comes from

};

MainWindow构造函数的末尾(提到的第143行)我有:

connect(acnInt, SIGNAL(callback_comp_connected(QUuid)),
        this, SLOT(on_comp_connected(QUuid)));

鉴于moc_mainwindow.cpp中的插槽肯定是(我检查过它的插槽#1),究竟是什么原因可以阻止连接发生?

如果我尝试将testSendQuuid(QUuid)信号连接到插槽,我就没有这样的信号,也没有这样的插槽。

我不能为我的生活弄清楚为什么Qt否认存在绝对存在的插槽!

4 个答案:

答案 0 :(得分:5)

我通过在mainwindow类中添加Q_OBJECT宏来解决问题。

答案 1 :(得分:4)

检查moc_mainwindow.cpp中是否有Build Path。或者您正在使用其他一些moc_window.cpp文件。因为,对于例如:在QtCreator中,它将源构建到新的构建目录。如果您尝试在其他位置打开源,它也会使用旧的moc_cpp文件。

我想说的是您检查的moc文件可能包含那些插槽定义,但编译器可能正在使用之前创建的其他moc文件。

答案 2 :(得分:0)

你需要

connect(acnInt, SIGNAL(callback_comp_connected(QUuid)),         this, SLOT(on_comp_connected(const QUuid&))); 

传递值不应匹配传递const引用。

但我尝试了它,确实如此。我在Windows上使用Qt 4.7.4在QtCreator 2.4.1上创建了一个最小项目。我在主窗口中添加了一个标签,并修改了MainWindow.cpp,如下所示

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    connect(
      this, SIGNAL(testSendQuuid(QUuid)),
      this, SLOT(on_comp_connected(QUuid))
    );
    QUuid x = QUuid::createUuid();
    emit testSendQuuid(x);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_comp_connected(const QUuid &qcid)
{
    ui->label->setText(qcid.toString());
}

我在主窗口上找到了一个uuid。

我还尝试将连接中的两个QUuid参数更改为const QUuid&这也有效。

所以你的问题必须与构建相关。

答案 3 :(得分:0)

我解决了这样的问题

private slots:
    void on_comp_connected(const QUuid &qcid);

然后在构造函数中

connect(tabWidget, SIGNAL(currentChanged(int)), this, SLOT(on_comp_connected(QUuid)));