C++/Qt的知識點
(這是工作中常用到的一些東西,收集到了一起,用的多了就慢慢記住了一些,對於不熟練的參考價值有一些。有些莫名其妙的東西是記錄的自己工作的,可以無視。)
目錄:
(7)int/float/double轉QString. 16
(8)QString轉int/float/double. 16
(9)QString轉wstring(QString 轉 BSTR)... 16
5、C++ std::tr1::shared_ptr. 18
1、0xC0000005: 讀取位置 0xcccccccc 時發生訪問衝突... 21
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、判斷首頁