10

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

4 回答 4

9

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

于 2016-10-12T07:38:15.470 回答
6

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

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

于 2012-05-18T17:17:21.423 回答
1

我解决了这样的问题

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

然后在构造函数中

connect(tabWidget, SIGNAL(currentChanged(int)), this, SLOT(on_comp_connected(QUuid)));
于 2020-08-27T08:38:46.370 回答
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& 并且也可以。

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

于 2012-05-18T17:22:05.057 回答