1. 程式人生 > >C++/Qt的知識點

C++/Qt的知識點

(這是工作中常用到的一些東西,收集到了一起,用的多了就慢慢記住了一些,對於不熟練的參考價值有一些。有些莫名其妙的東西是記錄的自己工作的,可以無視。)

目錄:

3、Qt控制元件相關... 2

1、ComboBox. 2

(1)combobox設定內容... 2

(2)讀取選取值... 2

(3)值發生變化... 3

(4)設定屬性... 3

2、QPushButton. 4

(1)button設定懸停提示... 4

3、QMessageBox. 4

4、QLabel顯示檔案路徑過長... 5

5、選中使邊框變色--Qt::FocusPolicy. 5

6、QTimer::singleShot 5

7、Qt樣式設定... 6

(1)QDialog或者QWidget 6

(2)滾動條QScrollBar. 6

(3)QLabel 7

(4)QTextEdit 7

(5)QPushButton或QToolButton. 7

(6)QComboBox. 8

(7)QCheckBox. 9

(8)QRadioButton. 10

(9)QSpinBox. 11

(10)QTreeView.. 12

8、QToolTip. 13

9、QTreeView目錄按建立時間排序... 13

4、C++處理... 13

1、正則表示式... 13

2、格式轉化... 15

(1)char*轉QString. 15

(2)QString轉char*. 15

(3)QString轉換string. 15

(4)string轉化為QString. 15

(5)string轉化char*. 16

(6)char*轉化為string. 16

(7)int/float/double轉QString. 16

(8)QString轉int/float/double. 16

(9)QString轉wstring(QString 轉 BSTR)... 16

(10)BSTR轉QString. 17

3、常用巨集... 17

1、Q_DECL_EXPORT巨集... 17

4、c++謂詞函式和仿函式... 17

5、C++ std::tr1::shared_ptr. 18

6、QVariant 18

7、QDateTime與QString. 18

8、動畫... 18

9、QTextEdit 19

(1)限制輸入字數... 19

(2)QLineEdit限制最大輸入字數... 20

10、QTreeWidget 20

(1)重新命名時限制輸入字數... 20

(2)新建樹節點的命名限制... 20

(3)設定不可雙擊修改... 21

5、Bug記... 21

1、0xC0000005: 讀取位置 0xcccccccc 時發生訪問衝突... 21

2、關於錯誤:非靜態成員引用必須與特定物件相對... 22

3、槽訊號不響應... 22

4、無法解析的外部符號... 23

6、收集知識... 24

7、git使用... 24

 

3、Qt控制元件相關

1、ComboBox

(1)combobox設定內容

 

QStringList extractmode;

    extractmode << QApplication::translate("KxPdfExtractPageDialogWidget", "PageToPDF", 0, QApplication::UnicodeUTF8)

                << QApplication::translate("KxPdfExtractPageDialogWidget", "PerPageToPDF", 0, QApplication::UnicodeUTF8);

    m_ui->ExtractMode_comboBox->addItems(extractmode);

 

(2)讀取選取值

ui->comBox->insertItem(1,"abc","apple");

ui->comBox->currentIndex(); //1

ui->comBox->currentText(); //abc

ui->comBox->currentData(); //apple

    //可以動態取值

connect(ui->comBox,SIGNAL(currentIndexChanged(int)),this, SLOT(slotLoadList(int)));

 

 

(3)值發生變化

connect(comboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(comboBoxValueChanged())); 

 

activated與currentIndexChanged之間有細微的差別:

訊號activated:只要單擊下拉框,即使所選內容前後沒有變化也會觸發此訊號;

訊號currentIndexChanged 是在單擊下拉框且當所選內容發生變化時才會觸發此訊號。

 

(4)設定屬性

m_ui->FilePath->setStyleSheet("background:transparent;border-top-width:0; border-right-width:0; border-bottom-width:2; border-left-width:0; border-style:outset");

 

文字方向和水平下拉框巢狀到qtreewidget裡面:

可以用這個函式
void QTreeWidget::setItemWidget(QTreeWidgetItem * item, int column, QWidget * widget)

 

 

 

 

2、QPushButton

(1)button設定懸停提示

m_ui->TipIconbtn->setToolTip(QApplication::translate("KxPdfExtractPageDialogWidget", "input 1-10,means extract page 1 to 10\ninput 1/6, means extract page 1 and 6", 0, QApplication::UnicodeUTF8));

 

(2)button提升

 

 

3、QMessageBox

QMessageBox::information(this

              ,QApplication::translate("KxPdfExtractPageDialogWidget", "test", 0, QApplication::UnicodeUTF8)

              ,QApplication::translate("KxPdfExtractPageDialogWidget", "test", 0, QApplication::UnicodeUTF8)

              ,QMessageBox::Ok

              ,NULL);

 

4、QLabel顯示檔案路徑過長

QLabel顯示路徑過長時,設定路徑顯示兩端,中間以”...”顯示。

QFontMetrics fontWidth(m_ui->FilePath->font()); 

int width = fontWidth.width(m_ui->FilePath->text()); 

if(width >= m_ui->FilePath->width())

{

   m_ui->FilePath->text() = fontWidth.elidedText(m_ui->FilePath->text(), Qt::ElideMiddle, m_ui->FilePath->width());

}

 

5、選中使邊框變色--Qt::FocusPolicy

想在qt中實現的效果:

    一個QWidget視窗中間,有多個子視窗,選中每個視窗,每個視窗邊框變色,代表選中該子視窗。

setFocusPolicy(Qt::NoFocus);     //不接受焦點

 

6、QTimer::singleShot

QTimer::singleShot(0, this, SLOT(delayRefreshViewState()));

QTimer::singleShot (10, this,SLOT(eventOperation()));

       單singleShot,表示它只會觸發一次,發出一次訊號,然後來執行槽函式。如果把槽函式設定成eventOperation(),那麼當定時器到達時候,就會執行這個函式,在這個函式中定時器又會再次發出訊號,然後執行槽函式eventOperation,這樣迴圈往復的,所以這是一個每隔10毫秒就執行一次的迴圈。一般我們會線上程定時重新整理的操作裡面使用這個函式。

 

 

7、Qt樣式設定

(1)QDialog或者QWidget

QWidget

{

font: 12px "Microsoft YaHei UI";

background-color: white;

border: 1px solid #CCCCCC;

}

 

(2)滾動條QScrollBar

QScrollBar::handle:vertical{width:10px;background:lightgray ;border-radius:5px;min-height:20px;}

QScrollBar::handle:vertical:hover{width:10px;background:gray;border-radius:5px;min-height:20px;}

QScrollBar::add-line:vertical{height:0px;width:0px;subcontrol-position:bottom;}

QScrollBar::sub-line:vertical{height:0px;width:0px;subcontrol-position:top;}

 

其中:add-line為滾動條下面箭頭,sub-line為滾動條上面箭頭

(3)QLabel

QLabel

{

color: #808080;

}

 

(4)QTextEdit

QTextEdit

{

color: #424242;

border-width:0px;

padding-left:9px;

padding-right:1px;

padding-top:4px;

padding-bottom:8px;

border:none;

selection-background-color: #0078D7;   //文字選中背景色

selection-color: #FFFFFF;              //選中文字的顏色(前景色)

}

也可以用QPalette實現

(5)QPushButton或QToolButton

QPushButton{

border-style:solid;

border-width:0px;

font-size:14px;

padding-right:4px;

color:#424242;

}

 

QPushButton:hover{

background-color: #f2f2f2;

border-style:solid;

border-left-width:0px;

padding-right:4px;

}

 

QPushButton:checked{

background-color: #ffffff;

border-style:solid;

border-color: #e35353;

border-left-width:4px;

padding-right:8px;

}

 

m_retractbtn->setStyleSheet(" QToolButton{border-image: url(:/icons/pdf/DocExcerpt/p-retractleft-normal.png);}\

                              QToolButton:hover{border-image: url(:/icons/pdf/DocExcerpt/p-retractleft-hover.png);}\

                              QToolButton:pressed{border-image: url(:/icons/pdf/DocExcerpt/p-retractleft-normal.png);}");

 

(6)QComboBox

QComboBox {

background-color:#ffffff;

border: 1px solid #d6d6d6;

padding: 1px 4px 1px 4px;

font-size:14px;

color:#424242;

min-width:100px;

}

 

QComboBox:on {

padding-left: 4px;

}

 

QComboBox::drop-down {

subcontrol-origin: padding;

subcontrol-position: top right;

width: 11px;

border: none;

}

 

QComboBox::drop-down:hover {

background-color:#fae1e4;

}

 

QComboBox::drop-down:checked {

background-color:#f2bcc2;

}

 

QComboBox::down-arrow {

image: url(:/icons/16x16/p-setting-combo-down-arrow.png);

}

 

QComboBox QAbstractItemView {

border: 1px solid #d6d6d6;

}

 

QComboBox QAbstractItemView::item{

height:26px;

}

 

QComboBox QAbstractItemView::item:selected{

border:0px solid #ffffff;

background-color: #f2bcc2;

}

 

QComboBox QScrollBar::vertical {

border: none;

width: 7px;

background-color:#ffffff

}

 

QComboBox QScrollBar::handle:vertical {

background: #e6e6e6;

width: 7px;

border-radius: 3px;

border: 1px solid #e6e6e6;

}

 

(7)QCheckBox

/************* QCheckBox Style *****************/

QCheckBox

{

color:#424242;

font-size:14px;

spacing: 6px;

}

 

QCheckBox::indicator {

width: 11px;

height: 11px;

border: 1px solid #999999;

}

 

QCheckBox::indicator:hover {

background-color:#d6d6d6;

}

 

QCheckBox::indicator:checked {

image: url(:/icons/11x11/p-checkbox-selected.png);

}

 

(8)QRadioButton

/****************** QRadioButton Style********************/

QRadioButton

{

padding-left:10px;

color:#424242;

font-size:14px;

spacing: 6px;

}

 

QRadioButton::indicator {

width: 10px;

height: 10px;

border:1px solid #999999;

border-radius: 6px;

}

 

QRadioButton::indicator:hover {

background-color:#d6d6d6;

}

 

QRadioButton::indicator:checked {

image: url(:/icons/6x6/p-radiobox-selected.png);

}

 

(9)QSpinBox

/*************** QSpinBox Style ******************/

QSpinBox {

padding-left: 4px; /* make room for the arrows */

border: 1px solid #d6d6d6;

}

 

QSpinBox:disabled {

font-color:#d6d6d6;

}

 

QSpinBox::up-button {

subcontrol-origin: border;

subcontrol-position: top right;

width: 15px;

background-color:#ffffff;

border: 1px solid #d6d6d6;

}

 

QSpinBox::up-button:hover {

background-color:#f0f0f0;

}

 

QSpinBox::up-button:pressed {

background-color:#d9d9d9;

}

 

QSpinBox::up-arrow {

image: url(:/icons/6x6/p-up-arrow.png);

}

 

QSpinBox::up-arrow:disabled {

image: url(:/icons/6x6/p-up-arrow-disable.png);

}

 

QSpinBox::down-button {

subcontrol-origin: border;

subcontrol-position: bottom right;

width: 15px;

background-color:#ffffff;

border: 1px solid #d6d6d6;

border-top-width: 0;

}

 

QSpinBox::down-button:hover {

background-color:#f0f0f0;

}

 

QSpinBox::down-button:pressed {

background-color:#d9d9d9;

}

 

QSpinBox::down-arrow {

image: url(:/icons/6x6/p-down-arrow.png);

}

 

QSpinBox::down-arrow:disabled {

image: url(:/icons/6x6/p-down-arrow-disable.png);

}

 

(10)QTreeView

m_catalogTree->setStyleSheet("QTreeView::branch:has-children:!has-siblings:closed,\

      QTreeView::branch:closed:has-children:has-siblings{border-image: none; image: url(:/icons/pdf/DocExcerpt/p-retract.png);}\

      QTreeView::branch:open:has-children:!has-siblings,\

                                      QTreeView::branch:open:has-children:has-siblings{border-image: none; image: url(:/icons/pdf/DocExcerpt/p-spread.png);}\

QTreeView::item:hover{background-color: rgb(204,204,204);}\

QTreeView::item:selected{background-color: rgb(191,191,191);}\

QTreeView{background-color: rgb(221, 221, 221);\nborder:none;padding-top:18px;}");

 

Qt中設定:

QTreeView::branch:has-children:!has-siblings:closed

{border-image: none; image: url(:/icons/pdf/DocExcerpt/p-retract.png);}

QTreeView::branch:closed:has-children:has-siblings{border-image: none; image: url(:/icons/pdf/DocExcerpt/p-retract.png);}

QTreeView::branch:open:has-children:!has-siblings

{border-image: none; image: url(:/icons/pdf/DocExcerpt/p-spread.png);}

QTreeView::branch:open:has-children:has-siblings{border-image: none; image: url(:/icons/pdf/DocExcerpt/p-spread.png);}

QTreeView::item:hover{background-color: rgb(204,204,204);}

QTreeView::item:selected{background-color: rgb(191,191,191);}

QTreeView{background-color: rgb(221, 221, 221);\nborder:none; padding-top:18px;}

 

8、QToolTip

       QString tip = “Tip”;

       QPoint point(630, 550);

       QToolTip::showText(point, tip);

9、QTreeView目錄按建立時間排序

QTreeWidget{ outline:0px; }設定選中項無虛線邊框

 

 

 

4、C++處理

1、正則表示式

^(([1-9]+[0-9]*)+[,,-]?)*((([1-9]+[0-9]*)+)$)

目的:匹配1,2-5,6,9-10

說明:[1-9]+       1~9出現至少一次

      [0-9]*       0~9出現任意次

  [,,-]?         ,,-出現0次或者1次

      ^(([1-9]+[0-9]*)+[,,-]?)       在開頭匹配(1,2,3-5)這種格式

  (([1-9]+[0-9]*)+)$            在結尾匹配([1-9]+[0-9]*)+

 

輸入限制為數字,字母和漢字:

    BSTR splitStr = L"^[A-Za-z0-9\u4e00-\u9fa5]+$";

    QString pattern(QString::fromStdWString(splitStr));

    QRegExp rx(pattern);

    bool match = rx.exactMatch(newName);

 

 

規則

表示式

作用

{n}

表示式重複n次,比如:"/w{2}" 相當於 "/w/w""a{5}" 相當於 "aaaaa"

{m,n}

表示式至少重複m次,最多重複n次,比如:"ba{1,3}"可以匹配 "ba""baa""baaa"

{m,}

表示式至少重複m次,比如:"/w/d{2,}"可以匹配 "a12","_456","M12344"...

?

匹配表示式0次或者1次,相當於 {0,1},比如:"a[cd]?"可以匹配 "a","ac","ad"

+

表示式至少出現1次,相當於 {1,},比如:"a+b"可以匹配 "ab","aab","aaab"...

*

表示式不出現或出現任意次,相當於 {0,},比如:"/^*b"可以匹配 "b","^^^b"...

 

 

 

2、格式轉化

(1)char*轉QString

char* pages;

QString inputpage = QString(QLatin1String(pages));

 

(2)QString轉char*

QString str;

char* ch;

QByteArray ba = str.toLatin1(); // must

ch=ba.data();

 

(3)QString轉換string

string dome1;  

QString dome2;  

dome1 = dome2.toStdstring();  

(4)string轉化為QString

string dome1;  

QString dome2;  

dome2 = QString::fromestdstring(dome1);  

 

(5)string轉化char*

string dome1;  

char dome2[20];  

dome = dome1.c_str();  

(6)char*轉化為string

char dome1[20] = "hello world!";  

string dome2(dome1); 

 

(7)int/float/double轉QString

long a = 63;  

QString s = QString::number(a, 10);             // s == "63"  

QString t = QString::number(a, 16).toUpper();     // t == "3F"  

 

(8)QString轉int/float/double

QString str="123.45";  

double val=str.toDouble(); 

float val=str.toFloat();   

int val=str1.toInt();   

 

(9)QString轉wstring(QString 轉 BSTR)

QString qstr;

BSTR bstr = SysAllocStringLen((OLECHAR*)qstr.unicode(), qstr.length());

BSTR bstr = SysAllocString((OLECHAR*)qstr.unicode());

 

(10)BSTR轉QString

BSTR bstrName;

           spDoc->GetName(&bstrName);

           QString qStr = QString::fromStdWString(bstrName);

 

 

3、常用巨集

1、Q_DECL_EXPORT巨集

Q_DECL_EXPORT巨集主要為了匯出這個類,生成.dll的同時生成.lib檔案。提供給外部介面供其他類使用。

 

4、c++謂詞函式和仿函式

     謂詞函式就是一個判斷式,說白了就是一個返回bool值的函式或者仿函式。(這裡說明了謂詞可以有2種形式)幾元就是函式有幾個引數,至於定義和使用,函式定義和一般的函式定義一樣仿函式就是寫個類,然後過載operator()使用就是在那些以這種需要返回bool值的函式作引數的函式裡用了。謂詞函式用於泛型演算法中,用於做某些檢測。

 

5、C++ std::tr1::shared_ptr

shared_ptr採用引用計數,多個指標可以指向同一個物件;auto_ptr就不能,只能執行一個指標指向一個物件:如果要指標賦值,那麼原來的指標要放棄對該物件的所有權。

shared_ptr在最新的c++11中,已經被列入了標準指標,而auto_ptr則出局了。shared_ptr採用RAII技術,是防止記憶體洩露的神器。

 

6、QVariant

Q_DECLARE_METATYPE(MyStruct) 可以向QVariant中新增自定義型別

 

7、QDateTime與QString

QDateTime time = QDateTime::currentDateTime();

QString strBuffer = time.toString("yyyy-MM-dd hh:mm:ss");

 

8、動畫

void KxPdfExcerptCatalogDlg::activeAnimation()

{

    QPushButton *button = new QPushButton();

    button->setStyleSheet("QPushButton{border-image: url(:/icons/pdf/DocExcerpt/p-retractleft-normal.png);background-color:#FF0000;}");

    button->setVisible(true);

 

    QStateMachine *machine = new QStateMachine;

    QState *state1 = new QState(machine);

    QPoint startpoint(cursor().pos());

    state1->assignProperty(button, "geometry", QRect(startpoint.x(), startpoint.y(), 40, 40));

    machine->setInitialState(state1);

    QState *state2 = new QState(machine);

    state2->assignProperty(button,"geometry", QRect(70, -68, 40, 40));

    QSignalTransition *transition1 = state1->addTransition(button, SIGNAL(clicked()),state2);

    QPropertyAnimation animation(button, "geometry");

    animation.setEasingCurve(QEasingCurve::OutBounce);

    transition1->addAnimation(new QPropertyAnimation(button, "geometry"));

    machine->start();

}

 

9、QTextEdit

(1)限制輸入字數

connect(ui.textEdit, SIGNAL(textChanged()), this, SLOT(onRestrainItemInput()));

}

void QtCatalog::onRestrainItemInput()

{

    QString textContent = ui.textEdit->toPlainText();

    int length = textContent.count();

    int maxLength = 10; // 最大字元數

    if(length > maxLength)

    {

       int position = ui.textEdit->textCursor().position();

       QTextCursor textCursor = ui.textEdit->textCursor();

       textContent.remove(position - (length - maxLength), length - maxLength);

       ui.textEdit->setText(textContent);

       textCursor.setPosition(position - (length - maxLength));

       ui.textEdit->setTextCursor(textCursor);

    }

}

 

(2)QLineEdit限制最大輸入字數

Lineedit-> setMaxLength(10);

 

 

 

10、QTreeWidget

(1)重新命名時限制輸入字數

m_catalogTree->editItem(m_catalogTree->currentItem());

QWidget * editItem = m_catalogTree->indexWidget(index);

m_itemEdit = static_cast<QLineEdit*>( editItem);

m_itemEdit->setMaxLength(10);

 

(2)新建樹節點的命名限制

QModelIndex parentIndex = m_catalogTree->currentIndex();

int childcount = m_pAddParentItem->childCount();

QModelIndex index = m_catalogTree->model()->index(childcount-1,0,parentIndex);

m_catalogTree->editItem(pAddItem);

QWidget *editItem = m_catalogTree->indexWidget(index);

m_itemEdit = static_cast<QLineEdit*>(editItem);

m_itemEdit->setMaxLength(10);

 

注:新建的節點在樹節點的最後,所以index用childcount-1。

 

(3)設定不可雙擊修改

m_catalogTree->setEditTriggers(QAbstractItemView::NoEditTriggers);

 

(4)Qt designer樣式

 

 

 

5、Bug記

1、0xC0000005: 讀取位置 0xcccccccc 時發生訪問衝突

解決方法:debug下,未初始化的指標的地址為0xcccccccc

 

2、關於錯誤:非靜態成員引用必須與特定物件相對

類的成員有兩種:靜態成員和例項成員(包括例項和函式)。例項成員的儲存空間屬於具體的例項,不同例項(物件)的同名成員擁有不同的儲存空間;靜態成員的儲存空間是固定的,與具體的例項(物件)無關,被該類的所有例項共享。

訪問靜態成員可以用ClassName::MemberName,也可以用ClassName.MemberNme,但最好用前者,因為很容易就可以判定成員是靜態成員。

訪問例項成員只能用ClassName.MemberName,不能用ClassName::MemberName.

 

3、槽訊號不響應

(1)沒有加Q_OBJECT……

(2)訊號作用域

(3)moc沒有更新,重新生成專案

(4)陰溝翻船之槽函式沒有寫到public slots:下面

 

 

4、無法解析的外部符號

1、Q_OBJECT沒加會導致訊號和槽的無法解析的外部符號,或者widget裡用到signal 和slot是後加的:

若.h檔案中定義類時沒有新增Q_OBJECT巨集以及訊號函式、槽函式,VS編譯命令中就沒有moc命令,就不會呼叫Qt的moc工具以生成moc_*.cpp檔案;並且即使添加了Q_OBJECT巨集之後,VS也不會自動新增moc命令,因而不會生成moc檔案。

VS在LINK時,找不到moc檔案,就出現了error LNK2001的錯誤。

解決:檢查CMakeLists.txt是不是添加了檔案。添加了會自動moc

 

5、去除多餘連字元

QMimeData *pMimeData = pDoc->GetSelection()->GetRangeText();

if (pMimeData)

     {

          QStringList selectionList;

         selectionList.append(pMimeData->text());

         QStringList List;

         QString sz;

         for each (auto& var in selectionList)

              {

              QStringList slist = var.split(QRegExp("[\r\n]"), QString::SkipEmptyParts);

              if (slist.isEmpty())

              break;

              sz = QString::fromLocal8Bit("");

              for each (auto& v in slist)

                   {

                       sz = sz + QString::fromLocal8Bit(" ") + v;

                   }

                   sz.remove('_');

                   List << sz;

         }                     

         QString text = List.join("");  // QStringList轉QString

}

 

 

 

 

6、收集知識

1、亞畫素渲染

drawText的時候,對font設定下面的引數,可以增加一點清晰度

font.setStyleStrategy(QFont::PreferAntialias);

 

2、系統Icon

 

7、git使用

git blame kcloudfilestateitem.cpp

檢視檔案是誰修改的,會顯示每一行的作者

輸出結果顯示順序依次為: 版本號、作者、時間、行號 、程式碼行

git blame kcloudfilestateitem.cpp -L 200,212

檢視檔案200-212行是誰修改的

git show commitID

可以顯示該作者在某個版本的commit上還有什麼程式碼提交

 

 

 

 

 

 

新增toast:

ks_stdptr<IKPdfView> pPdfView = m_pApp->GetActiveView();

              if (pPdfView )

              {

                     pPdfView->ShowTip("Tips", "EscStopScrawl", 3000, false);

              }

 

3、command的呼叫:

 

 

4、kxApp

標頭檔案:#include <kxshare/kxapplication.h>

錯誤:不允許指標指向不完整的類型別

 

ks_castptr<IKPdfApplication> pdfApp = kxApp->coreApplication();

 

5、判斷首頁