第一個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