Qt没有在简单的示例程序中找到插槽

时间:2014-05-20 05:32:24

标签: qt

这是一个无法运行的简单示例。运行时错误是:

QObject::connect: No such slot Bridge::setText(const QString& text)
QObject::connect: No such slot QLabel::setText(const QString& text)

我有两个文件,main.cpp和Bridge.h。

的main.cpp

#include <QtWidgets>
#include "Bridge.h"

int main(int argc, char ** argv)
{
  QApplication app (argc, argv);

  QWidget widget;
  QLineEdit * lineEdit = new QLineEdit;
  QLabel * label = new QLabel;

  QVBoxLayout * layout = new QVBoxLayout;
  layout->addWidget(lineEdit);
  layout->addWidget(label);
  widget.setLayout(layout);

  Bridge * bridge = new Bridge ("", &app);

  QObject::connect(
    lineEdit, SIGNAL(textChanged(const QString &)),
    bridge, SLOT(setText(const QString & text))
  );

  QObject::connect(
    bridge, SIGNAL(textChanged(const QString &)),
    label, SLOT(setText(const QString & text))
  );

  widget.show();

  return app.exec();
}

Bridge.h

#include <QString>
#include <QObject>

class Bridge : public QObject
{
  Q_OBJECT

public:
  Bridge(const QString & text, QObject * parent = 0) : QObject(parent), text(text) {}

  const QString & getText() const;
  int getLengthOfText() const;

public slots:
  void setText(const QString & text) {
    if (this->text == text) {
      return;
    }
    this->text = text;
    emit textChanged(text);
  }

signals:
  void textChanged(const QString &);

private:
  QString text;
};

.pro文件

######################################################################
# Automatically generated by qmake (3.0) Sat May 17 20:28:07 2014
######################################################################

TEMPLATE = app
TARGET = qtbox
INCLUDEPATH += .
INCLUDEPATH += headers

QT += widgets

# Input
HEADERS += headers/Bridge.h

SOURCES += sources/main.cpp

######################################################################
# Build to custom directories
######################################################################

release: DESTDIR = build/release
debug:   DESTDIR = build/debug

OBJECTS_DIR = $$DESTDIR/.obj
MOC_DIR = $$DESTDIR/.moc
RCC_DIR = $$DESTDIR/.qrc
UI_DIR = $$DESTDIR/.ui

我错过了一些明显的东西吗?我可以提出一些随机的事情:

  1. 我是否需要在.cpp文件中定义setText?如果是这样,为什么我必须这样做?
  2. 空白是一个问题吗?即QString& vs QString &
  3. 我在qmake文件中遗漏了什么?

1 个答案:

答案 0 :(得分:3)

  1. 不,你没有。但这样做很常见,特别是如果你需要改变你的实现;您不必重新编译包含该头文件的所有文件。

  2. 不,两者都有效。

  3. 不,qmake文件似乎也有效。

  4. 更改您的连接调用不是变量,而只是类型:

    connect(bridge, SIGNAL(textChanged(QString)), label, SLOT(setText(QString)));
    

    编辑:此外,#include <QLabel>最终手动运行qmake一次。