Text Edit(多行輸入框)
QTextEdit
?表示多行輸入框,也是一個富文本 & markdown 編輯器,能在內容超出范圍時自動提供滾動條。
QTextEdit:不僅僅能表示純文本,還可以表示 htnl 和 markdown
QPlainTextEdit:只能表示純文本
核心屬性
屬性 | 說明 |
---|---|
markdown | 支持 Markdown 格式并自動渲染為 HTML。 |
html | 支持大部分 HTML 標簽(如?img 、table )。 |
placeHolderText | 輸入框為空時的提示文本。 |
readOnly | 是否只讀。 |
undoRedoEnable | 啟用撤銷/重做(Ctrl+Z ?撤銷,Ctrl+Y ?重做)。 |
autoFormatting | 開啟自動格式化。 |
tabStopWidth | 縮進占用的空格數。 |
overwriteMode | 是否開啟覆蓋寫模式。(光標接下來是否插入或者覆蓋?) |
acceptRichText | 是否接收富文本內容 --- html 標簽。 |
verticalScrollBarPolicy | 垂直滾動條策略: ?? Qt::ScrollBarAsNeeded (默認)根據內容自動決定是否需要滾動條?? Qt::ScrollBarAlwaysOff 總是關閉滾動條 ?? Qt::ScrollBarAlwaysOn 總是顯示滾動條 |
horizontalScrollBarPolicy | 水平滾動條策略: ?? Qt::ScrollBarAsNeeded (默認)根據內容自動決定是否需要滾動條?? Qt::ScrollBarAlwaysOff?總是關閉滾動條 ?? Qt::ScrollBarAlwaysOn?總是顯示滾動條 |
核心信號
textChanged()
:文本內容改變時觸發。selectionChanged()
:選中范圍改變時觸發。cursorPositionChanged()
:光標移動時觸發。undoAvailable(bool)
:可撤銷時觸發。redoAvailable(bool)
:可重做時觸發。copyAvailable(bool)
:文本選中/取消選中時觸發。
代碼示例:獲取輸入框內容
1.界面:創建一個多行輸入框和一個?label
。
2.槽函數:給多?輸?框添加 slot 函數. 處理 textChanged 信號
- 通過 toPlainText ?法獲取到內部的?本。 ?
- 類似的,QTextEdit 還提供了 toMarkdown 和 toHtml。根據需要我們調整不同的獲取?式。
void Widget::on_textEdit_textChanged()
{// 獲取到多行輸入框中的內容const QString& text = ui->textEdit->toPlainText();// 和之前的Text()不太一樣!ui->label->setText(text);
}
3.效果:輸入框內容變化時,label
?同步更新。
代碼示例:驗證信號
1.創建多行輸入框
2.給輸入框添加以下幾個 slot 函數
QTextEdit 中包含了一個 QTextCursor 對象,通過這個對象可以獲取到當前光標位置和選中的內容
void Widget::on_textEdit_textChanged()
{qDebug()<<"textChanged: "<<ui->textEdit->toPlainText();
}void Widget::on_textEdit_selectionChanged()
{QTextCursor cursor = ui->textEdit->textCursor();qDebug()<<"selectionChanged: "<<cursor.selectedText();
}void Widget::on_textEdit_cursorPositionChanged()
{QTextCursor cursor = ui->textEdit->textCursor();qDebug()<<"cursorPositionChanged: "<<cursor.position();
}void Widget::on_textEdit_undoAvailable(bool b)
{qDebug()<<"undoAvailable: "<<b;
}void Widget::on_textEdit_redoAvailable(bool b)
{qDebug()<<"redoAvailable: "<<b;
}void Widget::on_textEdit_copyAvailable(bool b)
{qDebug()<<"copyAvailable: "<<b;
}
3.執行程序,觀察結果
可以看到:
編寫內容時,
textChanged
?和?cursorPositionChanged
?會觸發選中一段文本時,
cursorPositionChanged
、selectionChanged
、copyAvailable
?會觸發按下?
Ctrl + Z
?時,textChanged
、undoAvailable
、redoAvailable
、cursorPositionChanged
?會觸發按下?
Ctrl + Y
?時,textChanged
、undoAvailable
、redoAvailable
、cursorPositionChanged
?會觸發
Combo Box(組合框/下拉框)
QComboBox
?表示下拉框。
核心屬性
屬性 | 說明 |
---|---|
currentText | 當前選中文本。 |
currentIndex | 當前選中下標(從 0 開始,未選中時為 -1)。 |
editable | 是否允許編輯(設為?true ?時行為類似?QLineEdit )。 |
iconSize | 下拉圖標大小。(下拉點擊的圖標(倒三角)) |
maxCount | 最大條目數。 |
核心方法
方法 | 說明 |
---|---|
addlitem(const QString&) | 添加一個條目 |
currentindex() | 獲取當前條目的下標,從0開始計算;如果當前沒有條目被選中,值為-1 |
currentText() | 獲取當前條目的文本內容 |
核心信號
activated(int)
:用戶選擇選項時觸發(這時候相當于用戶點開下拉框,并且鼠標滑過某個選項,此時還沒有確認做出選擇)。currentIndexChanged(int)/currentIndexChanged(const QString& text)
:選項改變時觸發(此時用戶已經明確的選擇一個選項,用戶操作或者通過程序操作都會出發這個信號)。editTextChanged(const QString&)
:可編輯時文本變化觸發(editable 為 true 時有效)。
代碼示例:麥當勞點餐
界面:三個下拉框(漢堡、小食、飲料)和一個按鈕。
初始化:
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);ui->comboBox->addItem("麥辣雞腿堡");ui->comboBox->addItem("巨無霸");ui->comboBox->addItem("培根蔬菜雙層牛堡");ui->comboBox_2->addItem("中薯條");ui->comboBox_2->addItem("麥樂雞塊");ui->comboBox_2->addItem("麥辣雞翅");ui->comboBox_3->addItem("可樂");ui->comboBox_3->addItem("雪碧"); }
按鈕槽函數:
void Widget::on_pushButton_clicked() {qDebug()<<ui->comboBox->currentText()<<", "<<ui->comboBox_2->currentText()<<", "<<ui->comboBox_3->currentText(); }
執?程序, 可以看到, 在點擊確定按鈕時, 就能獲取到當前下拉框中選中的內容:
我們也可以通過ui界面進行編輯:
代碼示例:從文件加載下拉框的選項
很多時候下拉框的選項并非是固定的,而是通過讀取文件/讀取網絡獲取得到的!(選課的時候,加載出所可選的選項!每年都不同)
1.在界面上創建一個下拉框
2.創建文件?d:/for_test/config.txt,編寫選項,每個選項占一行
:
火靈兒 - 出自《完美世界》。
李慕婉 - 出自《仙逆》。
陸雪琪 - 出自《誅仙》。
焰靈姬 - 出自《天行九歌》。
赤練 - 出自《秦時明月》。
少司命 - 出自《秦時明月》。
仙清兒 - 出自動漫《牧神記》。
靈毓秀 - 出自《牧神記》動畫。
云霄 - 出自動漫《師兄啊師兄》。
唐雅 - 出自動漫《斗羅大陸2絕世唐門》。
3.修改 widget.cpp,讀取文件:
- 使? ifstream 打開?件
- 使? getline 讀取每??
- 使? QString::fromStdString 把 std::string 轉成 QString
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 需要讀取文件內容,把文件中的每一行讀取出來,作為一個 Combobox 的選項// 讀寫IO --- I: 讀(輸入) --- 參考點是CPU!!!std::ifstream file("D:/for_test/config.txt");if(!file.is_open()){qDebug()<<"文件打開失敗";return;}// 按行讀取文本內容 --- getline 函數來完成!!!std::string line;while(std::getline(file, line)){// 取到每一行內容, 設置到下拉框中ui->comboBox->addItem(QString::fromStdString(line));}file.close();;// 關閉文件是很關鍵的,否則會造成文件資源泄漏!
}
4.執?程序, 可以看到?件內容已經被加載到下拉框中:
🎉 Qt 中也提供了 QFile 實現讀寫?件的功能。當然使? C++ 標準庫的 std::fstream 也是完全可以的。之所以存在兩套,是因為 Qt 誕?較早 (1991 年左右),此時 C++ 還沒有完成 "標準化" 的工作,C++ 標準庫這樣的概念?然也沒有誕?。因此 Qt 就??打造了?套庫,實現了字符串,容器,?件操作,多線程,?絡操作,定時器,正則表達式等內容。
(由于 C++ 標準委員會的不作為, ?今仍然有些 Qt 提供的功能, 是標準庫不具備的)
Spin Box(微調框)
使用 QSpinBox 或者 QDoubleSpinBox 來創建“微調框”,它是帶有按鈕的輸入框,可以用來輸入整數/浮點數。通過點擊按鈕來修改數值大小。 由于 SpinBox 和 QDoubleSpinBox 用法基本相同,就只介紹 SpinBox 的使用了。
Spin 英文原意為“旋轉”,此處引申成“微調”。 事實上很多術語在翻譯的時候,不一定非要按照原始的翻譯來表示,更追求的是“信達雅”。 舉個例子,地鐵上的 “Priority Seat” 會翻譯成 “愛心專座”,而不是 “優先座位”。
核心屬性
屬性 | 說明 |
---|---|
value | 存儲的數值。 |
singleStep | 每次調整的“步長”。按下一次按鈕數據變化多少。 |
displayInteger | 數字的進制。例如 displayInteger 設為 10, 則是按照 10 進制表示。設為 2 進制表示。 |
minimum | 最小值 |
maximum | 最大值 |
suffix | 后綴 |
prefix | 前綴 |
wrapping | 是否允許換行 |
frame | 是否帶邊框 |
alignment | 文字對齊方式 |
readOnly | 是否允許修改 |
buttonSymbol | 按鈕上的圖標。 |
- UpDownArrows 上下箭頭形式 | |
- PlusMinus 加減號形式 | |
- NoButtons 沒有按鈕 | |
accelerated (加速的) | 按下按鈕時是否為快速調整模式。 |
correctionMode | 輸入有誤時如何修正。 |
- QAbstractSpinBox::CorrectToPreviousValue : 如果用戶輸入了一個無效的值(例如,在只能顯示正整數的SpinBox中輸入了負數),那么SpinBox會恢復為上一個有效值。例如,如果SpinBox的初始值是1,用戶輸入了-1(無效),然后SpinBox會恢復為1。 | |
- QAbstractSpinBox::CorrectToNearestValue : 如果用戶輸入了一個無效的值,SpinBox會恢復為最接近的有效值。例如,如果SpinBox的初始值是1,用戶輸入了-1(無效),那么SpinBox會恢復為0。 | |
keyboardTracking | 是否開啟鍵盤跟蹤。 |
設為 true, 每次在輸入框輸入一個數字, 都會觸發 valueChanged() 和 textChanged() 信號。 | |
設為 false, 只有在最終按下 enter 或 者輸入框失去焦點, 才會觸發 valueChanged() 和 textChanged() 信號。 |
核心信號
信號 | 說明 |
---|---|
textChanged(QString) | 微調框的文本發生改變時會觸發。參數 QString 帶有前綴和后綴。 |
valueChanged(int) | 微調框的文本發生改變時會觸發。參數 int, 表示當前的數值。 |
代碼示例:調整麥當勞購物車中的份數。
在界面上創建下列內容
三個下拉框:objectName 為 comboBox 到 spinBox_3
三個微調框:objectName 為 spinBox 到 spinBox_3
一個按鈕:objectName 為 pushButton
編寫代碼,修改 widget.cpp, 給下拉框設置初始值。
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 初始化下拉框菜單ui->comboBox->addItem("麥辣雞腿堡");ui->comboBox->addItem("巨無霸");ui->comboBox->addItem("培根蔬菜雙層牛堡");ui->comboBox_2->addItem("中薯條");ui->comboBox_2->addItem("麥樂雞塊");ui->comboBox_2->addItem("麥辣雞翅");ui->comboBox_3->addItem("可樂");ui->comboBox_3->addItem("雪碧");// 初始化微調框// 默認一份ui->spinBox->setValue(1);// 針對 QSpinBox 的范圍進行約束ui->spinBox->setRange(1, 5);ui->spinBox_2->setValue(1);ui->spinBox_2->setRange(1, 5);ui->spinBox_3->setValue(1);ui->spinBox_3->setRange(1, 5);
}
編寫代碼,給按鈕添加 slot 函數
void Widget::on_pushButton_clicked()
{qDebug() << "當前下單的內容:"<< ui->comboBox->currentText() << ":" << ui->spinBox->value()<< ui->comboBox_2->currentText() << ":" << ui->spinBox_2->value()<< ui->comboBox_3->currentText() << ":" << ui->spinBox_3->value();
}
執行程序, 可以看到當用戶選擇不同的內容時, 點擊按鈕就能獲取到對應的結果. 同時我們也無法輸入一些超出范圍的非法值。