【问题标题】:Qt/CMake: missing ':' before identifier 'slots'`Qt/CMake:在标识符“插槽”之前缺少“:”
【发布时间】:2013-11-25 05:32:03
【问题描述】:

我正在尝试使用我自己的 cmake 文件而不是它附带的 qmake .pro 文件从 Qt 编译录音机示例,我收到以下错误:

qtaudiorecorder\audiorecorder.h(63) : error C2146: syntax error : missing ':' before identifier 'slots'

我的 CMake 文件:

find_package(Qt5 REQUIRED COMPONENTS multimedia widgets)
set(CMAKE_AUTOMOC ON)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
find_package(Qt5Widgets REQUIRED)
find_package(Qt5Multimedia REQUIRED)
add_definitions(-DQT_NO_KEYWORDS)

add_executable(audio_recorder audiorecorder.cpp main.cpp qaudiolevel.cpp qaudiolevel.h audiorecorder.h audiorecorder.ui audiorecorder_small.ui)
qt5_use_modules(audio_recorder Widgets Multimedia)

录音机.h:

#ifndef AUDIORECORDER_H
#define AUDIORECORDER_H

#include <QMainWindow>
#include <QMediaRecorder>
#include <QUrl>

QT_BEGIN_NAMESPACE
namespace Ui { class AudioRecorder; }
class QAudioRecorder;
class QAudioProbe;
class QAudioBuffer;
QT_END_NAMESPACE

class AudioRecorder : public QMainWindow
{
    Q_OBJECT

public:
    AudioRecorder(QWidget *parent = 0);
    ~AudioRecorder();

public slots:
    void processBuffer(const QAudioBuffer&);

private slots:
    void setOutputLocation();
    void togglePause();
    void toggleRecord();

    void updateState(QMediaRecorder::State);
    void updateProgress(qint64 pos);
    void displayErrorMessage();

private:
    Ui::AudioRecorder *ui;

    QAudioRecorder *audioRecorder;
    QAudioProbe *probe;
    bool outputLocationSet;

};

#endif // AUDIORECORDER_H

我不知道为什么我不能用我的 cmake 文件编译 Qt 示例(它可以用 qmake 编译)。

【问题讨论】:

    标签: c++ windows qt cmake qmake


    【解决方案1】:

    您的问题很可能是包含

    add_definitions(-DQT_NO_KEYWORDS)
    

    在您的 cmake 文件中。

    【讨论】:

    • 确实,在定义-DQT_NO_KEYWORDS时,必须使用Q_SLOTS而不是slotsQ_SIGNALS而不是signals
    【解决方案2】:

    在 Qt 中,“slot”是一个特殊的宏。在正常的过程中,首先会调用MOC(meta object compiler),将“slot”解释成一些c++编译器可以理解的代码。我认为 .pro 文件中有一些代码会在将文件提供给 c++ 编译器之前调用 MOC。

    总而言之,你必须先调用MOC,否则C++编译器会报错“slot”。

    【讨论】:

    • MOC 用于生成额外的源文件。它对程序员制作的源代码的影响为零。这听起来像是在您的程序某处宏 slots 已在某处被 undeffed,或者在 Qt 标头定义宏之前正在处理您的源代码。
    • 关键字slots 在c++ 代码中没有任何作用,因此它不会影响编译器。另一方面,signalsprotected 类似,但也会在 mocing 过程中添加特殊实现。更大的问题可能是“为什么使用 CMake 而不是 qmake?”
    • 我以为 Qt5 的 CMAKE_AUTOMOC 会自动为你做 cmake。这不是一个 qt 项目。我只需要使用它的一些库。该库将在以后被替换。我们希望首先演示有效的功能。感谢 cmets 和答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多