- QLineEdit除了單純的文本框以外,還可以做很多特殊的處理用途,
- 限制輸入只能輸入IP地址,
- 限制輸入范圍,強烈推薦使用 QRegExpValidator 正則運算式來處理,
//正在運算式限制輸入
QString str = "\\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b";
ui->lineEdit->setValidator(new QRegExpValidator(QRegExp(str)));
//用于占位
ui->lineEdit->setInputMask("000.000.000.000");
#if 0
//下面代碼設定浮點數范圍限制失敗
ui->lineEdit->setValidator(new QDoubleValidator(20, 50, 1));
#else
//下面代碼設定浮點數范圍限制成功
QDoubleValidator *validator = new QDoubleValidator(20, 50, 1);
validator->setNotation(QDoubleValidator::StandardNotation);
ui->lineEdit->setValidator(validator);
#endif
//下面代碼設定整數范圍限制成功
ui->lineEdit->setValidator(new QIntValidator(10, 120));
//其實上面的代碼缺陷很多,只能限制只輸入小數,無法設定數值范圍,很操蛋
//需要來個萬能的牛逼的 QRegExpValidator
//限制浮點數輸入范圍為[-180,180]
QRegExp regexp("^-?(180|1?[0-7]?\\d(\\.\\d+)?)$");
//限制浮點數輸入范圍為[-90,90]并限定為小數位后4位
QRegExp regexp("^-?(90|[1-8]?\\d(\\.\\d{1,4})?)$");
QRegExpValidator *validator = new QRegExpValidator(regexp, this);
ui->lineEdit->setValidator(validator);
- 在繼承自QAbstractItemView的控制元件中,比如QTableView、QTableWidget,如果文本超過對應item的寬度,則會自動省略號顯示,想要快速顯示完整的文本,可以在該列和下一列分割線中間雙擊即可,會自動自適應顯示最大寬度,如果是Qt5.14或者更高版本,你會發現顯示省略號的計算規則變了,如果是rtsp、http之類的開頭的英文字串,同樣的列寬下,會提前就顯示省略號,比如字串 rtmp://58.200.131.2:1935/livetv/cctv1,會顯示成 rtmp://… ,而在舊版本的Qt中會顯示成 rtmp://58.200.131… ,很多時候我們并不想看到煩人的省略號,可以設定取消,
//取消自動換行
tableView->setWordWrap(false);
//超出文本不顯示省略號
tableView->setTextElideMode(Qt::ElideNone);
- QVideoWidget播放視頻,可能會遇到畫面閃爍的情況,播放視頻的表單需要設定個屬性,
QVideoWidget *videoWidget = new QVideoWidget;
videoWidget->setAttribute(Qt::WA_OpaquePaintEvent);
-
Qt bug成千上萬,這個不用大驚小怪,也基本上遇不到,大部分都是特殊極端情況特定應用場景出現,甚至你會遇到有些是debug可以release報錯,有些release可以debug卻報錯的情況,最神奇的還有先是debug報錯,然后release正常,再回傳去用debug又正常,需要用release激活一下!學習編程的路本來就是一條坑坑洼洼的路,不斷填坑,盡量規避坑!很多時候很多看起來的坑其實是自己沒有注意細節導致的,
-
Qt試圖中默認排序是按照字串的ASCII排序的,如果是IP地址的話會出現192.168.1.117排在192.168.1.2前面的情況,如果要規避這種情況,一種做法是取末尾的地址轉成整型再比較大小,缺點是跨網段就歇菜了,又會出現192.168.2.65出現在192.168.1.70前面,終極大法是將IP地址轉成整型再比較大小,
QString QUIHelper::ipv4IntToString(quint32 ip)
{
QString result = QString("%1.%2.%3.%4").arg((ip >> 24) & 0xFF).arg((ip >> 16) & 0xFF).arg((ip >> 8) & 0xFF).arg(ip & 0xFF);
return result;
}
quint32 QUIHelper::ipv4StringToInt(const QString &ip)
{
int result = 0;
if (isIP(ip)) {
QStringList list = ip.split(".");
int ip0 = list.at(0).toInt();
int ip1 = list.at(1).toInt();
int ip2 = list.at(2).toInt();
int ip3 = list.at(3).toInt();
result = ip3 | ip2 << 8 | ip1 << 16 | ip0 << 24;
}
return result;
}
-
在主QWidget表單如果直接qss設定背景圖片的話,預覽是可見的,運行并沒有效果,你需要在這個主widget上再放個widget,在新的widget上設定qss圖片就行,而如果是Dialog或者QMainWindow表單是支持直接設定qss背景圖的,預覽和運行效果一致,
-
Qt提供了qDebug機制直接輸出列印資訊,這個彌補了QtCreator除錯很雞肋的缺點,而且無縫對接日志鉤子,使得現場運行期間按照預定的列印資訊輸出到日志檔案,有時候在開發階段,又不想要看到一堆堆的列印資訊,最笨的做法是一行行注釋掉qdebug的地方,其實還可以直接pro中加上一行來禁用整個專案的qdebug輸出,
#禁用qdebug列印輸出
DEFINES += QT_NO_DEBUG_OUTPUT
- 在使用QT_NO_DEBUG_OUTPUT關鍵字禁用了所有列印資訊以后,可以節約不少的開銷,有時候又想在禁用列印資訊后,極少地方還需要看到列印資訊,怎么辦呢?其實QT_NO_DEBUG_OUTPUT禁用的qdebug的輸出,Qt還有其他幾種列印資訊比如 qInfo、qWarning、qCritical,這些是不受影響的,也就是說在極少部分需要列印的地方用qInfo來輸出資訊就好,特別注意:qFatal列印完資訊程式會自動結束,
qDebug() << "qDebug";
qInfo() << "qInfo";
qWarning() << "qWarning";
qCritical() << "qCritical";
qDebug("qDebug");
qWarning("qWarning");
qCritical("qCritical");
- Qt的pro檔案可以添加各種處理來使得配置更方便,比如指定輸出檔案路徑等,這樣就不會全部在一堆編譯生成的臨時檔案中找來找去,
#禁用qdebug列印輸出
DEFINES += QT_NO_DEBUG_OUTPUT
#自定義define變數 可以在整個專案中使用
#pro檔案可以這樣判斷 contains(DEFINES, videovlc) {}
#代碼檔案可以這樣判斷 #ifdef videovlc
DEFINES += videovlc1 videoffmpeg
#關閉編譯警告提示 眼不見為凈
CONFIG += warn_off
#指定編譯生成的檔案到temp目錄 分門別類存盤
MOC_DIR = temp/moc
RCC_DIR = temp/rcc
UI_DIR = temp/ui
OBJECTS_DIR = temp/obj
#指定編譯生成的可執行檔案到bin目錄
DESTDIR = bin
- Qt對作業系統層的訊息也做了很多的封裝,可以直接拿到進行處理(如果需要攔截處理要用對應作業系統的API才行比如滑鼠鍵盤鉤子),比如系統休眠和喚醒做一些處理,
//主表單頭檔案
protected:
bool nativeEvent(const QByteArray &eventType, void *message, long *result);
#ifdef Q_OS_WIN
bool winEvent(MSG *message, long *result);
#endif
//主表單實作函式
#ifdef Q_OS_WIN
#include "Windows.h"
#endif
bool frmMain::nativeEvent(const QByteArray &eventType, void *message, long *result)
{
if (eventType == "windows_generic_MSG") {
#ifdef Q_OS_WIN
MSG *msg = static_cast<MSG *>(message);
//qDebug() << TIMEMS << msg->message;
if (msg->wParam == PBT_APMSUSPEND && msg->message == WM_POWERBROADCAST) {
//系統休眠的時候自動最小化可以規避程式可能出現的問題
this->showMinimized();
} else if (msg->wParam == PBT_APMRESUMEAUTOMATIC) {
//休眠喚醒后自動打開
this->showNormal();
}
#endif
} else if (eventType == "NSEvent") {
#ifdef Q_OS_MACOS
#endif
}
return false;
}
#ifdef Q_OS_WIN
bool frmMain::winEvent(MSG *message, long *result)
{
return nativeEvent("windows_generic_MSG", message, result);
}
#endif
- Qt的pro專案管理組態檔中也可添加各種編譯前后的操作及配置,主要通過 QMAKE_POST_LINK和QMAKE_PRE_LINK,他們支持的函式以及寫法,可以在QtCreator的幫助中搜索 qmake Function Reference 查看詳情說明,
- QMAKE_PRE_LINK 表示編譯前執行內容
- QMAKE_POST_LINK 表示編譯后執行內容
srcFile1 = $$PWD/1.txt
srcFile2 = $$PWD/2.txt
dstDir = $$PWD/../bin
#windows上需要轉換路徑斜杠 其他系統不需要
srcFile1 = $$replace(srcFile1, /, \\);
srcFile2 = $$replace(srcFile2, /, \\);
dstDir = $$replace(dstDir, /, \\);
#編譯前執行拷貝 多個拷貝可以通過 && 符號隔開
QMAKE_PRE_LINK += copy /Y $$srcFile1 $$dstDir && copy /Y $$srcFile2 $$dstDir
#編譯后執行拷貝 多個拷貝可以通過 && 符號隔開
QMAKE_POST_LINK += copy /Y $$srcFile1 $$dstDir && copy /Y $$srcFile2 $$dstDir
Qt開發經驗開源主頁(持續更新):
- https://gitee.com/feiyangqingyun/qtkaifajingyan
- https://github.com/feiyangqingyun/qtkaifajingyan
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/278565.html
標籤:其他
上一篇:你其實可以更快!用Toolkit拖拽式編碼方法提升開發效率
下一篇:nfs檔案共享服務
