Qt開發經驗小技巧151-155

  1. 當Qt中編譯資源文件太大時,效率很低,或者需要修改資源文件中的文件比如圖片、樣式表等,需要重新編譯可執行文件,這樣很不友好,當然Qt都給我們考慮好了策略,此時可以將資源文件轉化爲二進制的rcc文件,這樣就將資源文件單獨出來了,可在需要的時候動態加載。
//Qt中使用二進制資源文件方法如下
//將qrc編譯爲二進制文件rcc,在控制檯執行下列命令 
rcc -binary main.qrc -o main.rcc
//在應用程序中註冊資源,一般在main函數啓動後就註冊
QResource::registerResource(qApp->applicationDirPath() + "/main.rcc");
  1. 關於設置字體,大概都會經歷一個誤區,本來是打算設置整個窗體包括子控件的字體大小的,結果發現只有主窗體自己應用了字體而子控件沒有。
//假設窗體中有子控件,默認字體12px,父類類型是QWidget,父類類名是Widget

//下面幾種方法只會設置主窗體的字體,子控件不會應用,需要按個調用setFont
QFont font;
font.setPixelSize(20);
this->setFont(font);
this->setStyleSheet("{font:26px;}");
this->setStyleSheet("QWidget{font:26px;}");
this->setStyleSheet("Widget{font:26px;}");

//下面纔是通過樣式表設置整個控件+子控件的字體
this->setStyleSheet("font:26px;");
this->setStyleSheet("*{font:26px;}");
this->setStyleSheet("QWidget>*{font:26px;}");
this->setStyleSheet("Widget>*{font:26px;}");

//下面設置全局字體
qApp->setFont(font);
  1. Qt中封裝的QImage異常的強大,提供了各種圖片格式的轉換,還可以對每個像素的顏色值進行替換,有時候我們需要將單色的圖片換成另外一種顏色,要注意的是如果帶有透明值的顏色需要進行格式轉化,比如轉成Format_ARGB32或者Format_RGBA8888。
//pixel      函數獲取像素點的顏色 setPixel      函數設置像素點的顏色 此函數任意Qt版本都有
//pixelColor 函數獲取像素點的顏色 setPixelColor 函數設置像素點的顏色 此函數Qt5.6以後纔有
//pixel函數取出來的是QRgb格式需要用 qRed qGreen qBlue qAlpha 進行轉換
QImage image("1.png");
image = image.convertToFormat(QImage::Format_ARGB32);
int width = image.width();
int height = image.height();
//遍歷圖像的每一個像素
for (int x = 0; x < width; ++x) {
    for (int y = 0; y < height; ++y) {
        QString name = image.pixelColor(x, y).name();
        //將白色以外的顏色全部替換成紅色
        if (name != "#ffffff") {
            image.setPixelColor(x, y, Qt::red);
        }
    }
}

//保存文件
image.save("2.png");
  1. 在數據庫相關的應用中,如果僅僅是單機版本,沒有特別的需要(比如領導指定,或者需要遠程存放數據),強烈建議使用sqlite數據庫,這是本人經過無數次的對比測試和N個商業項目應用得出的結論。
  • Qt天生內置了sqlite數據庫,只需要發佈的時候帶上插件就行(可以看到插件動態庫文件比其他幾種都要大,那是因爲直接將數據庫的源碼都編譯進去了,而其他只編譯了中間通信交互的插件源碼),其他數據庫要麼還要帶上動態庫,要麼還需要創建數據源;
  • 速度上,絕對無與倫比的出類拔萃,同樣的數據庫結構(表結構、索引等完全一致),查詢速度和批量更新速度、數據庫事務等,速度都是其他幾種的至少3倍以上,而且隨着數據量的增大對比越發明顯;
  • 幾千萬的數據量完全沒問題,而且速度和性能都還可以,不要以訛傳訛網上部分菜雞說的不支持百萬以上的數據量,本人親測億級別,數據量建議千萬級別以下,着重注意數據庫表和索引的設計;
  • 其他數據庫還要注意版本的區別,ODBC數據源形式還容易出錯和執行失敗;
  • sqlite數據庫也有幾個重大缺點:不支持加密,不支持網絡訪問,不支持部分數據庫高級特性,不支持海量數據(億級別以上),但是對於絕大部分Qt項目還是足夠;
  • 數據庫支持友好度大致是 sqlite > postgresql > mysql > odbc ;
  • 以上都是在Qt環境中個人測試得出的結論,結果未必正確,作爲參考即可,其他編程環境比如C#、JAVA請忽略,也許差別可能在中間通信的效率造成的;
  1. Qt5.10以後提供了新的類 QRandomGenerator QRandomGenerator64 管理隨機數,使用更方便,尤其是取某個區間的隨機數。
//早期處理辦法 先初始化隨機數種子然後取隨機數
qsrand(QTime::currentTime().msec());
//取 0-10 之間的隨機數
qrand()%10;
//取 0-1 之間的浮點數
qrand()/double(RAND_MAX);

//新版處理辦法 支持5.10以後的所有版本包括qt6
QRandomGenerator::global()->bounded(10);      //生成一個0和10之間的整數
QRandomGenerator::global()->bounded(10.123);  //生成一個0和10.123之間的浮點數
QRandomGenerator::global()->bounded(10, 15);  //生成一個10和15之間的整數

//兼容qt4-qt6及以後所有版本的方法 就是用標準c++的隨機數函數
srand(QTime::currentTime().msec());
rand()%10;
rand()/double(RAND_MAX);

Qt開發經驗開源主頁(持續更新):

  1. https://gitee.com/feiyangqingyun/qtkaifajingyan
  2. https://github.com/feiyangqingyun/qtkaifajingyan
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章