91. 關于QList隊列的處理中,我們最常用的就是調用append函數添加item,往前插入item很多人第一印象就是調用insert(0,xxx)來插入,其實QList完全提供了往前追加item的函數prepend、push_front。
```cpp
QStringList list;
list << "aaa" << "bbb" << "ccc";
//往后追加 等價于 append
list.push_back("ddd");
//往前追加 等價于 prepend
list.push_front("xxx");
//往后追加
list.append("ddd");
//往前追加
list.prepend("xxx");
//指定第一個位置插入 等價于 prepend
list.insert(0, "xxx");
//輸出 QList("xxx", "aaa", "bbb", "ccc", "ddd")
qDebug() << list;
```
192. Qt內置了一些QList、QMap、QHash相關的類型,可以直接用,不用自己寫個長長的類型。
```cpp
//qwindowdefs.h
typedef QList<QWidget *> QWidgetList;
typedef QList<QWindow *> QWindowList;
typedef QHash<WId, QWidget *> QWidgetMapper;
typedef QSet<QWidget *> QWidgetSet;
//qmetatype.h
typedef QList<QVariant> QVariantList;
typedef QMap<QString, QVariant> QVariantMap;
typedef QHash<QString, QVariant> QVariantHash;
typedef QList<QByteArray> QByteArrayList;
```
193. Qt的布局的邊距間隔,如果在沒有改動過的情況下,是會根據系統分辨率以及縮放比來決定對應的默認值,是變化的,比如在1080P分辨率是9px,在2K分辨率又變成了11px,所有你會發現你在1080P電腦編譯的程序,明明看到的是6px、9px,怎么到2K、4K分辨率下間隔和邊距就變得好大,如果要保持無論何種分辨率都一樣,你需要手動重新設置這些值,這里有個坑,比如默認是是9,你想其他分辨率也是9,你必須先把9改成其他值比如10,然后再改成9,這樣才表示真的改動,你直接9改成9是不會變化的,在屬性設計器中右側有個小箭頭恢復值的,也是灰色,只有加深顯示,并且出現了恢復默認值箭頭,才表示你確實是改過了值。
194. Qt對高分屏以及dpi縮放的支持越來越成熟,在Qt4時代默認的策略就是跟隨系統的縮放,從Qt5.6開始提供了 AA_EnableHighDpiScaling 的屬性設置開啟高分屏,到了5.14以后還可以指定縮放的策略 HighDpiScaleFactorRoundingPolicy 比如支持浮點數的縮放比而不是之前的整數倍,從Qt6開始默認永遠開啟了 AA_EnableHighDpiScaling 屬性,沒法取消。很多時候我們需要兩種模式,一種就是永遠不應用高分屏及縮放,一種就是自動應用高分屏及縮放。
```cpp
//永遠不應用高分屏及縮放
int main(int argc, char *argv[])
{
#if (QT_VERSION >=QT_VERSION_CHECK(5,0,0))
QApplication::setAttribute(Qt::AA_Use96Dpi);
#endif
#if (QT_VERSION >=QT_VERSION_CHECK(5,14,0))
QApplication::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::Floor);
#endif
QApplication a(argc, argv);
....
return a.exec();
}
//自動應用高分屏及縮放
//方法很多,綜合對比下來還是采用配置文件指定縮放策略最適中。
//新建qt.conf文件放到可執行文件同一目錄
[Platforms]
WindowsArguments=dpiawareness=0
//有時候想讓用戶去選擇何種策略,需要開啟高分屏的之后只需要將qt.conf文件放到可執行文件同一目錄即可,就算代碼中設置了不應用高分屏及縮放,也無效,也是優先取qt.conf文件的策略。
```
195. 關于QSS要注意的坑。
- qss源自css,相當于css的一個子集,主要支持的是css2標準,很多網上的css3的標準的寫法在qss這里是不生效的,所以不要大驚小怪。
- qss也不是完全支持所有的css2,比如text-align官方文檔就有說明,只支持 QPushButton and QProgressBar,務必看清楚。
- 有時候偷懶直接來一句 *{xxx},你會發現大部分是應用了,也有小部分或者極個別沒有應用,你可能需要在對應的窗體中 this->setStyleSheet() 來設置。
- qss的執行是有優先級的,如果沒有指定父對象,則對所有的應用,比如在窗體widget中 {color:#ff0000;} 這樣會對widget以及widget的所有子對象應用該樣式,這種問題各大Qt群每周都在上演,你會發現各種奇奇怪怪的異樣不正常,怎么辦呢,你需要指定類名或者對象名,比如 #widget{color:#ff0000;} 這樣就只會對widget對象應用該樣式,另一種寫法 QWidget#widget{color:#ff0000;},只想對窗體本身而不是子控件按鈕標簽等 .QWidget{color:#ff0000;} ,具體詳細規則參見官方說明。
- qss整體來說還是可以的,盡管有著有那的BUG,懷著包容的心對待它。
天一天遇到很多事情,下午靜下心來,編譯 QT/E 程序到ARM 設備上運行,今天就寫寫如何實現。
QT 編程擴展
一、編寫自定義的信號與槽
1、將上個實驗的目錄復制出另一份并改名為testmyqt-x11
[root@localhost uptech]# cp testqt-x11/ testmyqt-x11 -arf
[root@localhost uptech]# ls
QT4 hello testmyqt-x11 testqt-x11
[root@localhost uptech]#
2、編輯自己定義槽函數的頭文件myqt.h
包含ui_testx11.h 頭文件,繼承其控件類,定義自定義函數文件處理函數MyDlg,并添加自定義函數槽ShowInfo
即可。
[root@localhost testmyqt-x11]# ls
main.cpp testx11.ui
[root@localhost testmyqt-x11]#
手動編寫myqt.h
[root@vm-dev testmyqt-x11]# vi myqt.h
#ifndef __DLG_H__
#define __DLG_H__
#include <QDialog>
#include <ui_testx11.h>
class MyDlg : public QDialog
{
Q_OBJECT
public:
MyDlg;
public slots:
void ShowInfo;
private:
Ui::Form ui;
};
#endif
編輯myqt.cpp 文件進行函數功能實現
其中ShowInfo函數槽中定義改變textEdit 的內容為“Welcome to UP-TECH”
[root@vm-dev testmyqt-x11]# vi myqt.cpp
#include "myqt.h"
MyDlg::MyDlg
{
ui.setupUi(this);
QObject::connect(ui.pushButton, SIGNAL(clicked), this, SLOT(ShowInfo));
QObject::connect(ui.pushButton_2, SIGNAL(clicked), this, SLOT(close));
}
void MyDlg::ShowInfo
{
ui.textEdit->setHtml(QApplication::translate("Form", "<!DOCTYPE HTML PUBLIC
\"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
"p, li { white-space: pre-wrap; }\n"
"</style></head><body style=\" font-family:'Sans Serif'; font-size:10pt;
font-weight:400; font-style:normal;\">\n"
"<p align=\"center\" style=\" margin-top:0px; margin-bottom:0px; margin-left:0px;
margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\"
font-size:12pt; font-weight:600; color:#55aaff;\">Welcome to
UP-TECH</span></p></body></html>", 0, QApplication::UnicodeUTF8));
}
3、重新編輯main.cpp 函數
包含自定義頭文件并使用自定義的類對象進行QT 實現
[root@vm-dev testmyqt-x11]# vi main.cpp
#include <QApplication>
#include "myqt.h"
int main(int argc, char **argv)
{
QApplication app(argc, argv);
MyDlg *mydlg=new MyDlg;
return mydlg->exec;
}
查看當前目錄文件
[root@localhost testmyqt-x11]# ls
main.cpp myqt.cpp myqt.h testx11.ui
[root@localhost testmyqt-x11]#
全部源文件已經準備好,接下來使用QT/E 環境編譯程序(當然如果想在宿主機X11 環境下編譯該程序也可,只是更
改編譯器的qmake 工具即可,如上一個QT/X11 實驗)。
4、使用qmake –project 命令生成工程文件:
[root@localhost testmyqt-x11]# /usr/local/Trolltech/Qt-embedded-4.4.0/bin/qmake
-project
[root@localhost testmyqt-x11]# ls
main.cpp myqt.cpp myqt.h testmyqt-x11.pro testx11.ui
[root@localhost testmyqt-x11]#
5、使用qmake 生成Makefile 文件:
Makefile main.cpp myqt.cpp myqt.h testmyqt-x11.pro testx11.ui
[root@localhost testmyqt-x11]#
6、make 編譯程序
[root@localhost testmyqt-x11]# make
生成可執行程序testmyqt-x11
[root@localhost testmyqt-x11]# ls
Makefile main.o moc_myqt.o myqt.h testmyqt-x11 testx11.ui
main.cpp moc_myqt.cpp myqt.cpp myqt.o testmyqt-x11.pro ui_testx11.h
[root@localhost testmyqt-x11]#
可以使用file 查看文件屬性,以免與X11 程序混淆,如:
[root@localhost testmyqt-x11]# file testmyqt-x11
testmyqt-x11: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses
shared libs), for GNU/Linux 2.6.14, not stripped
[root@localhost testmyqt-x11]#
確保是ARM 處理器的ELF 可執行文件。
7、將其拷貝到上述過程搭建好的NFS 共享目錄:
[root@localhost testmyqt-x11]# cp testmyqt-x11
/UP-Magic6410/Trolltech/Qt-embedded-witheabi4.3.1-4.4.0/
二、在ARM 端運行程序測試:
1、啟動UP-Magic6410 實驗系統,連好網線、串口線。通過串口終端掛載宿主機實驗目錄。
[root@UP_6410 yaffs]# mountnfs 192.168.1.145:/UP-Magic6410 /mnt/nfs/
2、設置環境變量 (ARM 端)
進入QT/Embedded 實驗NFS 共享目錄Trolltech 中
[root@UP_6410 yaffs]# cd /mnt/nfs/Trolltech/Qt-embedded-4.4.0/
[root@UP_6410 Qt-embedded-4.4.0]# ls
bin include mkspecs translations
etc lib plugins
[root@UP_6410 Qt-embedded-4.4.0]#
根據此實驗目錄下的目錄進行ARM 端環境變量設置,如下:
[root@UP_6410 Qt-embedded-4.4.0]# export QTDIR=$PWD
[root@UP_6410 Qt-embedded-4.4.0]# export LD_LIBRARY_PATH=$PWD/lib
[root@UP_6410 Qt-embedded-4.4.0]# export TSLIB_TSDEVICE=/dev/event1
[root@UP_6410 Qt-embedded-4.4.0]# export TSLIB_PLUGINDIR=$PWD/lib/ts
[root@UP_6410 Qt-embedded-4.4.0]# export TSLIB_CONSOLEDEVICE=none
[root@UP_6410 Qt-embedded-4.4.0]# export TSLIB_CONFFILE=$PWD/etc/ts.conf
[root@UP_6410 Qt-embedded-4.4.0]# export POINTERCAL_FILE=$PWD/etc/ts-calib.conf
[root@UP_6410 Qt-embedded-4.4.0]# export QWS_MOUSE_PROTO=tslib:/dev/event1
[root@UP_6410 Qt-embedded-4.4.0]# export TSLIB_CALIBFILE=$PWD/etc/ts-calib.conf
[root@UP_6410 Qt-embedded-4.4.0]# export QT_QWS_FONTDIR=$PWD/lib/fonts
[root@UP_6410 Qt-embedded-4.4.0]# export
3、執行程序
[root@UP_6410 Qt-embedded-4.4.0]# ./testmyqt-x11 –qws –font unifont
觀察UP-Magic6410 型設備LCD 輸出QT 程序界面
備注:上訴提到的實驗源碼testmyqt-x11 已經在產品光盤中(/UP-Magic6410/SRC/gui/demo 目錄)提供,用戶可以省去編寫代碼時間。
實驗效果:
可以點擊相關按鈕,測試自定義信號槽的事件響應。
今天就寫這么多,希望明天能有好的心情,謝謝大家。
籍非常具有個人主觀性,編程類的書籍也不例外。但是不管書籍的風格,重點或者節奏如何,好的 C++ 編程書能帶讀者開啟一段引人入勝的旅程,拓展 C++ 語言的能力,向讀者展示如何使用C++來構建各種東西。
我精心挑選了一些 C++ 的書籍,這些書都非常值得一讀。我推薦的這 9 本書都是根據公共版權許可發行的書籍。在此之前,我先簡要介紹一下 C++。
C++ 是由Bjarne Stroustrup設計的,在1983年發布了第一個版本。它是一門靜態類型,通用的,可移植編程語言,形式自由,多范式,需要編譯。也因為它結合了高層次和低層次的語言特征,被認為是一種中級語言。C++ 專為系統和應用程序編程而設計,它對 C 語言進行了擴展,自增操作符記為++,因此叫 C++。
C++ 一直是一門備受歡迎編程語言。例如,它被大量地用于嵌入式系統、銀行和電信領域。它是 C 語言的超集,保留了 C 語言的效率和便利的符號標記,同時提供更強大的類型檢查,多繼承,數據抽象,異常處理,運算符重載,泛型編程和面向對象編程的功能。C++ 對許多其他語言產生了影響,包括 C#、Java 以及 C 語言的發展。
《Boost C++ 類庫》(The Boost C++ Libraries)
作者 Boris Sch?ling,570 頁
Boost C++庫在C++世界中有非常重要的影響力。這些便攜式的庫為諸多任務和結構提供了支持,包括多線程,容器,字符串和文本處理,迭代器,線性代數,偽隨機數生成,元程序設計模板,并發程序設計,數據結構,圖像處理,正則表達式和單元測試等。 Boost幾乎可以用于任何現代操作系統,包括Linux和Windows的衍生版本,同時也支持大多數現代編譯器。
本書介紹了72個非常實用的Boost庫,這些庫涵蓋的范圍非常廣,可以幫助程序員更容易地管理內存和處理字符串。這些庫還提供了擴展標準庫的多種容器和其他數據結構,使用這些庫可以輕松地構建獨立于平臺的網絡應用程序。
本書是值得添加到各類收藏的好東西。書里的430個代碼示例很好地闡明了這些庫的功能。
書中章節對內存管理,字符串處理,容器,數據結構,算法,通信,流和文件以及時間等問題進行了研究。稍后的章節繼續探討了函數,并行性和泛型編程問題。在結尾覆蓋了大量有關語言擴展,錯誤信息以及數字處理,應用程序庫,設計模式和其他庫等內容。
Boost C++庫是根據Creative Commons Attribution – NonCommercial – NoDerivatives 4.0國際許可證發布的。如果您喜歡隨身攜帶書籍,可以在Amazon上購買紙質版。電子版也可以在kindle上購買,電子書和 PDF 格式都可以。如果你想學習C/C++可以來這個群,首先是三三零,中間是八五九,最后是七六六,里面有大量的學習資料可以下載。
《C++注解》(C++ Annotations)
作者 Frank B. Brokken,1029 頁
本書提供了有關C++編程語言的全方位教程,可以用作C ++編程課程的教科書。它適用于熟悉C語言或者類似C語言語法的用戶。
包括以下章節:
命名空間
字符串——C語言提供了基本的字符串支持
I/O字節流——提供了基于類概念的輸入/輸出(I / O)庫
類——C針對不同類型數據結構提供了兩種方法。 C結構體保存各種類型的數據成員,C聯合體也定義了各種類型的數據成員。本章介紹了另外一種結構——類,與結構體不同的是,類成員默認是私有的
靜態數據和函數
內存管理——用C++語言描述內存分配的運算符
異?!试SC++程序執行受控的非本地返回命令,彌補了非局部跳轉(longjmp)和設置局部跳轉(setjmp)函數的缺點
運算符重載——通用的運算符重載
抽象容器
繼承——派生的另一個術語。本章演示了基類指針可能用于指向派生類對象
多態——繼承的一種特殊形態
友元——介紹friend關鍵字及其使用原則
成員指針——定義指向成員的指針及其使用,靜態成員指針和指針長度
嵌套類——在嵌套類與其外圍類具有緊密概念關系的情況下使用
標準模板庫(STL)——由容器,通用算法,迭代器,函數對象,分配器,適配器和數據結構組成的通用庫。這些算法使用的數據結構是抽象的,可以與(實際上)任何數據類型一起使用
泛型算法——涵蓋STL的通用算法
函數模板——探討模板的句法特性。介紹了模板類型參數,模板非類型參數和函數模板的概念,并提供了多個模板示例
類模板——討論構建和使用類模板
高級模板使用——簡要介紹模板元編程的主要特征和與模板相關的細微之處
這本書有HTML,PDF,PostScript和Txt格式。它可以自由分發,并根據GNU通用公共許可證的條款發布。
《通過Qt4 介紹C++中的設計模式》(Introduction to Design Patterns in C++ with Qt 4, An)
作者 艾倫·尤斯特(Paul Ezust), 656頁
本書首先介紹C++基本組成,面向對象的概念,UML(統一建模語言)和核心Qt類。進而轉向更高層次的編程思想,Qt模型和設計模式。最后一部分嚴謹地印證了C++的重要特性,完整地覆蓋了函數,繼承和多態性方面的內容。
該書旨在用于大學課程,面向沒有C或C ++編程經驗的讀者,還為教學工作者提供了Qt示例,練習,解決方案和授課幻燈片。
這本書是Bruce Perens開源系列的一部分。 本系列的所有圖書均以Open Publication License V1.0或更新版本發布。
《如何像計算機科學家一樣思考(C++篇)》(How to Think Like a Computer Scientist: C++)
作者Allen B. Downey,191頁
《如何像計算機科學家一樣思考》C++版本是一本簡潔文雅的介紹如何使用C++編程語言進行軟件設計的書。本書從最基本的概念開始,以閱讀者容易接受的速度逐漸增添新內容,旨在把沒有編程經驗的讀者培養成未來的開發人員。
本書的主要內容:
變量,表達式和語句
函數
條件和遞歸
豐富的函數
迭代
字符串
向量
成員函數
對象向量
向量對象
類和不變量
文件輸入/輸出和apMatrixes
本書是一本免費的C++版教科書,根據Creative Commons Attribution-NonCommercial 3.0 未本地化協議發布。
《基于Qt3的C++ 圖形界面編程》(C++ GUI Programming with Qt 3)
作者 Jasmin Blanchette,Mark Summerfield,464頁
Qt的最新穩定版本是5.8。 本書指導讀者如何使用Qt 3編寫圖形界面程序,Qt 3最近一個版本的是在2004年發布,但是有很多這本書對于Qt 4和Qt 5用戶來說仍然是有意義的。
本書需要讀者對C++有基本的了解,這不是一本面向初學者的書。
本書向讀者介紹了使用Qt編寫圖形界面應用程序的所有概念和實踐,對核心問題進行了詳細周密的講解,還提供一些專業前沿的學習資料。
這本書是Bruce Perens開源系列的一部分。本系列的所有圖書均以Open Publication License V1.0或更新版本發布的。
《開放式數據結構( C++版)》(Open Data Structures (in C++))
作者 Pat Morin,336頁
本書講授了基本的數據結構設計和分析及在C ++中的實現。它涵蓋了序列(列表),隊列,優先級隊列,無序字典,有序字典以及圖的數據結構的實現和分析。作者意圖在于為計算機科學專業的學生提供一條研究數據結構的免費途徑。但是本書不是一本介紹C++編程語言或C++標準模板庫的書,但是它有助于程序員了解STL數據結構如何實現以及為什么這些實現是高效的。
書中章節涵蓋了基于數組的列表,鏈表,分級鏈表,哈希表,二叉樹(包括隨機二叉搜索樹,替罪羊樹和紅黑樹)。稍后的章節介紹了堆,排序算法(基于比較,計數排序和基數排序),圖,整型數據結構和外存搜索。
這本書是根據知識共享署名許可頒發的。我們可以免費閱讀這本書的HTML,PDF版本,本書的LaTeX版本,Java / C ++ / Python源碼可以從GitHub下載。還有平裝版購買。本書已被翻譯成斯洛文尼亞語和土耳其語。
《使用wxWidgets跨平臺GUI編程》(Cross-Platform GUI Programming with wxWidgets)
作者 Julian Smart,Kevin Hock與Stefan CsomorBrifll,744頁
wxWidgets是一個流行的C++庫,它允許開發人員使用單一的代碼庫為Windows,Mac OS X,Linux和其他平臺創建應用程序。它支持各種圖形庫。
本書的簡要介紹和入門章節涵蓋了以下內容:
事件處理
窗口基礎
繪圖
輸入事件處理
使用sizers窗口布局
使用標準對話框
創建自定義對話框
圖像編程
剪貼板和拖放
高級窗口類
數據結構類
文件和流
內存管理,調試和錯誤檢查
編寫國際化應用
編寫多線程應用程序
wxSocket編程
處理文檔和視圖
完善你的應用程序
這本書是Bruce Perens開源系列的一部分。本系列的所有圖書均以Open Publication License V1.0或更新版本發布。
《Rook的C++指南》(The Rook’s Guide to C++)
作者 Jeremy Hansen,160頁
書中的章節涵蓋變量,文本,常量,輸出輸入,數據類型和轉換,條件判斷(if,else和else if,switch語句),字符串,循環,數組,塊,函數和作用域。之后的章節對解決問題和問題定位進行了講述,包括預處理器,高級算法,文件I / O,指針,動態數據,類和抽象,編譯分離和STL。
這本書的大部分內容是由25位諾維奇大學的學生在一個黑客馬拉松周寫的,雖然不夠完美,但還是一本不錯的書。 它是根據基于Creative Commons Attribution-NonCommercial-ShareAlike 3.0.協議發布許可證發布的,也可以從亞馬遜購買紙質版。
《GCC概述》(An Introduction to GCC)
作者 Brian Gough,144頁
本書主要介紹了 GNU C 和 C++編譯器:gcc 和 g ++。二者都是GNU編譯器集合(GCC)的一部分。
書中如何使用編譯器本身。作者根據多年來在郵件列表上發表的問題,引導讀者直接了解到GCC最重要的部分。
本書章節包括:
簡介
編譯C程序——介紹如何使用gcc編譯C程序。程序可能由單個源文件或多個源文件中編譯而成,也可以使用系統庫和頭文件
編譯選項——描述了GCC中可用編譯器中常見的其他選項。這些選項對應不同的功能,例如用于設置庫和所包含文件的搜索路徑,配置額外的警告和診斷信息,預處理器宏和C語言
使用預處理器——描述了GCC包內的GNU C預處理器cpp的使用,預處理器在源文件編譯之前擴展了宏。當GCC處理C或C ++程序時,預處理都會自動調用
編譯調試——提供-g調試選項,用于在目標文件和可執行文件中存儲附加的調試信息。這些調試信息可以將錯誤信息從特定的機器指令追溯到原始源文件中相應的行
編譯優化——GCC是一個優化編譯器。它提供了很多選項,旨在提高其生成的可執行文件的速度或減小文件大小
編譯C ++程序——描述了如何使用GCC編譯用C ++編寫程序,以及針對于該語言的命令行選項
平臺特定選項——介紹常見平臺的一些可用選項,如Intel和AMD x86選項,x86擴展選項,x86 64位處理器選項,DEC Alpha選項,SPARC選項,POWER / PowerPC選項,多體系架構支持以及浮點相關問題
疑難解答(問題定位)——GCC提供了幾個幫助和診斷選項,來幫助用戶定位編譯過程中的問題
與編譯器相關的工具——描述了很多與GCC結合使用的工具,包括用于創建庫的GNU歸檔器ar,以及GNU性能和覆蓋測試程序,gprof和gcov
編譯器如何工作——對GCC如何將源文件轉換為可執行文件進行了更詳細地描述。編譯是一個多階段的過程,涉及多個工具,包括GNU編譯器本身(通過gcc或g++前端),GNU 匯編器as和GNU 鏈接器ld。在編譯過程中使用的一套完整工具集稱為工具鏈
檢查編譯后的文件——描述了多種有用的工具,用于檢查可執行文件和目標文件的內容
常見錯誤消息——描述 gcc和g ++生成的最常見的錯誤和警告消息。每個案例都附有錯誤和警告信息產生原因的描述,以及相應的例子和可能的解決方案和建議
獲取幫助——如果讀者遇到簡介里未涉及的問題,還有多種參考手冊更詳細地描述了GCC和語言相關的主題
*請認真填寫需求信息,我們會在24小時內與您取得聯系。