Qt開發經驗小技巧231-235

  1. 關於c++中繼承多態virtual和override的幾點總結。
  • 子類可以直接使用基類中的protected下的變量和函數。
  • 基類函數沒加virtual,子類有相同函數,實現的是覆蓋。用基類指針調用時,調用到的是基類的函數;用子類指針調用時,調用到的是子類的函數。
  • 基類函數加了virtual時,實現的時重寫。用基類指針或子類指針調用時,調用到的都是子類的函數。
  • 函數加上override,強制要求子類相同函數需要是虛函數,而且必須重新實現,否則會編譯報錯。
  • 子類的virtual可加可不加,建議加override不加virtual。
  • 基類中的純虛函數(virtual void play() = 0;)在基類中無需在cpp中實現,但是必須在子類實現,否則編譯報錯。
  • 繼承多態最大的好處就是提煉共性,將通用的變量和方法信號等,全部放在基類,子類負責實現自己需要的特殊的部分即可。
  1. 關於 QTableView、QTableWidget 懸停整行選中效果,網上大多數都是針對 QTableWidget 的實現,針對 QTableView 的也都是通過委託或者重新painter實現。
  • 前提:設置選中單元格自動選中整行,tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
  • 安裝事件過濾器,識別到當前座標處的數據模型,然後設置當前模型爲鼠標懸停處的模型即可。這個取巧的辦法可以節省大量的工作。
  • 無論 QTableView、QTableWidget 都用此方法都可以。
  1. Qt中如何避免和第三方的signals、slots等關鍵字衝突。
  • 第一步:在pro中加上 CONFIG += no_keywords 。
  • 第二步:項目中之前所有的 signals 改成 Q_SIGNALS,slots 改成 Q_SLOTS 等。
  • 第三步:徹底重新編譯項目,這樣就關鍵字不衝突了。
  1. 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)
  1. 在顯示視頻畫面位置的時候,一般會有三種機制作爲參考,自動調整(畫面尺寸大於顯示控件尺寸則等比例縮放,否則原圖顯示)、等比例縮放、拉伸填充。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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章