- 關於c++中繼承多態virtual和override的幾點總結。
- 子類可以直接使用基類中的protected下的變量和函數。
- 基類函數沒加virtual,子類有相同函數,實現的是覆蓋。用基類指針調用時,調用到的是基類的函數;用子類指針調用時,調用到的是子類的函數。
- 基類函數加了virtual時,實現的時重寫。用基類指針或子類指針調用時,調用到的都是子類的函數。
- 函數加上override,強制要求子類相同函數需要是虛函數,而且必須重新實現,否則會編譯報錯。
- 子類的virtual可加可不加,建議加override不加virtual。
- 基類中的純虛函數(virtual void play() = 0;)在基類中無需在cpp中實現,但是必須在子類實現,否則編譯報錯。
- 繼承多態最大的好處就是提煉共性,將通用的變量和方法信號等,全部放在基類,子類負責實現自己需要的特殊的部分即可。
- 關於 QTableView、QTableWidget 懸停整行選中效果,網上大多數都是針對 QTableWidget 的實現,針對 QTableView 的也都是通過委託或者重新painter實現。
- 前提:設置選中單元格自動選中整行,tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
- 安裝事件過濾器,識別到當前座標處的數據模型,然後設置當前模型爲鼠標懸停處的模型即可。這個取巧的辦法可以節省大量的工作。
- 無論 QTableView、QTableWidget 都用此方法都可以。
- Qt中如何避免和第三方的signals、slots等關鍵字衝突。
- 第一步:在pro中加上 CONFIG += no_keywords 。
- 第二步:項目中之前所有的 signals 改成 Q_SIGNALS,slots 改成 Q_SLOTS 等。
- 第三步:徹底重新編譯項目,這樣就關鍵字不衝突了。
- pro中區分不同的操作系統及硬件平臺。
win32 {}
unix {}
//Qt5可以直接用 linux{} Qt4切記需要用 unix:!maxc{}
unix:!maxc{}
linux {}
maxc {}
android {}
wasm {}
//表示64位平臺
contains(QT_ARCH, x86_64) {}
//表示arm平臺
contains(QT_ARCH, arm) || contains(QT_ARCH, arm64) {}
//萬能辦法直接切換到套件打印下 QT_ARCH 看下什麼字符
message($$QT_ARCH)
- 在顯示視頻畫面位置的時候,一般會有三種機制作爲參考,自動調整(畫面尺寸大於顯示控件尺寸則等比例縮放,否則原圖顯示)、等比例縮放、拉伸填充。Qt中圖片類QImage都提供了縮放策略的參數設置,比如Qt::KeepAspectRatio表示等比例縮放,但很多時候我們需要的是設置控件的大小,其實QSize類就提供了對應的方法scale專門解決這個問題,這個方法很容易被忽視。
//傳入圖片尺寸和窗體區域及邊框大小返回居中區域
static QRect getCenterRect(const QSize &imageSize, const QRect &widgetRect, int borderWidth = 2, bool alwaysScale = true)
{
QSize newSize = imageSize;
QSize widgetSize = widgetRect.size() - QSize(borderWidth * 2, borderWidth * 2);
//alwaysScale = false 表示只有尺寸超過窗體尺寸才縮放否則就原圖尺寸
if (alwaysScale) {
newSize.scale(widgetSize, Qt::KeepAspectRatio);
} else if (newSize.width() > widgetSize.width() || newSize.height() > widgetSize.height()) {
newSize.scale(widgetSize, Qt::KeepAspectRatio);
}
int x = widgetRect.center().x() - newSize.width() / 2;
int y = widgetRect.center().y() - newSize.height() / 2;
return QRect(x, y, newSize.width(), newSize.height());
}
//傳入圖片尺寸和窗體尺寸及縮放策略返回合適尺寸的圖片
static void getScaledImage(QImage &image, const QSize &widgetSize, bool alwaysScale = false, bool fast = true)
{
//alwaysScale = false 表示只有尺寸超過窗體尺寸才縮放否則就原圖尺寸
if (alwaysScale) {
image = image.scaled(widgetSize, Qt::KeepAspectRatio, fast ? Qt::FastTransformation : Qt::SmoothTransformation);
} else if (image.width() > widgetSize.width() || image.height() > widgetSize.height()) {
image = image.scaled(widgetSize, Qt::KeepAspectRatio, fast ? Qt::FastTransformation : Qt::SmoothTransformation);
}
}
國內站點:https://gitee.com/feiyangqingyun
國際站點:https://github.com/feiyangqingyun