Qt的全面學習筆記【持續更新】

目錄大綱

本人會些Java、C++,速成做了Qt前端工程師,但是做項目時遇到很多不懂或問題,想在此分享於大家,也方便自己回顧;若有關於Qt問題,可評論提出,或許能幫些忙;若編寫有誤,也可評論,我會積極糾正的,提前道聲謝謝~

認識Qt

  • Qt1
  • 1991年由Qt Company(原公司名:奇趣科技)開發的跨平臺C++ 圖形用戶界面GUI應用程序開發框架——Qt。它既可以開發GUI程序,也可用於開發非GUI程序,比如控制檯工具和服務器。
    Qt是面向對象的框架,使用特殊的代碼生成擴展(稱爲元對象編譯器(Meta Object Compiler, moc))以及一些宏,Qt很容易擴展,並且允許真正地組件編程。
  • 1996年進入商業領域,成爲全世界範圍內數千種成功的應用程序的基礎。它也是目前流行的Linux桌面環境(KDE)的基礎,KDE是Linux發行版的主要一個標準組件。
  • 2008年,奇趣科技被諾基亞公司收購,Qt也因此成爲諾基亞旗下的編程語言工具。
  • 2012年,Qt被Digia(芬蘭IT服務公司)收購。
  • 2014年,Digia宣佈成立“The Qt Company”全資子公司,以進一步推動Qt產品的開發和市場擴張。
  • 2014年4月,跨平臺集成開發環境Qt Creator 3.1.0正式發佈,實現了對於iOS的完全支持,新增WinRT、Beautifier等插件,廢棄了無Python接口的GDB調試支持,集成了基於Clang的C/C++代碼模塊,並對Android支持做出了調整,至此實現了全面支持iOSAndroidWP,它提供給應用程序開發者建立藝術級的圖形用戶界面所需的所有功能。基本上,Qt 同 X Window 上的 Motif,Openwin,GTK 等圖形界面庫和 Windows 平臺上的 MFC,OWL,VCL,ATL 是同類型的東西。

學習網站

安裝Qt

在Linux時

在Windows時

  • Win10系統安裝Qt5.8.0,不會出現“缺少某dll文件”的問題。
  • 打開Qt軟件,載入已有項目:
    • [提示譯文:沒有找到這個Qt Creator實例創建的 .user 設置文件。您以前是否在其他機器上使用過這個項目,或者使用過不同的使用路徑?您是否仍然要加載設置文件“C:\Userslyanfa\Desktop\DialogDialog.pro.user”?]
      在這裏插入圖片描述
    • 按No後會跳轉到這個窗口,要點擊“Configure Project”按鈕。
      在這裏插入圖片描述
      • 注:若剛安裝Qt Creator,第一次載入項目最好點No,然後配置環境,到了第二次第三次第N次都可以按Yes,環境可自動配置成Qt5.8.0 MinGW 32bit。
    • 若按Yes,直接在“編輯”的“項目框”中出現對應項目。
      在這裏插入圖片描述
    • 無論是按Yes還是No,最終運行時,構件套件都是Qt5.8.0 MinGW 32bit配置。
      在這裏插入圖片描述
  • Win7系統中安裝Qt,也許會出現這樣的問題。
  • 如何安裝Qt 5.8.0 +mingw
    在這裏插入圖片描述
    • 若你下載了VS2010或VS其他版本的軟件,則你需要找上圖的“1、”;
    • 若沒有下載,只想下載Qt Creator,則找上圖的“2、”;
    • 若找不到5.8.0版,那你不用麻煩了,直接進入下面的文檔鏈接

安裝或異常解決方案文檔:

鏈接:https://pan.baidu.com/s/18a7CKGmvMTKwVK6fv7YEfg 提取碼:xjjx

找到Qt5.8SetUp文件夾,下載之後,雙擊安裝—》安裝時一定要勾選Tools的MinGW選擇(默認不勾選),否則後面項目運行會報錯在這裏插入圖片描述—》安裝時,可能會彈出警告

  1. Cannot find file: E:\Qt程序\day.pro. When executing step "qmake"的問題

  2. Error while building/deploying project untitled(永久解決辦法)

  3. Qt Creator 報錯:Error while building/deploying project helloworld (kit: Desktop Qt 5.6.2 MinGW 32bit) When executing step “qmake”【當我安裝Qt5.8.0時未勾選Tools的MinGW環境配置,當我項目運行時,就會報這樣的異常(當時環境配置是Qt默認環境),我使用過文章的“方法一”,似乎也不奏效,可能問題源頭是“未配置MinGW”】
    在這裏插入圖片描述
    OrQt學習一: Qt 在 win7 的安裝和環境配置【圖的“1、”是方案二,圖的“2、”是方案一】
    QT5.8.0+MSVC2015安裝以及環境配置(不需要安裝VS2015)【簡單粗暴的講解,當時只覺得唯有這個是有用的信息:跳轉Qt官方Qt5.8.0版本的軟件下載鏈接】

  4. [下面倆文章,我暫時未用過]
    QT creator 5.8.0/5.9+opencv2.4.13.6安裝與配置方法
    QT5.12安裝圖文教程與安裝成功後環境配置詳細教程

32位系統與x86系統關係

參考:
32位系統爲什麼又叫x86系統呢?

構建項目及設置配置

Qt右擊上下文菜單的某些選項之間區別

創建主窗口、設置窗口居中、dialog與widget與mainWindow比較

pro文件

pri文件

  • Qt中 .pro 文件和 .pri 文件簡介
  • pri = “pro + include”;
  • 可以把 ×.pro 文件內的一部分內容單獨放到一個 ×.pri 文件內,然後include到×.pro 文件中
  • 如:將×.pro 文件用上的"configure function build"分類,獨立出分別放入configure.pri、function.pri、build.pri,接着在×.pro 文件中include即可
include( $${PWD}/../../。。。/examples/examples.pri )

PS:若多個pri文件,最好集成於一個example.pri中,而在pro文件中,include的example.pri即可(include括號裏的路徑中不能出現回車符或者空格,否則系統找不到對應的文件)
在這裏插入圖片描述
在這裏插入圖片描述

添加文件

添加資源,在資源裏添加並使用圖片

qrc文件

在已有的項目中分別添加頭文件、源文件 與 使用.h文件

多個UI界面的聯繫

qmake

爲什麼main()函數總是有"return a.exec"

  • 關於qt的主程序調用exec()
  • a.exec()的作用,該怎麼解決
    [譯文: 第一行:進入主事件循環並等待,直到調用exit()。返回設置爲exit()的值(如果通過quit()調用exit(),則返回0)。
    第二行:需要調用此函數來啓動事件處理。主事件循環從窗口系統接收事件,並將這些事件分派給應用程序小部件。
    第三行:要使應用程序執行空閒處理(即在沒有掛起事件時執行特殊函數),請使用超時爲0的QTimer。使用processEvents()可以實現更高級的空閒處理方案。
    第四行:我們建議您將清理代碼連接到aboutToQuit()信號,而不是將其放在應用程序的main()函數中,因爲在某些平臺上,QCoreApplication::exec()調用可能不會返回。例如,在Windows上,當用戶註銷時,系統在Qt關閉所有頂級窗口後終止進程。因此,在QCoreApplication::exec()調用之後,不能保證應用程序有時間退出事件循環並在main()函數結束時執行代碼
    "引用"欄的譯文: 彙編代碼:
    進入主事件循環並等待,直到調用exit()。返回設置爲exit()的值(如果通過quit()調用exit(),則返回0)。
    有必要把這個函數稱爲…]
  • Qt exec()做了什麼
  • qt: exec()的用法,accept()和accepted的概念

myDlg.exec()==QDialog::Accepted

  • my1.exec()==QDialog::Accepted
    • exec():顯示模式對話框【不關閉此對話框,不能執行別的操作】
    • my1是一個對話框或下拉框,當調用exec方法時,彈出‘框’,等待用戶響應,用戶可能點擊確定或選擇xxx項,那麼exec返回QDialog::Accepted值(int類型),如果點擊取消或不選擇點擊框外範圍,則返回QDialog::Rejected(int類型)
    • 這句話是通過返回值來確定用戶的響應結果。
    • 一般作爲if語句的條件

模態與非模態的區別

模態對話框

  • 模態窗體一般指:在其沒有被關閉之前,用戶不能與同一個應用程序的其他窗口進行交互,直到該對話框關閉。

非模態對話框

  • 非模態窗體是指:當被打開時,用戶既可選擇和該對話框進行交互,也可以選擇同應用程序的其他窗口交互。

show()與exec()的區別

show()

  • 可以顯示非模式也可以顯示模式對話框。
  • 當設置modal爲true時,顯示模式對話框;若false(默認值)則顯示非模式。
MyDialog myDlg;
myDlg.setModal(true);    myDlg.show();//模態

myDlg.setModal(false);或者myDlg.setModal();    myDlg.show();//非模態   

exec()

  • 顯示模式對話框。
myDlg.exec();

同中不同:模式對話框的顯示不同

  • show()
    • 顯示的模態對話框並非真正意義上的模態,雖然在對話框彈出的時候,程序的其它操作(按鈕、窗口切換等)都失效了;但是程序仍然在調用對話框之後,繼續執行後面的代碼。但這樣,就不會得到窗口的返回值。
  • exec()
    • 在調用之後,程序就被鎖定在原地。等待窗口的關閉。

順便提下:C語言的main函數爲什麼要返回0?

int main(int argc, char *argv[]){}

include <xxx.h> 與 include “xxx.h” 的區別

#ifndef XXX_H #define XXX_H … #endif

之間的關係與區別

#ifndef 本文件的頭文件名全大寫XXX_H    
#define 本文件的頭文件名全大寫XXX_H 
........某內容.......   
#endif 

延伸

#ifdef…#else…#endif與#ifndef…#else…#endif

#if defined…#endif

#if…#elif…#else…#endif與if…else if…else

區別

\ #if if
名稱 條件編譯 條件語句
介紹 是C語言中預處理部分的內容,它是編譯器編譯代碼時最先處理的部分 是 C 語言中的關鍵字,它根據表達式的計算結果來覺定執行那個語句,它裏面的每個分支都編譯了的
簡單說 根據 宏條件 選擇性地編譯語句,它是編譯器在編譯代碼時完成的 根據條件表達式選擇性地執行語句,它是在程序運行時進行的
代碼 qb-01區代碼 qb-02區代碼
意思 如果宏條件符合,編譯器就編譯這段代碼,否則,編譯器就忽略這段代碼而不編譯 做A條件判斷
什麼時候用 如果你的條件在程序編譯前就已經確定了,那就用#if 如果條件需要在程序運行過程中才能判斷,則用if

qb-01:

#define  A 0  //把A定義爲0
#if (A > 1)
         printf("A > 1");  //編譯器沒有編譯該語句,該語句不生成彙編代碼
#elif (A == 1)
         printf("A == 1"); //編譯器沒有編譯該語句,該語句不生成彙編代碼
#else
         printf("A < 1");   //編譯器編譯了這段代碼,且生成了彙編代碼,執行該語句
#endif

qb-02:

#define A 0 
if (A > 1) 
     printf("A > 1");   //編譯器編譯該語句,但因爲A == 0 未執行 
else if(A == 1) 
   printf("A == 1");  //編譯器編譯該語句,但因爲A == 0 未執行 
else
   printf("A < 1");  //編譯器編譯該語句,因爲A == 0 故執行

~MainWindow()

  • Qt程序報error: undefined reference to `MainWindow::~MainWindow()’
    • 析構函數(Destructor)也是一種特殊的成員函數,沒有返回值,不需要程序員顯式調用(程序員也沒法顯式調用),而是在銷燬對象時自動執行。
    • 構造函數的名字和類名相同,而析構函數的名字是在類名前面加一個~符號。
    • 函數名是標識符的一種,原則上標識符的命名中不允許出現~符號,在析構函數的名字中出現的~可以認爲是一種特殊情況,目的是爲了和構造函數的名字加以對比和區分。
    • 析構函數沒有參數,不能被重載,因此一個類只能有一個析構函數。如果用戶沒有定義,編譯器會自動生成一個默認的析構函數。
    • 析構函數裏的delete,銷燬組件、部件緩存,減少內存或釋放內存,防止內存泄漏。
      在這裏插入圖片描述
      在這裏插入圖片描述

~QString()

  • QString類
  • QString::~QString ()
    • 表示:銷燬這個字符串並且如果這是 這個字符串 的最後一個複製,就釋放“真實的”字符串。

QString

QString::number()

  • 原型: 常用:static QString number(int value, int base=10);【若base值未賦值,默認爲10】
  • 說明:十進制整型value值轉成十進制字符串
    在這裏插入圖片描述
可以用於“int類型轉成QString類型”
int val = 6;
QString str =  QString::number(val);

在這裏插入圖片描述
在這裏插入圖片描述

錯誤:QString str = new QString()new QString 或 new QString("43");
否則,報錯:"錯誤:從'QString*'轉換爲請求的非標量類型'QString'"

正確:QString str = "";或QString str;

在這裏插入圖片描述

非標量與標量類型

參考:
《SQL與關係數據庫理論——如何編寫健壯的SQL代碼》一一2.5 標量類型vs.非標量類型
錯誤:轉換爲非標量類型(Error: Conversion to non-scalar type)
錯誤:從“基本類型”轉換爲請求的非標量類型“NamedType <基本類型>”

共用體 結構體 枚舉的特點與區別

參考:
結構體,共用體和枚舉類型的基本特點及區別

QString::at ( uint i )

  • 原型:QChar QString::at ( uint i ) const
  • 返回在索引i處的字符,或者如果i超過字符串的長度返回0。
const QString string( "abcdefgh" );
QChar ch = string.at( 4 );// 打印ch == 'e'

QString str = "After finishing the homework,she does her housework~";
qDebug() << "str[2] = " << str.at(2);//打印:str[2] =  't'

QString::arg()

1.
QString m = tr("%1:%2:%3").arg("12").arg("60").arg("60");
//結果是m = "12:60:60"

2.
QString QString::arg(int a, int fieldWidth = 0, int base = 10, QChar fillChar = QLatin1Char( ' ' )) const
[在QString頭文件:inline QString QString::arg(int a, int fieldWidth, int base, QChar fillChar) const]
分析:
第一個參數是要填充的數字(一定是十進制,若二進制數值傳入,也會被認爲是"十進制"數值),
第二個參數爲最小寬度,
第三個參數爲進制,
第四個參數爲當原始數字長度不足最小寬度時用於填充的字符
如:
QString text = QString("%1:%2")
               .arg(123, 5, 10, QChar('0'))
               .arg(456, 5, 10, QChar('0'));
//結果是text = "00123:00456"

從QString頭文件看出:一個arg()函數最多實現九個參數;
在這裏插入圖片描述
若一定要實現九個以上的參數值呢,可以這樣:
在這裏插入圖片描述

QString("%1 %2 %3 %4 %5 %6 %7 %8 %9 %10 %11")
        .arg("1","2","3","4","w","6","7","8","9").arg("a","b");
//結果是:"1 2 3 4 5 6 7 8 9 a b"

QString的isEmpty與isNull

  • QString的isEmpty與isNull區別
  • Qt: QString::isEmpty()與QString::isNull()區別
    • isEmpty()如果字符串沒有字符,則返回true;否則返回false。
    • isNull() 如果字符串是無效的,則返回true;否則返回false。
    • 區別:
      (1)由於歷史原因,Qt對無效字符串和空字符串進行了區分。對於大多數應用程序,重要的是字符串是否包含任何數據,這可以使用isEmpty()函數來確定;
      (2)無效的字符串指的是QString沒有初始化,這也是isEmpty與isNull的區別;
      (3)無論QString有沒有初始化,QString()與QString("")的isEmpty都爲真,而QString()的會被判定爲無效字符串。
isEmpty與isNull的基本區別
     QString().isEmpty();            // returns true
     QString("").isEmpty();          // returns true
     QString("x").isEmpty();         // returns false
     QString("abc").isEmpty();       // returns false

     QString().isNull();             // returns true
     QString("").isNull();           // returns false
     QString("abc").isNull();        // returns false

toInt()

    QString str1("F");
    int i1 = str1.toInt(0,16);
    qDebug() << i1 << " = i1~~~";

std::string與QString

:

int data = 123;
QString convertedValue = QString("%1").arg(data,16,2,QLatin1Char('0')).toUpper();
//arg()函數在上面已說明,int類型的data轉QString類型,而toUpper()函數:把小寫字母轉換爲大寫字母。

QByteArray ba = convertedValue.toLatin1();//將QString轉QByteArray類型
ba[15] = '1';//可以直接更改QByteArray某index的字符
std::string str = ba.toStdString();
//QByteArray的toStdString()專門從QByteArray轉成std::string類型

/*            該語句就是你們要找的!!!         */
QString convertedValue1 = QString::fromStdString(str);
//利用QString的fromStdString函數,將std::string類型轉成QString類型

或者

QString qstr = QString::number(123);//int類型的數據轉QString類型  
string s = qstr.toStdString();//除了QByteArray有toStdString(),QString也有
QString qstr2 = QString::fromStdString(s);//將std::string類型轉成QString類型

延伸

atoi()和itoa()

atoi()
stoi()

參考:

該函數,在 進制間的轉換 方面中,起到很大作用:
C++中二進制、字符串、十六進制、十進制之間的轉換
c++ 二進制字符串轉成10進制數

itoa()
  • Linux編程:11 itoa函數未定義標識符
  • C錯誤:對’_itoa’的未定義引用
  • 原型:char *itoa( int或者long value, char *string,int radix);
  • 所屬頭文件:stdlib.h【Windows系統的Qt纔有,不是一個標準的c函數】
  • 作用:將整數value 轉換成字符串存入string 指向的內存空間 ,radix 爲轉換時所用基數(保存到字符串中的數據的進制基數)。
  • 說明:value:要轉換的數據。string:目標字符串的地址。radix:轉換後的進制數,可以是10進制、16進制等,範圍必須在 2-36。

setCodecForTr()與setCodecForCStrings() 、setCodecForLocale()

函數 描述
QTextCodec::setCodecForCStrings(textc) 主要用在用字符常量或者QByteArray構造QString對象時使用的默認編碼方式。
QTextCodec::setCodecForTr(textc) 這個函數的作用是設置傳給tr函數時的默認字串編碼。
QTextCodec::setCodecForLocale(textc) 這個函數主要用於設置和對本地文件系統讀寫時候的默認編碼格式。

tr() string和QString亂碼的解決

QString拼接數值或字符串

setText() setPlainText()

Qt中獲取當前路徑

QByteArray

QString convertedValue = QString("%1").arg(data,16,2,QLatin1Char('0')).toUpper();
//arg()函數在上面已說明,int類型的data轉QString類型,而toUpper()函數:把小寫字母轉換爲大寫字母。

QByteArray ba = convertedValue.toLatin1();//將QString轉QByteArray類型
ba[15] = '1';//可以直接更改QByteArray某index的字符
std::string str = ba.toStdString();
//QByteArray的toStdString()專門從QByteArray轉成std::string類型

QWdiget

QWidget *parent = 0

setStyleSheet(“QLabel{border:5px solid rgb (0x00,0xff,0x00,0x00);}”)

	QWidget *m_statusInd = new QWidget;
    m_statusInd->setFixedSize( 16, 16 );  
    m_statusInd->setStyleSheet("background-color: red");
    //使用部件Widget的setStyleSheet函數

在這裏插入圖片描述

Qt::FocusPolicy

屬性 表示的十六進制 描述
Qt::TabFocus 0x1 接受Tab鍵焦點
Qt::ClickFocus 0x2 接受鼠標單擊做焦點
Qt::StrongFocus TabFocus or ClickFocus or 0x8 接受Tab鍵和鼠標單擊做焦點
Qt::WheelFocus StrongFocus or 0x4 滑輪作爲焦點選中事件
Qt::NoFocus 0 不接受焦點
#include <QLineEdit>//若頭文件沒有繼承QWidget,就要加上這個

QLineEdit *edit = new QLineEdit;
edit->setFocusPolicy(Qt::StrongFocus);//默認使用Qt::StrongFocus屬性

QLayout

addLayout與addWidget

layout佈局

QComboBox

addItem()

  • 原型:常用:inline void addItem(const QString &text, const QVariant &userData = QVariant());
    • 說明:添加一個下拉選項 在這裏插入圖片描述
      在這裏插入圖片描述
    for(int i=0; i<8; i++)
        ui->cmbCode->addItem(QString::number(i));

在這裏插入圖片描述

QSpinBox

  • Qt 之 QSpinBox 和 QDoubleSpinBox
    • QSpinBox旨在處理整數和離散值(例如:月份名稱)。如圖所示:圖-1
    • QDoubleSpinBox則用於處理浮點值。如圖所示:圖-2
    • 他們之間的區別就是處理數據的類型不同,其他功能都基本相同。
      圖-1在這裏插入圖片描述
      圖-2在這裏插入圖片描述

setEnabled()

  • 原型:void setEnabled(bool);
  • 所在文件:qwidget.h
  • 這個"選值框"是否啓用setEnabled():
    • 設置成true時,相當於激活了框,框的狀態不再是死的,而是會對觸摸或者點擊產生反應,並且可以響應一些觸發事件。
    • 而設置成false時,框呈灰色的,無論是否可點擊(即使將setClickable()設置成true),都無法響應任何觸發事件。如圖所示:圖-1
      圖-1在這裏插入圖片描述

QThread

sleep()

Windows下

#include <QDebug>      //qDebug()要求的
#include <QTimer>      //QTimer要求的
#include <synchapi.h>  //Sleep()要求的

    QTimer *ti = new QTimer(this);
    ti->start(1000);
    qDebug() << "Start to sleep 10 seconds~~";
    QThread::sleep(10);
    qDebug() << "End to sleep 10 seconds But start to Sleep 15 seconds~~";
    Sleep(15000);
    qDebug() << "End to Sleep 15 seconds~~";

在這裏插入圖片描述
在這裏插入圖片描述

Linux下

QMath

pow()

運用:
二進制字符串轉爲十進制數值

QString val = "0000000010001100";
QByteArray ba = val.toLatin1();
int nVal = 0;
for(int i = 15;i>=0;i--)
{
	if(ba[i] == '1')
    {
		int t = 15-i;
		nVal += pow(2, t);//2的t次冪
	}
}

QDebug

  • qDebug用法總結
  • qDebug 的使用
  • qDebug的用法
    • 經常用到:重定向操作符(<<)
    • 頭文件:#include “qdebug.h” 或者 #include <QtDebug> 或者#include <QDebug>[因爲編輯器原因,將英文半角尖括號符號用了全角的尖括號]
      在這裏插入圖片描述
      在這裏插入圖片描述
	QString chin = "中文繁體";
    qDebug() << chin.toStdString().c_str();

    char da = 'a';
    qDebug("%04x",da);

    qDebug()<<  "MainWindow : Init Completed ";

    qDebug() << "Hello" << 123;

    qDebug() << QString("Hello") << QPoint(10, 10);

    int num = 20;
    char str[20]="hello world";
    qDebug("如果只寫在括號裏,是不需要QDebug頭文件的 %d %s", num, str);

QSettings

QSettings st = new QSettings("qModMaster.ini",QSettings::IniFormat);
//IniFormat存儲格式:'讀寫配置ini文件'可以儲存一些系列配置,即將設置存儲在INI文件中。

QStandardItem

  • QStandardItem_Qt文檔
  • QRowTable表格控件(三)-效率優化之-合理使用QStandardItem
  • 是一個數據結構,它可以存儲一個cell單元格的各種信息,比如文本、圖標、是否可選、字體、別景色、前景色等等。並且QStandardItem可以有孩子和兄弟,它是爲model提供數據存儲的節點。
  • 使用該類:#include “qstandarditemmodel.h” 或者 #include <QStandardItem>
  • 可能用上的void setEditable(bool editable);
    • 說明:若editable爲true,設置表格某列的某項可編輯,若爲false,則不可編輯。

QAbstractItemModel

QStandardItemModel

  • Qt QStandardItemModel用法(超級詳細)
  • QListView,QTreeView和 QStandardItemModel的簡單使用
  • 【QT】模型與視圖,QStandardItemModel and QTreeView
  • Qt 常用類——QStandardItemModel
    • 是標準的基於項數據的數據模型,以類似於二維數組的形式管理內部數據,適合於處理表格型數據,其顯示一般採用 QTableView。
    • 是標準的以項數據(item data)爲基礎的標準數據模型類,通常與 QTableView 組合成 Model/View 結構,實現通用的二維數據的管理功能。
    • 使用該類:#include “qstandarditemmodel.h” 或者 #include <QStandardItem>
    • 爲什麼QStandardItemModel和QStandardItem,引入同樣的頭文件?
      • 因爲在qstandarditemmodel.h頭文件中,定義聲明瞭“class QStandardItemModel”、“class Q_GUI_EXPORT QStandardItem”。
    • 繼承了QAbstractItemModel類 在這裏插入圖片描述
    • 構造函數原型:QStandardItemModel(int rows, int columns, QObject *parent = Q_NULLPTR);
      • 說明:聲明數據模型(表格)有rows+1(說明row是某行的下標)行、columns列,基類是Q_NULLPTR2
      • 注:Q_NULLPTR表示該類(此處指QStandardItemModel)不作爲頂層容器。
    • 可能用上的QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const Q_DECL_OVERRIDE;
      • 說明:取下標爲row的行及第column+1列的QModelIndex()父類類型的值作爲index索引值。
    • 可能用上的void setItem(int row, int column, QStandardItem *item);
      • 說明:row與column從0開始,設置row+1這麼多行column+1這麼多列的項(一項項組合起來成一個表格)。
//在頭文件的類外定義聲明
static const int AddressColumn=0;
static const int ValueColumn=1;

//在cpp中的類的函數中定義聲明
int m_startAddress = 2;//設置開始的索引號從2開始
int m_noOfItems = 4;//讀取指定表格的兩列四行(或者指四項[是"鍵-值"————“addressItem-valueItem”的形式])

for (int row = 0; row < m_noOfItems ; row++) 
{
	//將int類型轉QString類型賦值於QStandardItem的addressItem變量
	QStandardItem *addressItem = new QStandardItem(QString::number(m_startAddress+row));
    model->setItem(row, AddressColumn, addressItem);//設置addressItem放在    row從0開始遍歷的對應行  及   索引號爲0的列  中(即,addressItem放在每行的第一列)
    addressItem->setEditable(false);//設置addressItem項不可編輯,不可雙擊或點擊觸發編輯事件
    QStandardItem *valueItem = new QStandardItem("-");//設置valueItem的值爲字符"-"
    model->setItem(row, ValueColumn, valueItem);//讓valueItem放在每行的第二列
    //valueItem->setEditable(valueIsEditable);//若爲false,調用這個函數的控件不能被編輯,如果設爲true或者不調用這個函數,則控件可以編輯。
}

延伸:C++11中可使用nullptr替代Q_NULLPTR

  • nullptr3表示對象句柄、內部指針或本機指針類型不指向對象(即,空指針)。nullptr空指針常數可以轉換爲任意類型的指針類型。
  • 如圖所示:(Windows的Qt中找到的)
    在這裏插入圖片描述
區別
  • 宏Q_NULLPTR向讀代碼的人說明了意圖,而nullptr向編譯器說明意圖。Q_NULLPTR沒有提供類型安全,僅僅是“裝飾”作用的。若軟件兼容或支持C++11,宏Q_NULLPTR會自動擴展爲nullptr。如果編譯器不支持c++11,它將被替換爲NULL(被替換爲0)。
    • 什麼時候用Q_NULLPTR?
      Johannes Matokic解答的譯文:實際上Q_NULLPTR只有一個目的:允許使用nullptr而不喪失對不支持c++ 11/ c++ 0x的編譯器的支持,因爲直接使用nullptr會導致這種設置中的錯誤。其不利之處在於,與nullptr相比,回退到NULL(或舊Qt版本中的0)可能會導致意外的運行時行爲,並限制所支持的用例。在極少數情況下,你的目標是不兼容c++ 11的編譯器,使用Q_NULLPTR,但是要確保在禁用c++ 11特性時代碼能夠正常工作。在所有其他情況下,nullptr是更好的選擇,因爲它會導致編譯錯誤,而不是與遺留編譯器一起使用時出現錯誤的運行時行爲。Qt 5.7,後來取消了編譯不使用c++ 11的支持,所以如果依賴於這些版本,就不需要Q_NULLPTR。還有其他一些特性,如qMove或Q_DECL_OVERRIDE,它們在支持編譯器時提供了更好的語義,而不會破壞舊編譯器上的編譯。
      Martin Hennings解答的譯文:使用Q_NULLPTR來保持編譯器的獨立性。如果您現在決定使用nullptr,那麼您的代碼將無法使用較舊的c++98編譯器進行編譯。如果決定使用NULL,就會失去c++11類型安全性,即使在當前編譯器中可用。出於同樣的原因,存在qMove(x)等宏以及相應的定義Q_COMPILER_RVALUE_REFS。】

setData()

  • 項目中經常使用該函數,在qstandarditemmodel.h中:
    bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) Q_DECL_OVERRIDE;
  • 將項目在索引index處的角色role數據設置爲值value。
    • 如果成功返回true;否則返回false。
    • 如果數據設置成功,則應該發出dataChanged()信號。
    • 基類實現返回false。這個函數和data()必須爲可編輯的模型重新實現
static const int ValueColumn=1;//在頭文件的類外定義聲明

//在cpp中的類的函數中定義聲明
QStandardItemModel *model = new  QStandardItemModel(0,2,this);
//以代碼所在的該類爲基類,初始化:一行兩列的表格;第一參數,指的是行下標index;第二參數,指的是表格的每行有幾列。

for (int i = 0; i < m_noOfItems; i++)
{
        QModelIndex index = model->index(i, ValueColumn, QModelIndex());
        //取下標爲i,第valueColumn列的QModelIndex類型的索引號
        
        //qDebug() << index << " = index!";
        //若i=0,打印QModelIndex(0,1,0x18da0380,QStandardItemModel(0x18d29be8))  = index!
        
        model->setData(index,"N/A",Qt::DisplayRole);
        //將索引號index行列要顯示出來(DisplayRole角色屬性)的值設置爲"N/A",
}

data()

  • 用了setData(),怎麼少的了用data()函數?
  • 在qstandarditemmodel.h中,原型:QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const Q_DECL_OVERRIDE;
  • 說明:返回由索引index(表格的行索引號從0開始)引用的項的給定角色role(默認爲Qt::DisplayRole)下存儲的數據。

QTableView

  • 若只使用QStandardItemModel,會遇到個表格問題,將十進制轉16位的二進制後,表格的列不能自動調整大小!
    在這裏插入圖片描述
  • 此時,使用QTableView再好不過了!
//根據內容自動調整所有列的列寬
//設置表格的列與內容相匹配
ui->tblView->resizeColumnsToContents();
//我將放在mainWindow.cpp的某函數中,起作用了呀!
//【若你的未起作用,可以看看第三篇文章,或許對你有幫助】

QTableWidget

QTreeView

參考:

QTreeWidget

參考:

繼承了QTreeView類:
在這裏插入圖片描述

QItemSelectionModel

QMessageBox

  • 消息對話框,用於顯示提示、警告、錯誤等信息,或進行確認選擇。
  • Qt 5種標準對話框及使用方法詳解【其中一種就是QMessageBox】
  • 原型:static StandardButton critical(QWidget *parent, const QString &title, const QString &text, StandardButtons buttons = Ok, StandardButton defaultButton = NoButton);
  • 說明:被用於保留嚴重錯誤。彈出警告(有紅×的圖標)窗口,第一參數表示父類是this(MainWindow該類),這樣的話將窗口彈在父類“主窗口”的前面居中位置,而且窗口是模式的,第二參數是窗口的標題,第三參數是窗口彈出的內容,第四參數表示未賦值的話,默認(缺省)按鈕的文本爲OK,第五參數是缺省選擇的按鈕,缺省表示沒有選擇(該參數沒什麼用)。
    在這裏插入圖片描述
//彈出窗口最多有三個按鈕,超三個就會報錯!
QMessageBox::critical(this, "Request failed","Add items to Registers Table.","Ready","Cancel","Close");
//設置三個或者兩個按鈕後,右上角的紅×都是失效的!
//默認第一個按鈕亮起藍色框,按鈕文本可以用中文表示

//只有設置一個按鈕或者使用默認按鈕OK的時候,右上角的紅×纔是有效的!
QMessageBox::critical(this, "Request failed","Add items to Registers Table.","Ready");

在這裏插入圖片描述
在這裏插入圖片描述

QString errorDetails = "404";
第三參數可以是:(拼接的字符串)
QString("An internal error occurred. Please ") +
"call technical support at 123456789 and report\n"+
"these numbers:\n\n" + errorDetails +
"\n\n<Application> will now exit."

critical() 與 Critical

  • 都在qmessagebox.h中定義。
  • QMessageBox::Critical用來顯示Critical圖標。而QMessageBox::critical()函數應用於保留嚴重錯誤。
    在這裏插入圖片描述
    在這裏插入圖片描述在這裏插入圖片描述

QPushButton

setChecked()

  • 原型:void setChecked(bool);
  • 所在文件:qabstractbutton.h
  • 說明:設置選中狀況。會影響click、toggled觸發事件的bool值。
  • 實操情景:若設置true,就一直是選中狀態(怎麼點,都是藍色按鈕),不可變換按鈕文本,觸發不了toggled事件,但能觸發clicked事件。
  • QCheckBox也有該函數,選中是“勾選複選框”狀態。
    在這裏插入圖片描述

isChecked()

  • 原型:void setChecked(bool);
  • 所在文件:qabstractbutton.h
  • 說明:提示按鈕是否已經標記、已選中;返回按鈕的狀態,已選中:返回值爲True;未選中:返回False。大多用於“判斷”。

setCheckable()

  • 原型:void setCheckable(bool);
  • 所在文件:qabstractbutton.h
  • 說明:設置按鈕是否能夠被選中;若設置爲true,表示能選中該按鈕,但出現選中變藍再選中變米白色的情況,不是這個函數控制的,而是setChecked函數控制,默認點一次,setChecked(true)變藍,反之亦然。
  • 實操情景:如果設置True,則表示按鈕將保持已點擊(變藍色)和釋放狀態,只要再點一次,按鈕可從藍色變正常色;若爲false,按鈕不可點擊。
ui->btTest->setCheckable(false);//表示btTest按鈕不可選中,特徵:呈灰色,不可點擊

在這裏插入圖片描述

繪圖類

QPixmap、QImage、QBitmap、QPicture

QIcon或QLable縮放 QPixmap的自適應

QPainter 及其使用

QPalette調色板

setAutoFillBackground

const

virtual

moc,Q_OBJECT

  • 官方解釋:Q_OBJECT宏必須出現在類定義的私有部分中,該類定義聲明自己的信號和插槽,或者使用Qt的元對象系統提供的其他服務
  • mocOrmoc
  • Q_OBJECT宏的作用
  • QT中添加Q_OBJECT出現的問題【多重繼承時QObject一定要放在最前面】
    • [該文章的譯文:剛收到這個錯誤消息而編譯一個小類,它來源於QTreeWidgetItem:錯誤C2039:“staticMetaObject”:不是’QTreeWidgetItem’的成員。這就是說QTreeWidgetItem不是從QObject繼承的,這意味着您自己的單繼承類也不是從QObject繼承的。繼承QObject是使用Q_OBJECT宏的先決條件之一,如果您和我一樣,您可以自動地將Q_OBJECT宏插入到任何與Qt GUI相關的類中。如果您沒有在子類中使用任何元對象,例如信號/插槽或屬性,那麼只需取出Q_OBJECT宏。如果您需要使用信號和插槽,您還需要使您的子類從QObject中多次繼承。如果您採用這種方法,請記住,多重繼承要求QObject位於第一,否則您將得到與上面相同的錯誤,或者類似於您的類從moc的兩個QObject子類繼承]

emit,signal,slot

emit

  • 發出信號(A類信號函數)
  • 連接信號(A類信號函數)與槽(B類或本類槽函數)
  • emit也可以向一個已定義的信號函數提供參數
  • emit無非就是告訴編譯器編譯的時候A類信號函數 的定義實現在另一個地方(A類),從B類的connect方式中可以找到。
A類:
.h裏:
Q_SIGNALS:
	void SShowB();
.cpp裏:
按鍵釋放事件函數裏:
switch (event->key()){
	case Qt::Key_M:{
		hide();//隱藏當前或A類窗口
		emit SShowB();
	}
}
B類:
.h裏:
private:
	A a;
	B b;
public slots:
	void SlotShowThisWindow();
.cpp裏:
在構造函數裏:
connect(&a,SIGNAL(SShowB()),this,SLOT(SlotShowThisWindow()));//顯示當前窗口
聲明SlotsShowB函數:
void SlotShowThisWindow(){ 
	show(); //顯示當前或B類窗口
}

信號與槽的連接關係 sender()函數

Q_SLOTS Q_SIGNALS namespace

Q_PROPERTY

Q_UNUSED

Qsrand與Qrand

如:【Qt獲取隨機數qsrand和qrand

比如使用QT獲取0-10之間的隨機數
 
#include <ctime>
 
//這裏以時間爲種子
qsrand((quint32)time(0));
int res  = 0+qrand()%10;

這兩句不太明白什麼意思

qsrand(QTime::currentTime().msec()); //取時間作爲產生隨機數的種子
timer->start(qrand()%5000+1000);//qrand()%5000+1000是產生一個在 1000-6000間的數,timer->start()是根據上述產生的數值來啓動定時器

QRectF QRect

QPoint與QPointF

QSize

QRect QSize QPoint 的使用

數學計算函數

QFile常用函數及使用

QDir

mkpath和mkdir的區別

代碼實現創建文件夾功能

代碼實現刪除文件夾

Dialog

FileDialog

容器類

在學習STL風格迭代器的兩種分類(“QMap與QHash”)時,要接觸的知識點【時間複雜度爲主】

explicit與implicit

globalPos()與pos()

函數 描述
globalPos() 給出的座標信息是相對於桌面的,即以桌面左上角爲原點。
pos() 是相對於窗口的,以窗口左上角爲原點(去除邊框)。

TextEdit

typedef

qreal

鍵盤事件

鍵盤事件之回車事件Qt::Key_Return與Qt::Key_Enter

界面刷新

解決亂碼

線程

異常/問題

“collect 2:error :ld returned 1 exit status”

編寫串口軟件出現的異常

D:…\mainwindow.cpp:20: error: undefined reference to `SPComm::isOpen() const’

  • 說明SPComm類的isOPen()函數沒有定義
    • 解決:在cpp裏寫入即可:
bool SPComm::isOpen() const
{
    if(m_serialPort->isOpen())
        return true;
    else
        return false;
}

在這裏插入圖片描述

D:…\debug\spcomm.o👎 In function `ZN6SPCommC2EP7QObject’:

在這裏插入圖片描述

  • 解決:在pro文件加上"QT += serialport"

“munmap_chunk(): invalid pointer”

“error: ‘tr’ was not declared in this scope”——“tr”未在此作用域中聲明

“: -1: error: 沒有規則可以創建“mainwindow.o”需要的目標“…/qt_battery/ui_mainwindow.h”

  • 報錯來源:
    在qt_battery項目目錄下打開終端進行qmake和make編譯,生成了項目的Makefile、.exe文件、moc_xxx.cpp文件、xxx.o、moc_xxx.o文件,之後做某些操作(身爲小白的我,沒有習慣在終端指定項目目錄下編譯,但這個‘所謂的某些操作’之前必須要先編譯),完成後,我在終端執行“make clean”指令,將.o文件清空,並將剩下的文件(除了xxx.cpp xxx.h xxx.pro)放入回收站,然後在Qt中調試模式運行qt_battery程序調試按鈕,在控制檯中出現該異常了
  • 解決:
    缺什麼給什麼,編譯過的項目,就不能像“沒在終端編譯過,沒生成.o文件,也可直接在Qt軟件中調試運行,程序能照常運行”的項目了,必須“qmake和make編譯”產生Makefile、.exe文件、moc_xxx.cpp文件、xxx.o、moc_xxx.o文件之後,纔去Qt軟件中調試運行。
    在這裏插入圖片描述
  • 若項目簡單,沒有“界面文件”(就不會在某.cpp中加入" #include “ui_mainwindow.h” "),則不會報這個錯。

“Project ERROR: Unknown module(s) in QT: declarative”

  • 接觸的這個項目是從別人那拷貝的,因爲環境配置(有人另稱爲交叉工具鏈【我虛擬機Linux裏的Qt使用的是GCC編譯器套件】)不同,彈出了這異常,導致不能正常執行該程序(下面第三張圖,按鈕呈灰色,表示不能運行程序)
    在這裏插入圖片描述
    在這裏插入圖片描述
    在這裏插入圖片描述

  • QT中的未知模塊:聲明性的/Unknown module(s) in QT: declarative在這裏插入圖片描述
    【可參考:QtDeclarative module
    在這裏插入圖片描述
    以上都沒有說怎麼解決,我就自個找找看:在xxx.pro文件中將"QT += declarative"代碼註釋(加“#”表示註釋),就不會出現該異常,但有新的異常出現了。。。在這裏插入圖片描述

  • 補充:

    一個異常解決了之後還有新的異常,可能存在某些原因:項目涉及底層程序或某些驅動程序,不好註釋更改,又或者富有複雜性、移植性不高,不易配置相應的庫或環境配置。。。但是“辦法總比問題多”,吼~嘎油!
    GCC:GCC(GNU編譯器套件)常用簡要介紹、GCC編譯器(Linux gcc命令)30分鐘入門教程

“ error: ‘class Ui::MainWindow’ has no member named ‘timerLabel’ ui->timer ”

  • 有人這麼解決的:C語言,C++編譯遇到問題:has no member named ''XXX‘
  • 而我的解決方式:
    • 分析:“異常的意思是:主窗口的ui界面沒有timerLabel標籤控件”,
    • 找問題:“QLabel控件有名字爲timerLabel的!”,
    • 解決:在對應項目文件夾下----》在空白處右擊鼠標彈出菜單----》選擇打開終端,編譯一遍:“qmake”、 “make clean”、 “make”(接着我關閉項目,重新載入項目【若編譯之後運行還是出現了異常,則多做這個步驟】),然後運行,異常解決了
  • 補充:

“deprecated conversion from string constant to ‘char*’ [-Wwrite-strings] char *i2c_device = “/dev/stm32_control”;”

“QObject::connect: No such slot QLabel::valueChange2() in …/batteryDisplay/m。。。”(即:“QObject::connect: No such slot Xxx…”)

“/qopengl.h:140: error: GL/gl.h:沒有那個文件或目錄”

“error:forward declaration of class”

“Project ERROR: Unknown module(s) in QT: opengl”

“: -1: warning: TARGET is empty”

在這裏插入圖片描述

“Signal received The inferior stopped because it received a signal from the operatina system.”

  • 異常譯文:下級停止,因爲它收到了來自操作系統的信號。

Signal name : SIGSEGV Signal meaning : Segmentation fault"

“libpng warning: iCCP: known incorrect sRGB profile”

C:…\項目名2.0.0.20161005\forms\about.cpp👎 warning: C4819(編碼問題)

“glibc detected”

快捷鍵

  • 當使用Qt時,快捷鍵的使用是必不可少的,而且提高不少的工作效率呢~

常用

快捷鍵 意義 備註
Ctrl+X 剪切選中範圍
Ctrl+V 粘貼
Ctrl+C 複製
Ctrl+O 打開文件
Ctrl+S 保存修改內容
Ctrl+N 彈出“新建項目”窗口
Ctrl+↑ 滾動條向上 (Ctrl+↓作用與之類似)
Ctrl+← 焦點在的那行,若在單詞或詞組後,會出現在單詞或詞組的前面 (Ctrl+→作用與之類似)
Ctrl+/ 在選中部分區域的頭和尾加上"/* */",在選中整個函數代碼或語句塊代碼的每行前面加上"//“註釋符號,若沒有選中區域,在光標所在的行加上”//",若已經有"註釋符號",快捷鍵之後會取消"註釋符號"
Ctrl+Z 撤回[向前撤回]
Ctrl+Shift+Z 重寫[向後重寫] 一般用Ctrl+Y表示向後撤回,但Ctrl+Y好像不是重寫作用,反正按了沒有反應
Ctrl+回車Enter 光標只要在該行(無論是代碼前還是代碼中或尾),快捷鍵之後,該行的下一行出現空行,光標出現在空行中
Shift+回車Enter 光標在整行代碼前面,快捷鍵之後在該行的上一行會插入空行,但光標還在該行代碼前面 其實與回車Enter效果一樣
Shift+Ctrl+回車Enter 光標則與上面的相反了,只要在該行(無論是代碼前還是代碼中或尾),快捷鍵之後,該行的上一行出現空行,光標出現在空行中
Shift+’ 在選中區域的頭與尾加上雙引號"" 注意:一定在英文輸入的雙引號纔有這樣的快捷鍵效果
Tab 若未選中代碼,光標在代碼中,相當於“空格”的作用,會在光標前空一格或兩格或四格;光標在代碼最前面,會在光標前空四格 ,整行代碼往後走。若選中代碼,整體都會向後走,每行代碼最前多四格空格 Shift+Tab是其反向操作
Shift+Tab 若未選中代碼,光標在代碼中,會將光標前的空格清除;光標在代碼最前,會將光標的該行向前減少四個空格。若選中代碼,整體會向前走,每行代碼減少四個空格 與Tab是反方向的作用
Ctrl+Tab 當前窗口與前一個窗口的跳轉
Ctrl+H 選中某部分改過的代碼,按快捷後,會打開Diff窗口,比較選中代碼範圍或文件的差異 如圖:kj-01(紅色部分是改之前的代碼,綠色部分是已改的代碼)
Ctrl+F 若未選中單詞,會自動捕捉光標附近的單詞,若選中整個語句,會出現淡藍色背景的框 框住選中的語句,彈出Find小窗口進行查找 如圖:kj-02(第一張圖,選中的值有重複的,呈黃色,第二張圖,選中範圍,有重複的背景呈黃色,無重複的呈淡藍色背景)
Ctrl+A 選中當前文件的所有內容
Ctrl+B 對當前項目所有文件進行“遍歷編譯檢查”,系統查看是否存在問題,若存在問題,會在問題控制檯呈現。若有代碼修改未及時保存,它會彈出提示“以下文件有未保存的修改【如圖:kj-16】” 如圖:kj-03
Alt+D 彈出調試菜單的子菜單項 如圖:kj-04
Alt+E 彈出編輯菜單的子菜單項 如圖:kj-05
Alt+F 彈出文件菜單的子菜單項 如圖:kj-06
Alt+B 彈出構建菜單的子菜單項 如圖:kj-07
Ctrl+T 彈出運行項目的構建項 如圖:kj-08
Alt+T 彈出工具菜單的子菜單下 如圖:kj-09
Alt+W 彈出控件菜單的子菜單下 如圖:kj-10
Alt+H 彈出幫助菜單的子菜單下 如圖:kj-11
Ctrl+I 選中部分代碼,相當於做了一次“Shift+Tab”操作,按了一次,對同樣代碼按第二次第三次都不會有反應的
Ctrl+J 若未選中代碼,按了快捷鍵,將光標所在行與下一行之間的空格清除;若選中部分代碼,按快捷鍵後,會將代碼中的所有的空格清除,只留下有意義的空格,變成簡化的代碼行 如圖:kj-12(第一張是按鍵前,第二張是選擇範圍按鍵後)
Ctrl+K 打開項目文件搜索欄,可以進行文件名的搜索 如圖:kj-13(第一張是按鍵後,立馬彈出的樣子;第二張是進行搜索的樣子)
Ctrl+L 好像沒什麼用,光標出現在代碼中(可選中代碼,也可不選擇代碼),按這個快捷鍵,文件搜索欄會出現“l <line>:<column>”(因爲該編輯器問題,將半角的英文"<>"改用全角的尖括號);若光標不在代碼中,而是選中某個文件或文件夾,按鍵後並沒有反應 如圖:kj-14
Ctrl+M 在光標所在行(無論有沒有選中代碼),按一次快捷鍵,會在行數標誌旁加“書籤”圖標;再按一次,取消“書籤”圖標 如圖:kj-15
Ctrl+Q 退出Qt窗口(關閉Qt軟件)。若你不小心按到,而且剛剛修改的代碼未保存,它會彈出提示“以下文件有未保存的修改” 如圖:kj-16
Ctrl+R 按鍵後,對【如圖:kj-17】的紅圈圈起的已選中的項目重新構建,相當於“Release(Run)”運行發佈操作。若有代碼修改未及時保存,它會彈出提示“以下文件有未保存的修改【如圖:kj-16】”
Ctrl+U 若未選中代碼範圍,光標在某單詞“前、中、後”,會自動選中單詞;關閉在標點符號或標號 “前、中、後”(反正光標不在單詞旁),會自動選中標號的 該行 / 整段語句塊 / 整段語句
Ctrl+W 將當前文件關閉
F1 Windows端Qt中:若選中某函數後按鍵,會在最右邊擴展出“幫助”欄,其中是對應的函數解釋,如圖所示:18-01圖一;若無選中,操作變得無意義,擴展的“幫助”欄:顯示“沒有可用文檔”,如圖所示:18-02圖二;Linux端Qt中:若選中某函數按鍵,直接跳轉“幫助”項的窗口,查看對應函數解釋 如圖:kj-18
F2 若選中“函數名”或"類名",按鍵後跳到對應的“.h”頭文件;若選中“變量名”,按鍵後跳至“定義”之處;若選中“控件名”,按鍵後跳至“ui_mainwindow.h”頭文件

kj-01:
在這裏插入圖片描述
kj-02:
在這裏插入圖片描述
在這裏插入圖片描述
kj-03:
在這裏插入圖片描述
kj-04:
在這裏插入圖片描述
kj-05:
在這裏插入圖片描述
kj-06:
在這裏插入圖片描述
kj-07:
在這裏插入圖片描述
kj-08:
在這裏插入圖片描述
kj-09:
在這裏插入圖片描述
kj-10:
在這裏插入圖片描述
kj-11:
在這裏插入圖片描述
kj-12:
在這裏插入圖片描述
在這裏插入圖片描述
kj-13:
在這裏插入圖片描述
在這裏插入圖片描述
kj-14:
在這裏插入圖片描述
kj-15:
在這裏插入圖片描述
kj-16:
在這裏插入圖片描述
kj-17:
在這裏插入圖片描述
kj-18:
18-01圖一:
在這裏插入圖片描述
18-02圖二:
在這裏插入圖片描述

參考

Linux中命令

  • 我這邊:命令大多在“ Tera Term【是支持UTF-8協議的開源自由軟件終端仿真器,是串口調試工具】 ”軟件上輸入,連接開發板與虛擬機VWM裏的Linux,做橋樑搭建連接
  • 有個快捷鍵必須知道:
    • Tab鍵
      • 輸入文件名或項目名的開頭字母,按Tab鍵,會自動匹配開頭字母相同的名稱
      • 若有多個前幾個字母都相同的名稱,則要多寫些字母,最好具有唯一性,這樣匹配度更高:
      有i2c_abcd,i2c_bcde,i2c_cdef三個文件,
      則輸入“i2c_a”之後按Tab鍵,自動匹配i2c_abcd名字;
      若輸入"i2c_"之後按Tab鍵,不會匹配任何名字;
      若輸入"i"之後按Tab鍵,自動匹配i2c_相同部分。
      PS:若跳轉某目錄,輸入目錄名時,按Tab鍵,可能會根據“已輸入的字母開頭”找到相同字母開頭相同的名字,可能沒有一點反應。
      

常用

Linux指令 意義 備註
cp -R或-r或忽略 Test或/test/Test /home或/home/或/home/Test2 複製本目錄下的Test文件或test目錄下的Test文件至home目錄下 或 home目錄下並改名爲Test2文件(可以指定Test文件是哪個目錄下的某文件,自動新建或覆蓋)。 Test、Test2:文件名;test:目錄名;home:把複製的文件放入指定目錄的目錄名 ;"-R"或"-r"可忽略、也可二選一。 Linux-001至003
cd / 進入根目錄,最上級目錄。
cd . . 進入本目錄的上級目錄。 點點之間不可出現空格。
cd test 或 cd /test/ 或 cd /test 或 cd /test/test1/test2 進入本目錄的test目錄 或 根目錄下的test目錄或 根目錄下的test的test1的test2目錄。
mkdir Test 或 mkdir /home/Test 在本目錄創建新文件夾或在根目錄下的home目錄裏新建文件夾。 目錄名不可與同級文件或文件夾重名。 Linux-004
touch Test 或 touch Test.ini 或 touch Test.txt 或 touch /home/Test 或 touch home/Test 或touch /home/test1/test2/Test 或 touch /udisk/yuv6 /udisk/yuv7 在本目錄下新建Test或Test.ini或Test.txt普通文本文件 或者 在根目錄下的home目錄裏新建Test文件 或者 在根目錄下的home的test1的test2目錄下新建Test文本文件 或者 在根目錄的udisk目錄裏新建yuv6和yuv7兩個文件。 若touch home/Test新建時出現提示:touch: home/Test: No such file or directory則改用“touch /home/Test”命令,因爲本目錄沒有叫home的目錄。若同時新建多個文件,就以空格相隔。 Linux-005
rm -f /home/Test 或 rm yuv7 yuv3 刪除home文件夾下的Test文件 或者 刪除本目錄的yuv7和yuv3文件 若文件是有後綴的,在指令中的文件名部分就要補上後綴名;-f可忽略。 Linux-006
rm -rf /home/test 刪除home文件夾下的test文件夾;若test目錄含文件和文件夾的話,則作用是:刪除test文件夾及其含有的文件或文件夾。 r是遞歸處理,f是強制刪除;一旦刪除了一個文件,就無法再恢復它。 Linux-007
rm *.ini *.jpg 刪除當前目錄的所有.ini和.jpg後綴的文件
more mxx.ini 將文件從第一行開始,根據輸出窗口的大小,適當的輸出文件內容,只能向後翻(怎麼翻頁在文章中有表述,但沒實操過)。 若文件是有後綴的,在輸入指令時文件名要補上後綴名。 Linux-008
less mxx.ini 或 less passwd 可以向前或向後翻看文件(退出查看,按“Q或q”鍵),less的用法比起more又更加有彈性。 若文件是有後綴的,在輸入指令時文件名要補上後綴名。 Linux-008
ps 查看當前所有進程。 Linux-009
ls 查看當前目錄的所有文件、文件夾,結果顯示一般爲:文件或文件夾的名字和圖片視頻的名字加後綴名。
killall pinchzoom或其他程序名稱 關閉正在運行的名爲pinchzoom的程序(一般開發板開機默認運行pinchzoom程序[在背景圖——奶酪上有一羣老鼠亂跑];若要進行其他程序,最好用該命令強制關閉之後纔去運行指定的程序)。 Linux-010
kill -9 1444或進程號PID或1444 1445 關閉指定進程號的進程,必須指定進程號PID;否則,如圖所示:Linux-011。 Linux-012
./T3QQ (在開發板上)運行當前目錄/當前文件夾下T3QQ程序,若要退出程序,一般用“Ctrl+C”快捷鍵就可以關閉當前程序。
./T3QW & (在開發板上)的後臺執行,補:一般使用Ctrl+C可以退出程序,但,在放入後臺執行的情況下,想完全關閉程序,只能kill或killall進程,才能真正的關閉程序。 Linux-013
ifconfig 查看網絡IP地址(必須有網,結果會出現eth1或eth0、lo;若無網,只存在lo:127.0.0.1,但對於仿真工作來說這是無意義)。
ifconfig eth1 192.168.XXX.XXX 修改eth1的ip地址爲’192.168.XXX.XXX’。
reboot 重啓。
vi 文件名(如:xxx/xx.ini) 查閱文件內容,按"小寫i或大寫I",可編輯文件內容,即進入編輯模式,**按"Esc"表示退出編輯模式(若沒有進入編輯模式,則爲無效按鍵指令),按(必須是英文符號)“:q!“表示不保存並結束查看,與按”:wq”**表示保存並結束查看。 vim指令也是這樣,若輸入之後,出現如圖所示:Linux-015這樣的情況,換成vi命令即可(哪個簡單哪個來嘛~)。 Linux-016
init 0 在終端輸入該指令,表示停機或關機(千萬不能將initdefault設置爲0)。
init 6 重啓(千萬不要把initdefault設置爲6)。
init 1或2或3或4或5 不經常用,但分別表示‘單用戶模式,只root用戶進行維護’ ‘多用戶模式,不能使用NFS(Net File System)’ ‘完全多用戶模式(標準的運行級別)’ ‘安全模式,一般不可用’ ‘圖形化(即圖形界面)’ 。
devmem ADDRESS [WIDTH [VALUE]] 應用層可以使用devmem工具訪問物理地址,得到指定地址(寄存器)的數據;ADDRESS 是地址;WIDTH是結果的寬度,默認爲32位,可以忽略;VALUE可以忽略,一般不使用。 如:devmem 0x44e07134 32[busybox devmen表示查看devmen配置] Linux-017
du
  • Linux 基礎學習2linux中各種文件的顏色表示是什麼意思?LINUX裏各個顏色文件名代表什麼LINUX文件名顏色代表意義
    • 綠色:代表可執行文件、可執行的程序(.jpg、.png、.c、.exe、.yuv等);紫色或藍色:代表文件夾、目錄;天空藍色/淺藍色:代表鏈接文件,主要是使用ln命令建立的文件,可以直接用cd xxx直接跳轉查看目錄;紅色:代表壓縮文件或者包文件; 白色:普通文件(.ini、.txt、.conf、.wac等)
      在這裏插入圖片描述
      在這裏插入圖片描述
  • Linux-001:
    home 與 mnt 是同級目錄/文件夾;一個點’.‘表示當前目錄,兩個點’ . .’(中間不可出現空格)表示上級目錄。當cp Test .時,會報提示,表示當前目錄有Test的文件了,不可複製粘貼。
    Linux-001
  • Linux-002:
    cp -r . ./Test /home表示將本目錄的上級目錄下的Test文件複製到home目錄下。
    Linux-002
  • Linux-003:
    查看了udis目錄下無任何文件或文件夾,將mnt目錄下的Test文件的內容複製到udisk目錄下的Test2文件中。
    Linux-003
# cd /lib32/dhcpcd/
# ls
dhcpcd-hooks      dhcpcd-run-hooks
# cd /lib32/dhcpcd/dhcpcd-hooks/
# ls
01-test         02-dump         20-resolv.conf  30-hostname
# cd ..              				   ------[1]
# ls
dhcpcd-hooks      dhcpcd-run-hooks
# cd /lib32/dhcpcd/dhcpcd-hooks/
# cp ../dhcpcd-run-hooks /home/hooks   ------[2]
# cd ..
# ls
dhcpcd-hooks      dhcpcd-run-hooks
# cd /home
# ls								   ------[3]
Rear_Center.wav  T3QTDlg          hooks            i2c_axp22_test
#

[1]:查看dhcpcd-hooks的上級目錄dhcpcd
[2]:與dhcpcd-hooks目錄同級的dhcpcd-run-hooks的文件(即上級目錄dhcpcd裏的dhcpcd-run-hooks文件)複製到根目錄下的home目錄,改名爲hooks(無該文件就新建,若有則覆蓋)
[3]:到根目錄下的home目錄,查看文件,發現多了個hooks文件,複製成功!

  • Linux-004:
    到根目錄的media的mmcblk0p1的DCIM目錄,新建與DCIM同級的my2文件,若進入DCIM上級mmcblk0p1目錄,創建目錄my2,會彈出提示:不能創建目錄my2,因爲文件已存在。
    在這裏插入圖片描述
  • Linux-005:
    到根目錄,查看文件,touch udisk/yuv7:在本目錄的udisk目錄裏創建yuv7文件,進入udisk目錄查看文件,只有touch /udisk/yuv8才能創建文件成功,因爲udisk本目錄沒有udisk文件夾,只有yuv2目錄,udisk是根目錄下的目錄,所以要加上“/”斜槓 。
    在這裏插入圖片描述
  • Linux-006:
    在根目錄下的media的mmcblk0p1目錄時,刪除yuv6與yuv7文件,只有yuv6刪除成功,因爲“/ . . /udisk/yuv6”(最好是//udisk/yuv6,好理解)代表 根目錄的udisk目錄的yuv6文件;若在udisk目錄,輸入指令rm -f /…/udisk/yuv …/udisk/yuv8,兩個文件刪除成功,和 rm yuv7 yuv3 一樣刪除成功。
    在這裏插入圖片描述
    在這裏插入圖片描述
    在這裏插入圖片描述
  • Linux-007 :
  • Linux-008 :
    在這裏插入圖片描述
  • Linux-009:

在這裏插入圖片描述
在這裏插入圖片描述

  • Linux-010:
    圖1:WriteOnlyTest程序在後臺運行,圖2:查看進程,圖三:在進程結果中發現“WriteOnlyTest程序”正在運行,然後使用killall WriteOnlyTest指令關閉WriteOnlyTest程序,然後再用ps指令查看進程,判斷是否關閉成功,圖四:發現進程關閉成功了。
    在這裏插入圖片描述
    在這裏插入圖片描述
    在這裏插入圖片描述
    在這裏插入圖片描述
  • Linux-011:
    在這裏插入圖片描述
  • Linux-012:
    圖1:查看進程,圖二:在進程結果中發現“WriteOnlyTest程序”正在運行,接着再運行一個WriteOnlyTest,看下是否獨立運行,圖三:發現兩個同名程序獨立且互不干擾的運行着,然後使用kill -9 1549 1555指令關閉兩個程序名爲WriteOnlyTest的進程,然後再用ps指令查看進程,判斷是否關閉成功,圖四:發現進程關閉成功了。在這裏插入圖片描述
    在這裏插入圖片描述
    在這裏插入圖片描述
    在這裏插入圖片描述
  • Linux-013:
    在這裏插入圖片描述
    在這裏插入圖片描述
  • Linux-015:
    在這裏插入圖片描述
  • Linux-016:
    在這裏插入圖片描述
    在這裏插入圖片描述
  • Linux-017:
    在這裏插入圖片描述

參考

Linux其他

自定義控件及其他Qt使用例子

Qwt儀表盤

同一小編的文章

QProcess

Mplayer

暫停功能

process->write("pause\n");//但是放入項目中,無效,不知道其他人是不是也這樣

FFmpeg

  • 這個播放器與QProcess類無關,但是與Mplayer有關

暫停功能

獲取CPU序號

參考:

Java,C++,C某些的比較

枚舉

數據類型

C++ 與 Java 數據類型的區別

QTimer QTime QDateTime QDate 對應時間格式

其他

C語言的strtoul函數

  • strtoul函數的使用,揭開其神祕面紗
  • C 庫函數 - strtoul()
  • 原型:unsigned long strtoul(const char *nptr,char **endptr,int base )
  • 說明:參數一:字符串起始地址,要轉換爲無符號長整數的字符串;參數二:返回字符串有效數字的結束地址(此處體現二級指針的好處),對類型爲 char* 的對象的引用,其值由函數設置爲 str 中數值後的下一個字符;參數三:轉換基數(10:轉成十進制),必須介於 2 和 36(包含)之間,或者是特殊值 0。
const char *axpv1 = "0x34";
int dev_addr = strtoul(axpv1,NULL,0);

C語言的tcgetattr函數

C語言的ioctl函數

Qt Assistant

指針及運算符

  • 指針:是存放變量地址的;用來訪問變量地址。

[]運算符

*、&運算符

酒店,404號房是黑白主題的房間,
	p就是404號,表示門牌指向的第四層的4號房(房間地址),
	*p就是讓我們得知房間內容——黑白主題的窗簾桌子牀,
	&p就是讓我們得知門牌——404號。
a = 3;                     //將賦值爲3    
c = &a;                    //把a的地址賦值於c
d = *c;                    //取出c存放a地址中的值,並賦值給d
printf("d = %d",d);        //打印d

輸出爲:     d = 3

++運算符運算順序

序號 指針 運算順序 備註
1 *p++ 先返回 *p的值,然後p再++。
2 (*p)++ 先返回 *p的值,然後 *p的值再++。
3 *(p++) 先返回 *p的值,然後p再++。 也就是說它和 *p++的運算順序一樣。
4 ++*p 先將 *p的值++,然後再返回 *p的值。
5 ++(*p) 先將 *p的值++,然後再返回 *p的值 它和++ *p是一樣的。
6 *(++p) 先將p的值++,然後再返回 * p的值 它和 *++p是等價的。

1~3三組 是先返回 *p的值,區別就在於到底是p++還是 *p的值++。
4~6三組 是最後都是返回 *p的值,不同點在於是 *p先++還是p++。

運算符重載

成員運算符(.)和指針運算符(->)

Human Tom;
Human* p;
p = &Tom;
Tom.BirthDay = "1969“;
Tom.IntroduceSelf();
效果等價於:
p->BirthDay = "1969";
p->IntroduceSelf();

邏輯、移位運算符

打包發佈

全志平臺T3

typedef enum //定義枚舉
{
	DISP_BT601  = 0, //用於標清視頻
	DISP_BT709  = 1, //用於高清視頻
	DISP_YCC    = 2, //用於圖片
}disp_color_space;

Qt調度器

Qt看門狗

Qt5串口收發數據(通信)

  • QSerialPort4

Qt5版本之前

動態變化的例子

挑戰

隨便看看


  1. Qt小傳——從誕生到發展、繁榮Qt公司——全球百科Qt深入淺出(一) 從零開始寫Qt應用Qt的版本歷史 ↩︎

  2. Qt構造函數的參數:QObject *parent = Q_NULLPTR ↩︎

  3. nullptr和NULLNULL與nullptr ↩︎

  4. QSerialPort Class——Qt文檔 ↩︎

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