Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Qt/CMake:缺少';:';标识符前';插槽'`_C++_Windows_Qt_Cmake_Qmake - Fatal编程技术网

C++ Qt/CMake:缺少';:';标识符前';插槽'`

C++ Qt/CMake:缺少';:';标识符前';插槽'`,c++,windows,qt,cmake,qmake,C++,Windows,Qt,Cmake,Qmake,我正在尝试使用自己的cmake文件而不是随附的qmake.pro文件从Qt编译音频录制器示例,我收到以下错误: qtadiorecorder\audiorecorder.h(63):错误C2146:语法错误:标识符“slots”之前缺少“:” 我的CMAKE文件: find_package(Qt5 REQUIRED COMPONENTS multimedia widgets) set(CMAKE_AUTOMOC ON) set(CMAKE_INCLUDE_CURRENT_DIR ON) find

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

qtadiorecorder\audiorecorder.h(63):错误C2146:语法错误:标识符“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
#如果没有录音机#
#定义录音机
#包括
#包括
#包括
QT_开始名称空间
命名空间Ui{class AudioRecorder;}
QAudioRecorder类;
QAudioProbe类;
QAudioBuffer类;
QT_END_名称空间
类录音机:公共QMainWindow
{
Q_对象
公众:
录音机(QWidget*parent=0);
~AudioRecorder();
公众时段:
void processBuffer(constqaudiobuffer&);
专用插槽:
void setOutputLocation();
void togglePause();
void toggleRecord();
void updateState(QMediaRecorder::State);
void updateProgress(qint64位置);
void displayErrorMessage();
私人:
用户界面::录音机*Ui;
QAudioRecorder*录音机;
QAudioProbe*探头;
布尔输出定位集;
};
#endif//AUDIORECORDER\u H
我不明白为什么我不能用我的cmake文件编译Qt示例(它可以用qmake很好地编译)。

在Qt中,“slot”是一个特殊的宏。在正常过程中,首先调用MOC(元对象编译器),将“时隙”解释为C++编译器可以理解的一些代码。我想,在.C++文件中有一些代码在调用C++编译器之前调用MOC。p>
总之,你必须先调用MOC,否则C++编译器会在“槽”上抱怨。

< P>你的问题很可能包含

add_definitions(-DQT_NO_KEYWORDS)

在您的cmake文件中

MOC用于生成额外的源文件。它对程序员制作的源代码的影响为零。这听起来像是在程序中的某个地方,宏>代码>时隙< /代码>已经被代码> unDFF <代码> FED,或者在QT头定义宏之前,你的源被处理。关键字>代码>时隙< /C>在C++代码中什么也不做,所以它不影响编译器。另一方面,代码>信号类似于受保护的,但也会在移动过程中添加特殊的实现。更大的问题可能是“为什么要使用CMake而不是qmake?”我认为Qt5的
CMake_AUTOMOC
会自动为CMake做这件事。这不是一个qt项目。我只需要使用它的一些库。那座图书馆以后将被替换。我们希望先演示工作功能。感谢您的评论和回答。事实上,在定义
-DQT\u NO\u关键字
时,必须使用
Q\u插槽
而不是
插槽
Q\u信号
而不是
信号