1. 程式人生 > >第一個Qt&C++開發專案所遇到的坑

第一個Qt&C++開發專案所遇到的坑

以後該博文將作為UP主日常Qt問題、Bug解決方案的彙報提交基地(手動滑稽)

前言

最近接受了一個利用Qt控制元件和C++程式碼聯合開發的小專案,功能是實現點選相應的按鈕跳轉對應的exe或者dll檔案,並對任意尺寸的螢幕進行適配。期間遇到了許多小坑,寫出來和大家分享一下,maybe以後就用得上了,也算對自己一個總結。

1、中文亂碼問題

網上有很多相應的方法,比如說設定utf-8一類的,如果嘗試了諸多方法還是不行,可以嘗試下面的方法:
在main函式中包含標頭檔案

#include <QTextCodec>

然後再main函式體中加入以下程式碼:

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QTextCodec *codec = QTextCodec::codecForName("UTF-8");
    QTextCodec::setCodecForTr(codec);
    QTextCodec::setCodecForLocale(QTextCodec::codecForLocale());
    QTextCodec::setCodecForCStrings(QTextCodec::codecForLocale());
MyApplication w; w.show(); return a.exec(); }

2、對控制元件設定setStyleSheet

很多時候我們需要對Label或者是Widget進行背景圖設定,方法很多,但是最好用的就是setStyleSheet,程式碼如下:

QLabel * bottom_car_label_ = new QLabel(this);                      
bottom_car_label_->setStyleSheet("border-image:url(:/Resources/home_image/car.png);background-repeat:no-repeat;background-position: center;background-color:rgb(88,76,141,0);"
);

1)border-image是對載入的圖片進行拉伸。如果你的控制元件不是對應比例,那麼會導致圖片失真。
2)url(:/Resources/home_image/car.png)這個是用的qrc檔案資源管理器。代表的是當前專案Resources資料夾—>home_image資料夾—>car.png圖片
3)下面三個一起說,都是對控制元件一些屬性的設定,repeat代表是重複,詳情大家可以參考文件;position代表的是對齊方式,center就是居中,以此類推;最後一個設定顏色,前三個是rgb的整數值,最後一個是透明度。
background-repeat:no-repeat;
background-position: center;
background-color:rgb(88,76,141,0);

值得注意的是,如果要是對QWidget使用了setStyleSheet,那麼對於載入在該QWidget的QWidget如果也設定背景圖片,會導致背景圖片不能顯示。
處理的方法就是重寫該QWidget的paintEvent方法,並在方法里加入下面的程式碼既可以避免這樣的情況:

void MyApplication::paintEvent(QPaintEvent * event)
{
    //使用setStyleSheet的QWidget要重寫他的paintEvent,防止子檢視展現不出來
    QStyleOption opt;  
    opt.initFrom(this);  
    QPainter p(this);  
    style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);  
    QWidget::paintEvent(event);
}

3、最大化最小化視窗方法

不同於MFC,Qt設定視窗最大化和最小化的方法非常簡單,程式碼如下:

//關閉視窗
QPushButton *close_button_ = new QPushButton(this);
    /*
    各種自定義設定
    */

//將按鈕的點選事件作為訊號傳送,並連線QWidget的close()槽函式既可關閉視窗
    connect(close_button_, SIGNAL(clicked()), this, SLOT(close()));


QPushButton*    min_button_ = new QPushButton(this);
/*
    各種自定義設定
    */

//將按鈕的點選事件作為訊號傳送,並連線自己寫的showMinimizedClick()槽函式
    connect(min_button_, SIGNAL(clicked()), this, SLOT(showMinimizedClick()));

//showMinimizedClick()槽函式內容如下:
//最小化
void MyApplication::showMinimizedClick()
{
    this->showMinimized(); 
}

4、當前專案開啟其他的exe檔案或者是dll檔案

開發過程中,我們需要進行對exe檔案和dll檔案進行開啟操作,具體的實現步驟如下:
1)需要將專案生成的exe檔案和計劃開啟的檔案放置於同一個資料夾下。
2)在需要的類中包含標頭檔案

//開啟檔案路徑標頭檔案
#include <QProcess>

3)在軟體中實現以下程式碼:

QString program = QCoreApplication::applicationDirPath()+tr("/exp7n_Car.dll");

            QProcess *process = new QProcess(this);
            this->hide();

            if ( -2 == process->execute( program, param ) )
            {
                QMessageBox msg( QMessageBox::Warning, QString::fromWCharArray(L"提示"),
                    QString::fromWCharArray(L"無法開啟通用軟體!")+program, QMessageBox::Ok ); 
                msg.exec();
            }

            this->show();

其中的QCoreApplication::applicationDirPath()獲取的就是你生成的exe檔案的路徑。

總結

雖然坑很多,但是踩過去就是一種成長,希望對看這篇文章的朋友們有一定的幫助吧。

2018-08-10更新

近日在搞Qt和OC混編過程中遇到了2個新出現的問題,分享出來以作總結。也希望對看到文章的人有所幫助。

1、QTCreator構建套件錯誤的問題

QTCreator在第一次啟動時會掃描系統變數,並在系統變數中查詢編譯器、QT版本、偵錯程式以及Qmake,並將結果儲存在配置檔案中,並且再次啟動時不會重新掃描並更改這些設定。
當編譯器等發生變化時,需要將QTCreator的配置檔案刪除以強制其在啟動時重新掃描系統環境,並重新設定構建套件的相關配置。如果重新設定了Qt的編譯器內容,QtCreator提示構建套件錯誤,可以刪除這些預設配置重新執行,錯誤的構建套件就會被移除了。(通過Qt內部貌似不能直接移除預設生成的構建套件)
PS:QTCreator的配置檔案存放位置為:C:\Users\%USERNAME%\AppData\Roaming\QtProject。

2、Qt在Xcode升級後,原有程式碼編譯不過的問題解決

起因:iMac在升級系統後,Xcode自動升級為9.4.1最新版本。QtCreator在執行qmake時報錯。
問題描述:
error: 'TargetConditionals.h' file not found;"# include <TargetConditionals.h>"
解決方案:
1、開啟下列路徑/Users/imac/Qt5.8.0/5.8/clang_64/mkspecs。找到目錄下的qdevice.pri
2、如果有!host_build:QMAKE_MAC_SDK = macosx這類,請修改為!host_build:QMAKE_MAC_SDK = macosxXX.XX。XX.XX為當前Xcode的MacSDK的版本。
3、MacSDK版本檢視方式為:
開啟路徑/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs,檢視SDKs下的版本路徑

例如當前系統的版本為11.13,那麼步驟2需要修改為:!host_build:QMAKE_MAC_SDK = macosx11.13
然後再執行qmake和編譯就沒有問題了。

原因:Xcode升級後,Qt5.8原有連線的SDK升級為其他版本的SDK,這就導致了舊的Qt編譯的框架在新的Xcode路徑中找不到對應的SDK,上述解決方案本質上就是告訴Qt要連結的庫發生了修改,找不到就連線指定的SDK。理論上同步更新最新的Qt版本也可以解決問題(未測試。。。)

相關推薦

一個Qt&C++開發專案遇到的

以後該博文將作為UP主日常Qt問題、Bug解決方案的彙報提交基地(手動滑稽) 前言 最近接受了一個利用Qt控制元件和C++程式碼聯合開發的小專案,功能是實現點選相應的按鈕跳轉對應的ex

Qt開發】01-一個Qt程序Hello World!

LL庫 label push 方式 dll 自動生成 一個 widget 圖片 一:說在前頭 我的第一份工作是做生產工具,當時用的MFC,IDE是VC6.0,現在想想真是古董級別,10年至今,微軟也一直沒有對MFC進行升級, 冥冥中感覺微軟自己都放棄MFC了,市場上貌似

我的一個python web開發框架(2)——一個簡單的小外包

span 技術 進行 target 最好 自己 blog height 描述   第一部分說明   第一部分大概有20來章,主要講的是一些開發常識、開發前中後期準備內容、開發環境與服務器部署環境安裝設置、python基礎框架結構與功能等內容,代碼會比較簡單。   

我的一個python web開發框架(4)——數據庫結構設計與創建

數據結構 描述 分析器 設置 一個 由於 logs 記錄 開發框架   小白做好前端html設計後,馬上開始進入數據庫結構設計步驟。      在開始之前,小白回憶了一下老大在公司裏培訓時講過的數據庫設計解說:   對於初學者來說,很多拿到原型時不知道怎麽設計數據表結

我的一個python web開發框架(5)——開發前準備工作(了解編碼前需要知道的一些常識)

turn 框架 strong pep8 加密與解密 python開發 lan 二次 沒有   中午吃飯時間到了,小白趕緊向老菜坐的位置走過去。   小白:老大,中午請你吃飯。   老菜:哈哈...又遇到問題了吧,這次得狠狠宰你一頓才行。   小白:行行行,只要您賞臉,

我的一個python web開發框架(15)——公司介紹編輯功能

getcwd 轉義 導航菜單 unicode 存儲路徑 -c 序號 管理 bsp   完成登錄以後,就會進入後臺管理系統的主界面,因為這個是小項目,所以導航菜單全部固化在HTML中,不能修改。一般後臺還會有一個歡迎頁或關鍵數據展示的主頁面,小項目也沒有多大的必要,所以登錄後

我的一個python web開發框架(16)——產品分類管理

計算 添加按鈕 _for records 操作 qq群 api 回復 derby   產品分類管理的html頁面之前忘記做了,這次附件裏補上。   好了先上圖      從頁面效果圖來看,我們需要開發列表獲取接口、添加接口、單條記錄獲取接口、編輯接口和刪除接口   

我的一個python web開發框架(18)——前臺頁面與接口整合

ont 成功 讀取數據 pad images int 服務器 tps 替換   由於我們前後臺系統沒有分開,所以前臺頁面調用接口時,可以直接使用後臺管理系統已經完成的接口,不過後臺管理系統接口的訪問加上了登錄驗證,所以需要將前臺要用到的接口進行處理,讓它們設置到白名單當中

我的一個python web開發框架(21)——小結

線上 天下 謝謝 應用 log 增加 頁面 管理員 封裝   這個小網站終於成功上線,小白除了收獲一筆不多的費用外,還得到女神小美的贊賞,心中滿滿的成就感。這一天下班後,他請老菜一起下館子,兌現請吃飯的承諾,順便讓老菜點評一下。   小白:老大,在你的指導下終於完成了我人

搞清楚ourhdr.h是什麽及運行一個UNIX C程序

和我 pan 哪裏 char col 函數庫 oot 文件 style 好多人開始學;UNIX 環境高級編程這本書時;看到書裏面說的頭文件ourhdr.h而找不到她在哪裏;而且無法開始繼續學習;其實這個就是系統的內核標準頭文件; 而她的位置在:/usr/include/un

我的一個python web開發框架(24)——系統重構與ORM

內容 版權 質量 重寫 很多 掌握 orm .... 最重要的   小白弄完代碼版本管理和接口文檔後,興奮的找到老菜。   小白:老大,我已經按你講的要求,將代碼版本管理和接口文檔都搞好了。從項目開始到現在,除了代碼編寫,感覺學會好多東西啊。   老菜:嗯嗯,實戰確實需

我的一個python web開發框架(33)——後臺管理系統權限設計

style 頁面 失效 限制 路由 前後端分離 也會 其他 自己   框架底層和接口終於改造完成了,小白再次找到老菜。   小白:老大,上次你對後臺權限系統簡單的講了一下,我一點頭緒都沒有,現在有空完整的說一說嗎?   老菜:說到權限系統,要講明白真不容易,權限系統並不

我的一個python web開發框架(37)——職位管理功能

內容 修改 根據 直接 manage 表數 部分 pytho sel   對於職位管理,我們可以理解它為角色權限的管理,就像前面所說的一樣,有了職位管理,後臺管理系統綁定好對應的權限以後,新進員工、離職或崗位調整,管理員操作起來就非常的便捷了,只需要重新綁定對應職位就可以做

認識一個gradle管理的專案

xl_echo編輯整理,歡迎轉載,轉載請宣告文章來源。更多IT、程式設計案例、資料請聯絡QQ:1280023003 百戰不敗,依不自稱常勝,百敗不頹,依能奮力前行。——這才是真正的堪稱強大!! 通過一鍵生成並執行成功之後,我們迫切需要的就是認識gradle專案的結構,瞭解

Idea建立一個gradle管理的專案

xl_echo編輯整理,歡迎轉載,轉載請宣告文章來源。更多IT、程式設計案例、資料請聯絡QQ:1280023003,加群298140694。百戰不敗,依不自稱常勝,百敗不頹,依能奮力前行。——這才是真正的堪稱強大!!! 開啟Idea,直接點選新建 這裡我們為了掩飾方便直接使

建立一個Qt Quick Application

1、建立工程 2、 mainc.pp原始碼 #include <QGuiApplication> #include <QQmlApplicationEngine> int main(int argc, char *argv[]) { QGuiAppli

構建一個SSH的maven專案

  環境配置: eclispe  maven版本:3.3.9 本地倉庫位置:  在C:\apache-maven-3.3.9\conf\settings.xml,需要配置好本地倉庫的路徑。 c盤目錄下的本地倉庫 一:新建Maven專案 因為是w

Asp.net core實戰4: 建立你的一個Asp.net core專案

我們劃分為四個步驟建立你的第一個專案: 1.根據官方提供的模板生成一個專案 2.使用NuGet修復所缺少的第三方庫 3.Build你的專案 4.Run你的專案   第一步:建立專案(請自行下載安裝Asp.net core SDK 2.0及Visual Studio2

django專案問題總結

2. 關於設定static靜態檔案,樣式失效問題 原因: 可能開啟多個埠號,頁面顯示訪問的不是已經設定了static的模板,所以,樣式沒有顯示   3. models模型中gender欄位的選擇設定 choice = [ (1, '男'), (2, '女') ] gender = mo

我的一個python web開發框架(39)——後臺介面許可權訪問控制處理

1 @get('/api/main/menu_info/') 2 def callback(): 3 """ 4 主頁面獲取選單列表資料 5 """ 6 # 獲取當前使用者許可權 7 session = web_helper.get_ses