Qt的安裝和使用中的常見問題(詳細版)


對於太長不看的朋友,可參考Qt的安裝和使用中的常見問題(簡略版)

目錄


## 1、引入 對於Qt的初學者來說,Qt有很多不熟悉的地方,安裝和使用時,都會遇到各種各樣的“坑”。這些坑,如果經歷過一次,就會發現其實是很簡單的問題。但是如果不熟悉,那么可能折騰很久也沒解決。因此我把我自己遇到的(也是后來常常被問到的)一些問題放在這里,供大家參考、討論。

這個版本寫得詳細一些,適合喜歡了解細節的朋友。對於太長不看的朋友,可參考Qt的安裝和使用中的常見問題(簡略版)

## 2、Qt簡介 Qt是一款基於C++的跨平台開發框架,不僅提供了便捷好用的圖形庫,而且提供的框架比C++本身更好用(個人感覺)。

Qt和QtCreator
有些人可能會把Qt和QtCreator弄混,但是這兩個是不同的概念。

  • Qt:跨平台開發框架,包括圖形庫、其他功能庫(多媒體、網絡等)以及對C++的擴展。
  • QtCreator:專為使用Qt框架開發的集成開發環境(IDE)。QtCreator本身基於Qt框架開發的。

QtCreator不是Qt,它運行起來只需要部分Qt庫,所以QtCreator能運行,根本不代表Qt所有模塊已經被完整安裝了。

## 3、Qt版本 開發時經常涉及Qt版本問題,因為最新的版本可能提供更多的功能,但是有些以前的代碼是用舊版本寫的,因此要特別注意自己的版本。

### 3.1 查看安裝的Qt版本

一般情況下,你下載了比如說Qt 5.8的安裝包,安裝之后,Qt的版本自然是5.8。但是,假如你安裝了多個版本的Qt,情況就復雜一點。事實上,你可以在QtCreator選擇對當前的項目使用哪個版本的Qt來構建。

下面是查看Qt版本的方法:

菜單欄 -> 工具(Tools) -> 選項(options)

左側邊欄里,選中“構建與運行(Build & Run)”,然后注意看右側上部的標簽,有構建套件(kit)、Qt版本(Qt Versions)、編譯器(compiler)、調試器(Debugger)等。

構建套件指的是一些用來構建你編寫的代碼的工具組合。這個組合里主要包括三個東西:qmake工具、編譯器、調試器。

不同的組合就是不同的構建套件。你可以看到你的默認套件是哪個。當你打開一個之前沒有打開過的Qt項目,或者新建一個Qt項目時,QtCreator都會讓你選擇一個套件,而默認的就是這里顯示的默認套件。

點擊任意一個套件,就能看到詳情:

這里,注意其中有一項叫做Qt版本(Qt version)。可以看到,我這里的是Qt5.8。

這就意味着,當你使用這個套件的時候,你使用的Qt版本是5.8。當然,這個套件的名字里寫了是5.8.0,不過要注意的是,手動設置的套件名字可以任意取,所以還是要點進去確認一下。

我這里就裝了兩個版本的Qt,分別是5.7和5.8,所以這里能看到另一個套件對應的Qt版本是5.7。

前面說了,這個套件是一個組合,不一定就包含了你的計算機上所有的Qt版本。怎么知道計算機上有哪些Qt版本可用呢?

這就需要切換到Qt版本(Qt Versions)頁面了。

這里就能看到所有已經自動檢測到的,或者手動配置的Qt版本。細心的朋友已經發現了,每一個Qt版本后面,對應的是一個qmake.exe(Linux下沒有后綴,就是qmake)。

沒錯!決定你所使用的Qt版本的就是qmake工具的版本!Qt項目一般都是用qmake來管理的(按照默認配置新建Qt項目,就是這樣),而每次構建之前,qmake都會執行,其中有個重要的任務就是告訴后續的編譯器,應該用哪個版本Qt庫來編譯這些程序。

所以,前面說的套件里的Qt版本,其實就是這個套件使用的qmake的版本。而套件里的編譯器和調試器等等,與你使用的Qt版本關系不大。

### 3.2 查看當前項目使用的Qt版本 有個項目的代碼最初打開的時候沒留意用的套件和版本,或者代碼是從別人那里拷貝過來的,我怎么知道是用的哪個版本呢?

方法很簡單!在QtCreator里打開這個項目,然后在最左側的欄目里,切換到項目(Project)

因為QtCreator版本不同,所以你的界面可能跟我不一樣。不過沒關系,關鍵東西都在。找到Build & Run,然后就能看到這個項目正在使用的是什么套件以及什么Qt版本了。

例如,我這個項目使用的構建套件名稱是Qt 5.8.0 (mingw53_32),對應的Qt版本是5.8.0。

### 3.3 查看當前項目使用的QtCreator版本 前面說了Qt和QtCreator是不同的。Qt有版本,QtCreator作為一款軟件也有版本。在QtCreator菜單 -> 幫助 -> 關於QtCreator就可以查看了。

例如這里,我的QtCreator的版本是4.2.1,是基於Qt5.8.0開發的。

### 3.4 Linux命令行下查看和使用不同版本的Qt 如果在Linux命令行下使用,例如編譯一些簡單程序或第三方庫,可以不需要啟動QtCreator,直接在命令行中編譯。這種情況,一般要求先執行```qmake```,再執行```make```。而執行```qmake```時就決定了使用哪個版本的Qt,要特別注意。

所以在不確定的情況下,應該使用qmake -v來查看Qt版本。如果執行之后發現版本不對,想用其他版本。那么需要找到你想用的版本對應的qmake執行文件在哪里。這個會復雜一些,下面簡單說一下。

1、如果安裝了多個版本的Qt,用find指令或者其他方式搜索qmake執行文件,並且檢查一下搜索到的qmake分別對應什么版本的Qt。注意針對搜索到的qmake,使用時要帶完整路徑,例如

$ sudo find / -name qmake # 查找名為qmake的文件
/home/XYZX/Qt5.8.0/5.8/gcc_64/bin/qmake # 這個是舉例
$ /home/XYZX/Qt5.8.0/5.8/gcc_64/bin/qmake -v # 查看某個找到的qmake是什么版本

之后如果要使用這個特定的qmake,那么編譯的時候不能只輸入qmake了,而是要有完整路徑,和上面查看版本的時候一樣:

$ /home/XYZX/Qt5.8.0/5.8/gcc_64/bin/qmake
$ make

2、設置默認的qmake
注意:我給出的目錄是我的情況,並非通用,不同系統上的路徑可能不同,但是大同小異,也可以通過搜索查看。

默認的qmake就是在命令行里直接輸入qmake時使用的。用which qmake可以看到對應的文件是/usr/bin/qmake
ls -l /usr/bin/qmake指令可以發現這個其實是個連接,指向的是/usr/bin/qtchooser。也就是由這個“選擇器”來選擇版本的。選擇的依據是配置文件。
該配置文件是:/usr/lib/x86_64-linux-gnu/qt-default/qtchooser/default.conf。而進一步可以發現此文件仍然只是一個鏈接,如果要修改默認qmake,則需要修改此鏈接指向的具體文件。
例如,我的電腦上,該文件指向的是/usr/share/qtchooser/qt4-x86_64-linux-gnu.conf
等等……我還在用Qt4?不不不……不要被文件名騙了,一定要打開文件查看一下!以下是我電腦上/usr/share/qtchooser/qt4-x86_64-linux-gnu.conf的內容:

/home/xyzx/Qt5.8.0/5.8/gcc_64/bin
#/usr/lib/x86_64-linux-gnu/qt4/bin
#/usr/lib/x86_64-linux-gnu
#/home/xyzx/Qt5.8.0/5.8/gcc_64/bin/qmake

不出意外的話,#開頭的都是注釋。那么有效的就是第一句話了,看來用的/home/xyzx/Qt5.8.0/5.8/gcc_64/bin里的qmake,其實是Qt5.8.0版本。
而與這個文件同級目錄下(即/usr/share/qtchooser/)還可能有其他的同類文件。確認要使用哪個配置文件后,將鏈接/usr/lib/x86_64-linux-gnu/qt-default/qtchooser/default.conf指向這個文件即可,例如

sudo ln -sf /usr/share/qtchooser/qt4-x86_64-linux-gnu.conf /usr/lib/x86_64-linux-gnu/qt-default/qtchooser/default.conf

再次提醒:我這里寫的目錄可能跟你的實際情況不同。

## 4、Qt模塊 Qt框架是由多個模塊構成的。最核心的是QtCore,也是必須的。如果不使用這個核心模塊,那其實是在用純C++編程,跟Qt無關了。其他模塊還有: + GUI 圖形界面 + Multimedia 多媒體 + Network 網絡功能 + SQL 數據庫 這里只列舉了部分。

在使用Qt編程時,有兩個常見問題。

問題1:
用QtCreator打開項目時提示:Unknown module(s): XXXX

原因:提示的那個Qt模塊,你電腦上沒有安裝。一般是在Linux上通過apt來安裝Qt,之后發現這個問題。因為你沒有安裝所有Qt模塊。正如前面所說的,不是說QtCreator能運行,就意味着你的Qt裝完整了。
解決辦法就是安裝這個模塊。如果使用apt或synaptic安裝軟件包,如何查找呢?對於Qt5版本,Qt模塊的軟件包名稱有規律,都是libqt5開頭的,后面跟模塊名稱。例如Qt5核心模塊的軟件包是libqt5core5a,GUI模塊的軟件包是libqt5gui5。后面可能會跟不同后綴。
有一個例外(就我目前遇到的),是multimedia。除了剛才說的包之外,你可能還需要安裝qtmultimedia5-dev

對於缺少模塊的情況,一般安裝libqt5+模塊名的包就可以了。安裝完成后需要重新打開QtCreator。
如果安裝完后還是不行,那么可以將名稱相關的包都安裝試試。

問題2:
引用一個Qt的頭文件,結果提示:No such file or directory: QXXXX.h

原因:你沒有在你的項目里引入這個模塊。
解決方法很簡單,在.pro文件中加入這個模塊。添加位置是開頭的QT += ...后面。例如,你想引用QTcpServer.h,首先在幫助里查找QTcpServer類,看到它屬於network模塊,再引入這個模塊。如果QtCreator里打不開幫助,也可以在網頁上搜索,因為Qt官方網站提供了幫助文檔。

例如這一行原本如下,表示使用了core和gui兩個模塊。

QT       += core gui

新增network模塊:

QT       += core gui network

注意:全小寫,用空格與之前的隔開。

## 5、引用頭文件報錯 **問題1**:引用一個自己的頭文件,.h文件已經存在於項目文件夾里了,但是編譯時報錯:No such file or directory: XXXX.h 原因:文件沒有加入項目。去.pro文件里查看,這個頭文件是否已經加入到headers列表里。如果沒有加入的話,也不用自己敲鍵盤把文件名寫到列表里,直接對項目名點擊鼠標右鍵,再點擊“添加已有文件”,選擇報錯的文件(包括沒有加入sources列表的cpp文件)。

問題2:引用一個頭文件,.h文件存在且已經加入項目,但是編譯時還是報錯:No such file or directory: XXXX.h
問題:引用路徑錯誤。對於一些復雜一點的項目,不同功能的代碼是放在不同的文件夾下的。引用時確保寫上了頭文件的相對路徑。你在哪里引用就相對於誰。

例如,有一個頭文件位於/project/function/function1.h,而此時你編輯的文件是/project/ui/mywindow.h,那么引用時的寫法是:#include "../function/function1.h"

另外,.pro文件里可以加入一個INCLUDEPATH += ,可以自定義引用搜索路徑。如果在.pro文件里寫入了

                            function \
                            ui

那么,在項目的任何文件里,引用/project/function/function1.h或者/project/ui/mywindow.h時,都可以直接寫#include "function1.h"#include "mywindow.h"



謝謝關注
未完待續


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM