2013-11-25 32 views
3

我正在嘗試使用我自己的cmake文件而不是隨附的qmake .pro文件來編譯Qt中的音頻記錄器示例,並且我正在接收以下錯誤:Qt/CMake:在標識符'slots'`之前缺少':'

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

我CMakeFile:

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) 

audiorecorder.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編譯得很好)。

回答

5

你的問題是最有可能的

add_definitions(-DQT_NO_KEYWORDS) 

在cmake的文件中包含。

+2

事實上,當定義'-DQT_NO_KEYWORDS'時,必須使用'Q_SLOTS'而不是'slots','Q_SIGNALS'而不是'signals'。 –

0

在Qt中「slot」是一個特殊的宏。在正常的過程中,首先調用MOC(元對象編譯器),將「slot」解釋爲C++編譯器可以理解的一些代碼。我想在.pro文件中有一些代碼在將文件提供給C++編譯器之前調用MOC。總而言之,您必須首先調用MOC,否則C++編譯器會投訴「slot」。

+1

MOC用於生成額外的源文件。它對程序員製作的源代碼的影響爲零。這聽起來像是程序中的某處,宏的'slots'已經在某處被取消了,或者你的源在Qt頭文件定義了宏之前正在被處理。 – RobbieE

+0

關鍵字'slots'在C++代碼中什麼也不做,所以它不影響編譯器。另一方面,'signals'就像'protected'一樣,但是也會在mocing過程中添加特殊的實現。更大的問題可能是'爲什麼使用CMake而不是qmake?' – Zaiborg

+0

我認爲Qt5的'CMAKE_AUTOMOC'會自動爲你做cmake。這不是一個qt項目。我只需要使用它的一些庫。該圖書館將在稍後的道路上被取代。我們想要有工作功能來首先演示。感謝您的評論和答案。 – swtdrgn