溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Qt開(kāi)發(fā)小技巧有哪些

發(fā)布時(shí)間:2021-12-15 13:48:01 來(lái)源:億速云 閱讀:129 作者:iii 欄目:互聯(lián)網(wǎng)科技

本篇內(nèi)容介紹了“Qt開(kāi)發(fā)小技巧有哪些”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

  1. Qt中的QColor對(duì)顏色封裝的很完美,支持各種轉(zhuǎn)換,比如rgb、hsb、cmy、hsl,對(duì)應(yīng)的是toRgb、toHsv、toCmyk、toHsl,還支持透明度設(shè)置,顏色值還能轉(zhuǎn)成16進(jìn)制格式顯示。

QColor color(255, 0, 0, 100);
qDebug() << color.name() << color.name(QColor::HexArgb);
//輸出 #ff0000 #64ff0000
  1. QVariant類型異常的強(qiáng)大,可以說(shuō)是萬(wàn)能的類型,在進(jìn)行配置文件的存儲(chǔ)的時(shí)候,經(jīng)常會(huì)用到QVariant的轉(zhuǎn)換,QVariant默認(rèn)自帶了toString、toFloat等各種轉(zhuǎn)換,但是還是不夠,比如有時(shí)候需要從QVariant轉(zhuǎn)到QColor,而卻沒(méi)有提供toColor的函數(shù),這個(gè)時(shí)候就要用到萬(wàn)能辦法。

if (variant.typeName() == "QColor") {
    QColor color = variant.value<QColor>();
    QFont font = variant.value<QFont>();
    QString nodeValue = color.name(QColor::HexArgb);
}
  1. Qt中的QString和const char *之間轉(zhuǎn)換,最好用toStdString().c_str()而不是toLocal8Bit().constData(),比如在setProperty中如果用后者,字符串中文就會(huì)不正確,英文正常。

  2. Qt的信號(hào)槽機(jī)制非常牛逼,也是Qt的獨(dú)特的核心功能之一,有時(shí)候我們?cè)诤芏啻绑w中傳遞信號(hào)來(lái)實(shí)現(xiàn)更新或者處理,如果窗體層級(jí)比較多,比如窗體A的父類是窗體B,窗體B的父類是窗體C,窗體C有個(gè)子窗體D,如果窗體A一個(gè)信號(hào)要傳遞給窗體D,問(wèn)題來(lái)了,必須先經(jīng)過(guò)窗體B中轉(zhuǎn)到窗體C再到窗體D才行,這樣的話各種信號(hào)關(guān)聯(lián)信號(hào)的connect會(huì)非常多而且管理起來(lái)比較亂,可以考慮增加一個(gè)全局的單例類AppEvent,公共的信號(hào)放這里,然后窗體A對(duì)應(yīng)信號(hào)綁定到AppEvent,窗體D綁定AppEvent的信號(hào)到對(duì)應(yīng)的槽函數(shù)即可,干凈清爽整潔。

  3. QTextEdit右鍵菜單默認(rèn)英文的,如果想要中文顯示,加載widgets.qm文件即可,一個(gè)Qt程序中可以安裝多個(gè)翻譯文件,不沖突。

  4. Qt中有個(gè)全局的焦點(diǎn)切換信號(hào)focusChanged,可以用它做自定義的輸入法。Qt4中默認(rèn)會(huì)安裝輸入法上下文,比如在main函數(shù)打印a.inputContext會(huì)顯示值,這個(gè)默認(rèn)安裝的輸入法上下文,會(huì)攔截兩個(gè)牛逼的信號(hào)QEvent::RequestSoftwareInputPanel和QEvent::CloseSoftwareInputPanel,以至于就算你安裝了全局的事件過(guò)濾器依然識(shí)別不到這兩個(gè)信號(hào),你只需要在main函數(shù)執(zhí)行a.setInputContext(0)即可,意思是安裝輸入法上下文為空。

  5. 在Qt5.10以后,表格控件QTableWidget或者QTableView的默認(rèn)最小列寬改成了15,以前的版本是0,所以在新版的qt中,如果設(shè)置表格的列寬過(guò)小,不會(huì)應(yīng)用,取的是最小的列寬。所以如果要設(shè)置更小的列寬需要重新設(shè)置ui->tableView->horizontalHeader()->setMinimumSectionSize(0);

  6. Qt源碼中內(nèi)置了一些未公開(kāi)的不能直接使用的黑科技,都藏在對(duì)應(yīng)模塊的private中,比如gui-private widgets-private等,比如zip文件解壓類QZipReader、壓縮類QZipWriter就在gui-private模塊中,需要在pro中引入QT += gui-private才能使用。

#include "QtGui/private/qzipreader_p.h"
#include "QtGui/private/qzipwriter_p.h"

QZipReader reader(dirPath);
QString path("");
//解壓文件夾到當(dāng)前目錄
reader.extractAll(path);
//文件夾名稱
QZipReader::FileInfo fileInfo = reader.entryInfoAt(0);
//解壓文件
QFile file(filePath);
file.open(QIODevice::WriteOnly);
file.write(reader.fileData(QString::fromLocal8Bit("%1").arg(filePath)));
file.close();
reader.close();

QZipWriter *writer = new QZipWriter(dirPath);
//添加文件夾
writer->addDirectory(unCompress);
//添加文件
QFile file(filePath);
file.open(QIODevice::ReadOnly);
writer->addFile(data, file.readAll());
file.close();
writer->close();
  1. 理論上串口和網(wǎng)絡(luò)收發(fā)數(shù)據(jù)都是默認(rèn)異步的,操作系統(tǒng)自動(dòng)調(diào)度,完全不會(huì)卡住界面,網(wǎng)上那些說(shuō)收發(fā)數(shù)據(jù)卡住界面主線程的都是扯幾把蛋,真正的耗時(shí)是在運(yùn)算以及運(yùn)算后的處理,而不是收發(fā)數(shù)據(jù),在一些小數(shù)據(jù)量運(yùn)算處理的項(xiàng)目中,一般不建議動(dòng)用線程去處理,線程需要調(diào)度開(kāi)銷的,不要什么東西都往線程里邊扔,線程不是萬(wàn)能的。只有當(dāng)真正需要將一些很耗時(shí)的操作比如編碼解碼等,才需要移到線程處理。

  2. 在構(gòu)造函數(shù)中獲取控件的寬高很可能是不正確的,需要在控件首次顯示以后再獲取才是正確的,控件是在首次顯示以后才會(huì)設(shè)置好正確的寬高值,記住是在首次顯示以后,而不是構(gòu)造函數(shù)或者程序啟動(dòng)好以后,如果程序啟動(dòng)好以后有些容器控件比如QTabWidget中的沒(méi)有顯示的頁(yè)面的控件,你去獲取寬高很可能也是不正確的,萬(wàn)無(wú)一失的辦法就是首次顯示以后去獲取。

“Qt開(kāi)發(fā)小技巧有哪些”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

qt
AI