使用Qt進行程序開發時QtCreator總是不二之選。作為老牌IDE在提供了強大的功能同時也對Qt的支持做了許多優化。如果沒有特別的原因你應該使用它。
然而一個順手的工具將會極大得提升生產效率,而如果你之前使用別的工具進行開發,那么就要斟酌一下學習使用QtCreator的成本了。
所以我將介紹配置CLion(另一個強大的c++ IDE)作為Qt5的開發環境,在利用現有工具鏈的同時避免了安裝另一個大型軟件。
准備工作
CLion的安裝和激活超出了本文的討論范圍,我們假設你已經安裝好了CLion。如果需要幫助可以去CLion官網查找安裝方法。
CLion默認使用GCC進行工程構建,然而使用GCC是無法使用代碼補全功能的,所以我們將toolchains替換成clang:
注意,CLion自帶了一個cmake,如果我們想使用系統提供的一些cmake模塊,那么就必須如圖所示替換為系統的cmake。
隨后確保你的編譯器至少要支持c++11,如果能支持c++14或者c++17那自然是最好。
創建Qt5項目
下面是創建Qt5項目,CLion沒有區分普通c++項目和Qt項目(畢竟Qt項目一般也是c++項目或者c++/QML項目),所以這樣創建即可:
創建完成后項目結構如圖所示:
cmake-build-release
目錄是生成moc等工具的中間代碼以及可執行文件的地方,當然可執行文件的生成路徑可以自己指定,這是CLion默認的選項。
這時編譯運行和代碼補全還是不能用的,所以接下來我們設置編譯和代碼補全。
設置Qt代碼補全和項目編譯
事先要說明的一點是,CLion是根據CMakeLists.txt
文件來組織和設置項目的,所以如果我們需要添加諸如Qt這樣的第三方庫或是改變編譯行為,都只要修改CMakeLists.txt
即可。
所以我們需要把CMakeLists.txt
修改成如下的樣子:
cmake_minimum_required(VERSION 3.0)
project(test)
# 指定c++標准的版本
set(CMAKE_CXX_STANDARD 17)
# 自動調用moc,uic,rcc處理qt的擴展部分
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTORCC ON)
# 設置Qt5的cmake模塊所在目錄,如果不設置將使用系統提供的版本
# QT_DIR和QT_VERSION是指定了qt安裝目錄和版本的環境變量
# 如果你使用了系統的cmake,那么會優先使用系統提供模塊,因為cmake會優先搜索CMAKE_SYSTEM_PREFIX_PATH
# 如果你不想讓cmake優先搜索系統目錄(會導致編譯使用系統安裝的qt而不是我們配置的),需要提示find_package命令
set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} $ENV{QT_DIR}/$ENV{QT_VERSION}/gcc_64/lib/cmake)
# 找到對應的qt模塊,名字為qmake中QT += <name>中的name首字母大寫后加上Qt5前綴
# 例如core為QtCore,你也可以去${CMAKE_PREFIX_PATH}的目錄中找到正確的模塊名
# 如果不想使用系統qt,這樣寫(注意NO_DEFAULT_PATH參數,它會讓find_package跳過系統目錄的查找):
find_package(Qt5Widgets REQUIRED NO_DEFAULT_PATH)
# 如果你想要使用系統自帶的qt,這樣寫:
# find_package(Qt5Widgets REQUIRED)
# 將當前目錄的所有源文件添加進變量
aux_source_directory(. DIRS_SRCS)
# 通常這樣設置就可以,如果你的項目包含qrc文件,那么需要將它們單獨添加進來
# 例如add_executable(test ${DIRS_SRCS} resources.qrc)
add_executable(test ${DIRS_SRCS})
# 把對應Qt模塊的庫鏈接進程序
target_link_libraries(test Qt5::Widgets)
值得注意的是,使用系統提供的Qt的一個好處是編譯出來的程序可以使用系統的樣式和主題,但缺點是版本可能會與我們想使用的不一致從而產生錯誤。
修改之后點擊圖中的Reload changes
:
CLion會自動生成新的Makefile用於編譯項目,現在代碼補全也可以使用了。
編譯項目
我們先寫一個小的示例,讓一個spinbox和slider可以相互聯動:
#include <QApplication>
#include <QFormLayout>
#include <QtGlobal>
#include <QObject>
#include <QSlider>
#include <QSpinBox>
#include <QWidget>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
auto window = new QWidget;
auto spinBox = new QSpinBox;
spinBox->setRange(0, 100);
auto slider = new QSlider;
slider->setRange(0, 100);
QObject::connect(spinBox,
// 對於重載函數需要給出確定的版本,QOverload需要編譯器支持c++11
QOverload<int>::of(&QSpinBox::valueChanged),
slider,
&QSlider::setValue);
QObject::connect(slider,
&QSlider::valueChanged,
spinBox,
&QSpinBox::setValue);
auto layout = new QFormLayout;
layout->addRow("spin box:", spinBox);
layout->addRow("slider:", slider);
window->setLayout(layout);
window->show();
return app.exec();
}
然后我們點擊int main(...)
左側的運行按鈕:
程序就開始編譯了:
如果編譯成功程序就會自動運行:
至此CLion已經可以正常配合Qt進行開發。