2012-05-18 59 views
4

的Qt v4.8.0,VC2010编译Qt的连接“没有这样的插槽”当插槽肯定是存在的

我有一个基于的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 

}; 

在主窗口的构造函数(自提线143)我的结尾:

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

鉴于插槽绝对有在moc_mainwindow.cpp(我查了一下,它的槽#1),有什么在地球上可能会阻止连接发生?

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

我不能为了我的生活找出为什么Qt否认存在一个最肯定有

+0

你已经尝试过'干净','运行qmake','build'序列吗?有时候Qt生成的'make'文件会变得混乱。 –

+0

是的,我试过的第一件事! 我曾经有过几次qmake或moc感到困惑(通常是在将一个类提升为一个QObject后代时,它以前不是)。在这种情况下,它没有任何区别。 – Richard1403832

+0

那些私人typedefs是什么? –

回答

4

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

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

+0

就是这样 - 不知怎的,一个额外的moc_ *。cpp已经在构建输出文件夹而不是moc文件夹中结束了,clean并没有删除它。 – Richard1403832

+0

这个干净的步骤通常不会清除这些moc文件,例如:当您从另一个系统中导出项目并在系统中执行clean步骤时,就像那样。 – ScarCode

+0

因此,如果我在我的vuild目录中有一个moc_maindwindow.cpp文件,这是导致此错误的原因?或者如果不在那里?你不太清楚。我有同样的问题,我在我的生成文件夹中有一个moc_mainwindow.cpp。所以我应该删除它,还是应该没事,因为它在那里? – dhein

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 &,这也起作用。

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

+0

嗯,会尝试。当然听起来似乎合理。 奇怪的是Qt Creator会自动完成不正确的。 – Richard1403832

+1

这不是。他们对连接的签名进行“归一化”,将常量引用转换为值,因为两者是兼容的。 – cgmb

+0

我确定你可以连接它们,但你确定moc会匹配它们吗? – Julian

2

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

相关问题